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

Run JS in iOS webView every time loading a new page

本文关键字:webView iOS 运行 JS 加载 新页面      更新时间:2023-09-26

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

在这种情况下,

有两件事可能会出错: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开发人员工具之类的工具来清除最严重的错误(例如语法错误)。如果您的代码在那里工作,下一步是使用适用于 iOS 的 Safaris Web 检查器,看看它是否仍然执行应有的操作。

@nilveryboring的观点是,您在webViewDidFinishLoading而不是shouldStartLoadWithRequest中添加脚本是正确的。shouldStartLoadWithRequest页面尚未加载,此时引入的任何状态都将被加载页面丢弃。

您可以检测用户何时单击具有以下内容的链接:

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

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

有关

它的更多信息,请参阅文档。