UIWebView 无法运行 JavaScript,因为 document.getElementById 返回 null

Posted

技术标签:

【中文标题】UIWebView 无法运行 JavaScript,因为 document.getElementById 返回 null【英文标题】:UIWebView unable to run JavaScript as document.getElementById returns null 【发布时间】:2015-02-03 12:10:41 【问题描述】:

我目前正在尝试在我的 webView 中运行一些 JS,以简单地填写第 3 方网站上的一些文本字段。到目前为止,这在其他网站上取得了成功,但我似乎遇到了特定网址的问题。

 let loadFirstNameJS = "var inputFields = document.getElementById('Field1'); inputFields.value = '\(firstName)';"
 self.webView.stringByEvaluatingjavascriptFromString(loadFirstNameJS)

执行 JS 输入字符串值(firstName)以前很简单。但是我似乎无法访问元素“Field1”,因为它看起来好像不存在? (返回空值)即使我能够在浏览器中查看和编辑。

据我了解,在页面完全加载之前,UIWebView 不会原谅任何 JS,因此假设在创建元素之前尝试访问元素不会成为问题。

这是我正在尝试编辑的特定 Field1 的 html

<li id="fo134li1" class="notranslate leftHalf     ">
<label class="desc" id="title1" for="Field1">
    First Name
            <span id="req_1" class="req">*</span>
        </label>
<div>
    <input id="Field1" name="Field1" type="text" class="field text medium" value="" maxlength="255" tabindex="2" onkeyup="handleInput(this); " onchange="handleInput(this);" required="">
        </div>
</li>

这是我在项目完成之前需要解决的最后一件事,因此非常感谢任何关于为什么这不起作用的帮助!

谢谢!

【问题讨论】:

【参考方案1】:

您应该真正跟踪页面加载,并且在看到页面完成加载之前不要运行 javascript。你可能执行得太快了。

您可以通过实现来检测负载的开始

- (void)webViewDidStartLoad:(UIWebView *)webView

并通过实现来检测结束

- (void)webViewDidFinishLoad:(UIWebView *)webView

或通过实施来检测错误

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

您需要跟踪开始和结束的加载次数,因为某些页面可以加载其他页面。完成所有页面后,运行您的 javascript。

【讨论】:

抱歉,应该提到上面的 'self.stringByEvaluatingJavaScriptFromString(loadFirstNameJS)' 都在 'func webViewDidFinishLoad(webView: UIWebView)' 中执行 我已经实现了一个小的 println()上面的 3 种方法和我的控制台日志确认没有错误,页面开始并完成加载。用我知道的其他网站进行测试,完成文本字段,我没有得到任何完成加载的控制台日志。 你能用 Safari 加载 URL 并在 web 检查器控制台中运行 JS 吗?如果是这样,那么很可能是您的代码。如果没有,则使用 Web 检查器进行调试。我认为这个 URL 没有身份验证,因为 UIWebView 不会为你处理任何这些? 感谢 Rory,看起来我试图访问的元素位于 iframe 中(解释了为什么它不像最初想象的那么简单)。奇怪的是,请求访问的框架具有 http: 协议:但被访问的框架具有 https 协议,因此 Safari 在尝试使用我的 JS 访问文本字段所在的 iframe 内容/窗口时阻止了这一点。

以上是关于UIWebView 无法运行 JavaScript,因为 document.getElementById 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 将 CSS 注入 UIWebView

在 UIWebView 的 Safari Web Inspector 中查看 Javascript 源代码

Javascript 不会在 UIWebView 上运行

我可以在 UIWebView 的不同域框架中注入/运行 Javascript 吗?

JavaScript 和 HTML 文件没有在 UIWebView 中运行

关于iOS10 JavaScript & UIWebview 界面