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 源代码
我可以在 UIWebView 的不同域框架中注入/运行 Javascript 吗?