UIWebView和unload事件

时间:2013-07-08 14:45:31

标签: objective-c uiwebview

我正在将本地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一样,那就是在离开页面时也要执行的卸载方法。

2 个答案:

答案 0 :(得分:5)

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

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

希望这有帮助!

答案 1 :(得分: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;
}