例如,我希望每次用户点击我的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。我该如何确定新页面是否已满载? -
答案 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
中,页面尚未加载,并且您在该点引入的任何状态都将被加载页面丢弃。