UIWebView和unload事件

lvi*_*ani 4 objective-c uiwebview

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

window.addEventListener("unload", function(){
  // do something here;
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

我需要和Safari一样,那就是在离开页面时也要执行的卸载方法.

Lui*_*ien 5

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

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

希望这可以帮助!


lvi*_*ani 2

感谢上面的 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;
}
Run Code Online (Sandbox Code Playgroud)