在可可中加载webview后,div onclick或oncontext只运行一次

Hir*_*dia 17 html javascript cocoa objective-c

目前我正在研究mac OS X cocoa应用程序.我正在使用Web视图制作一个应用程序.在我的演示应用程序中,我设置了两个按钮和一个webview.两个按钮都加载相同的文件 我第一次点击div id,但在第二次加载web视图后,我没有得到div id.我使用web-kit作为接口方法从java脚本调用obj-c方法.我已经应用了很多解决方案,但我无法跟踪它的问题.请尽快给我解决方案.这是屏幕截图,第一次在控制台中显示单击的div id

我使用下面的代码进行Web视图实现

<body>
    <div class="xxx">
        <table class="xxx">
            <tr>
                <td class="xxx"><img alt="userimg" src="sdfasdf.jpg" /></td>
                <td>
                    <div class="xxx">
                        <div class="xxx">
                            <div class="msg" id="1" onClick="window.objcConnector.MsgDivClicked_(this.id)">Hiiiiiiiii</div>
                        </div>
                        <div class="xxx">
                            <div class="xxx" id="2" onClick="window.objcConnector.MsgDivClicked_(this.id)">Heyy</div>
                        </div>
                        <div class="xxx">
                            <div class="xxx" id="3" onClick="window.objcConnector.MsgDivClicked_(this.id)">Hello</div>
                        </div>

                        <div class="xxx">Sat,7 Nov.7:38 PM</div>
                    </div>
Run Code Online (Sandbox Code Playgroud)

Objective-C的

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
{
if (aSelector == @selector(MsgDivClicked:)) return NO;

return YES;}



-(void)MsgDivClicked:(id)object
{
NSLog(@"%@ Div Clicked",object);
}

Run Code Online (Sandbox Code Playgroud)

Jam*_*ino 1

javascript 中范围非常棘手,尤其是在绑定 DOM 事件时。onClick我们可以使用自然的单击事件来获取您想要的数据,而不是在函数中显式传递参数:

你有:

<div class="msg" id="1" onClick="window.objcConnector.MsgDivClicked_(this.id)">
Run Code Online (Sandbox Code Playgroud)

this如果我们删除该参数,函数调用将具有单击元素的范围。我们还可以替换一个参数e,即单击的 MouseEvent。然后我们可以通过 获取元素e.target

<div class="msg" id="1" onClick="window.objcConnector.MsgDivClicked_()">
Run Code Online (Sandbox Code Playgroud)

由于您调用的是 ObjectiveC 函数而不是 JavaScript 函数,因此我不太确定自然作用域是如何工作的。因此,让一点点 JS 来解决这个问题:

<script type="text/javascript">
function objCClickHandler (e) {
  window.objcConnector.MsgDivClicked_(this.id)
}
</script>
<div class="msg" id="1" onClick="objCClickHandler()">
Run Code Online (Sandbox Code Playgroud)

您还可以摆脱所有 onClick 处理程序,只需在脚本标记中完成这一切:

<script type="text/javascript">
Array.from(document.querySelectorAll('.msg')).map(msg => {
  msg.addEventLister('click', e => {
      window.objcConnector.MsgDivClicked_(e.target.id)
  })
}
</script>
Run Code Online (Sandbox Code Playgroud)

然后,您为其指定“msg”类的任何元素都将被连接起来,以便单击进入您的应用程序。