【问题标题】:Run JS in iOS webView every time loading a new page每次加载新页面时在 iOS webView 中运行 JS
【发布时间】:2013-09-05 16:15:28
【问题描述】:

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

【问题讨论】:

    标签: javascript ios html uiwebview uiwebviewdelegate


    【解决方案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 页面还没有加载,此时你引入的任何状态都将被加载页面丢弃。

    【讨论】:

      【解决方案2】:

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

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

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

      更多信息请关注Docs

      【讨论】:

      • JS 不在新页面中运行。我应该如何确定新页面是否已完全加载?
      • @nilveryboring 这就是UIWebView delegate protocol 的全部内容。要检测 UIWebView 何时完成加载,请使用 webViewDidFinishLoading。至于为什么js sn-p没有运行,我不太确定(我不知道jscript)。设置一些断点以查看它是否被调用。除此之外,检查 jscript 代码和到 NSString 的转换,以确保你做对了。这能回答你的问题吗?
      • @nilveryboring,你需要为此打开另一个问题吗?你想编辑你的问题吗?
      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多