0

例如,我想在每次用户单击我的 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 在新页面中运行。我应该如何确定新页面是否已完全加载?——</p>

4

2 回答 2

1

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

根据我的经验,当 Javascript 似乎没有在 a 中运行时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:. 如果您运行,可能会出现错误消息

po [webView stringByEvaluatingJavaScriptFromString:@"window.ERR"]

在您的调试提示中。

当您在您的设备上试用 Javascript 时,一个好主意UIWebView是首先在Chrome 开发人员工具中进行探索性工作,以清除最严重的错误(例如语法错误)。如果您的代码在那里工作,下一步是使用适用于 iOS 的 Safaris Web 检查器连接到视图,并查看它是否仍然执行应有的操作。

@nilveryboring 的观点是你添加脚本webViewDidFinishLoading而不是 inshouldStartLoadWithRequest是正确的。在shouldStartLoadWithRequest页面中还没有加载,此时你引入的任何状态都会被加载页面丢弃。

于 2013-09-06T08:46:29.337 回答
1

您可以检测用户何时单击链接:

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

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

更多关于它的文档

于 2013-09-05T17:39:17.087 回答