每次加载新页面时都在iOS webView中运行JS

时间:2013-09-05 16:15:29

标签: javascript ios html5 uiwebview uiwebviewdelegate

例如,我希望每次用户点击我的UIWebView中的新链接时运行这部分代码,

NSString* js =
@"var meta = document.createElement('meta'); "
"meta.setAttribute( 'name', 'viewport' ); "
"meta.setAttribute( 'content', 'width = device-width;initial-scale=1.0; maximum-scale=1.0' ); "
"document.getElementsByTagName('head')[0].appendChild(meta)";

[webView stringByEvaluatingJavaScriptFromString: js];

我该怎么做?我应该看哪个API? 我想在新页面中运行这个JS。我该如何确定新页面是否已满载? -

2 个答案:

答案 0 :(得分:1)

您可以检测用户点击链接的时间:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

一旦检测到他点击了某个链接,请执行你的js。

Docs中的更多内容。

答案 1 :(得分:1)

在这种情况下,有两件事可能出错: 1)您的Js抛出异常而 2)页面在之后重新加载您的Js已经运行,因此重置了脚本的效果。

根据我的经验,当Javascript似乎不在UIWebView中运行时,几乎总是Javascript抛出异常。

尝试围绕try { ... } catch { ... }中的脚本来捕获异常:

NSString* js =
@"try {"
"var meta = document.createElement('meta'); "
  // [rest of the script...]
"document.getElementsByTagName('head')[0].appendChild(meta)";
" } catch (exc) { "
" window.ERR = exc.toString(); "
" } "

现在,您可以在致电stringByEvaluatingJavaScriptFromString:后在Xcode中设置断点。如果您运行

,则可能会显示错误消息
po [webView stringByEvaluatingJavaScriptFromString:@"window.ERR"]

在调试提示中。

当您在UIWebView上试用Javascript时,一个好主意是先做探索性的 像Chrome Developer Tools这样的工作来清除最糟糕的错误(例如语法错误)。如果您的代码在那里工作,下一步是使用连接到视图 Safaris Web inspector for iOS并查看它是否仍然能够应有的效果。

@nilveryboring指出,您在webViewDidFinishLoading而非shouldStartLoadWithRequest中添加脚本是正确的。在shouldStartLoadWithRequest中,页面尚未加载,并且您在该点引入的任何状态都将被加载页面丢弃。