5

我正在将本地 html 内容加载到 UIWebView 中。加载内容的 javascript 代码包括此事件侦听器:

window.addEventListener("unload", function(){
  // do something here;
});

该 javascript 代码仅在(之前) UIWebView 组件被释放时(例如,当导航回另一个视图控制器时)执行,但在加载另一个页面时不执行。例如:

document.addEventListener("click", function(){ document.location = "www.google.com"; });
window.addEventListener("unload", function(){ alert("bye bye"); });

如果在 safari 中执行这段代码,当我点击文档时,在导航到 google.com 之前,它会显示警告框。如果我在 UIWebView 中运行相同的代码,则不会执行卸载侦听器。但是,如果我删除 UIWebView,然后执行代码。

我的需要是与 Safari 中的相同,即在离开页面时也要执行的卸载方法。

4

2 回答 2

5

过去我也遇到过 JavaScript 代码在桌面浏览器中的行为方式与在UIWebView. 老实说,我不知道为什么它没有按照您想要的方式工作,但在这里我为您提供了一个解决方法:

不要使用unloadJavaScript 中的监听器,而是尝试使用UIWebViewDelegate's method webView:shouldStartLoadWithRequest:navigationType:。每当用户请求加载新页面(或内容)时,都会调用此方法。如果您随后需要执行更多 JavaScript 代码,您可以使用UIWebView's 方法stringByEvaluatingJavaScriptFromString:

希望这可以帮助!

于 2013-07-08T23:24:31.847 回答
0

感谢上面的 LuisCien 解决方案(如果你喜欢这个解决方案,请投票给他的帖子),我设法通过从 Objective-C 端手动生成和调度卸载事件来解决这个问题。这不需要对我的客户端代码 (javascript) 进行任何修改,这些代码现在在 UIWebView 和任何其他 Web 浏览器中的行为相同。这是要添加到视图控制器的代码:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    [webView stringByEvaluatingJavaScriptFromString:@"var e=document.createEvent('Event'); e.initEvent('unload', true, true); window.dispatchEvent(e);"];
    return YES;
}
于 2013-07-10T07:31:12.087 回答