webkit - 侦听器在第二页加载时失败

时间:2011-02-13 14:06:51

标签: objective-c cocoa webkit

我有一个用Objective-C编写的Mac客户端应用程序,它向用户显示一个表格中的html文档列表,当用户点击一行时,它会将选定的HTML页面加载到WebView中。

每个HTML页面都有一个“click”监听器,它调用Objective-C方法。

当应用程序运行并且用户单击第一行时,一切正常。 “click”事件被捕获,我的Objective-C方法被成功调用。

但是,当用户点击第二个(或后续)记录,然后将新的HTML页面加载到同一个WebView时,“click”上的监听器永远不会触发。

如果所选记录是第一个要加载的,它总是正常工作,所以问题不是坏的HTML文件。仅供参考,所有文件大致相同。

我在一个简单的测试应用程序中解决了这个问题。它可以在这里下载 - http://dl.dropbox.com/u/160638/Work/TCL/MapTest2.zip

注意:测试应用程序向标准日志输出一条消息,因此您需要检查Xcode或Console.app中的日志窗口,以查看Objective-C方法调用是否正常工作。顶部的按钮是成对的,首先从本地文件加载,然后从HTML页面作为字符串加载,然后从网站上拉出HTML页面。

从广泛的搜索中我猜测当我将第二个HTML页面加载到WebView中时,上一页以某种方式被保留,并且“click”上的两个侦听器以某种方式发生冲突?这可能吗?

任何人都可以推荐一种加载HTML页面的方法,以便后续加载可以工作吗?有没有办法确保在加载第二页之前,先前加载到WebView中的所有页面都已完全卸载?

您可以提出任何建议。

此致

达伦。

2 个答案:

答案 0 :(得分:3)

问题是windowScriptObject对每个HTML文档都是唯一的。你需要执行

[[[self mapView] windowScriptObject] setValue:self forKey:@"AppDelegate"]; 

每次加载html。另请注意,调用windowScriptObject后,loadHTMLString:baseURL:无法立即使用。它只在HTML准备好时才会完成。所以,做

[[[self mapView] mainFrame] loadHTMLString:htmlString baseURL:nil]; 
[[[self mapView] windowScriptObject] setValue:self forKey:@"AppDelegate"]; 

无法解决问题。相反,您应该在加载完成后在视图的某个委托方法中设置windowScriptObject

现在,给我一部分薪水。 (开玩笑:p)

答案 1 :(得分:1)

感谢Yuji的正确答案。

委托方法是:

 -webView:didClearWindowObject:forFrame:

例如:

 - (void) webView:(WebView *)sender  
          didClearWindowObject:(WebScriptObject *)windowObject  
          forFrame:(WebFrame *)frame  
 {  
           [windowObject setValue:self forKey:@"AppDelegate"];  
 }

这个例子在其他地方的另一张海报上给了我好心,所以也感谢他。