我正在尝试使用 DOMContentLoaded 检测 DOM 何时准备就绪。
我正在将以下 JavaScript 代码注入(inject)页面:
var script = document.createElement('script');
script.type = 'text/javascript';
script.text = function addListener() {
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", DOMReady, false);
}
};
function DOMReady() {
document.location.href = "mydomain://anything.stuff";
}
function inject() {
document.getElementsByTagName('head')[0].appendChild(script);
addListener();
}
添加者:
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
static BOOL injected = NO;
if (!injected)
{
NSBundle *bundle = [NSBundle mainBundle];
NSURL *jsURL = [bundle URLForResource:@"DetectDOMLoaded" withExtension:@"js"];
NSData *jsData = [NSData dataWithContentsOfURL:jsURL];
NSString *jsScriptAsString = [[NSMutableString alloc] initWithData:jsData encoding:NSUTF8StringEncoding];
[self.webView stringByEvaluatingJavaScriptFromString:jsScriptAsString];
[self.webView stringByEvaluatingJavaScriptFromString:@"inject();"];
injected = YES;
}
如果我添加警报调用,我可以看到对 addEventListener 的调用已成功进行。然而,函数 DOMReady() 从未被调用过。有什么想法为什么不呢?
谢谢
最佳答案
原因是您在 webViewDidFinishLoad:
方法中注入(inject)了 javascript。该方法在 UIWebLoad 加载 HTML 页面后调用。这意味着 DOMContentLoaded
事件可能在您的 javascript 被注入(inject)之前已经被触发。
我看到了两种解决此问题的可能性:
如果您有权访问要加载到 UIWebView 中的 HTML,请将 javascript 直接插入到 HTML 中。这保证了当
DOMContentLoaded
被触发时 javascript 已经存在。如果您无法访问 HTML,您可以直接从
webViewDidFinishLoad:
方法调用您的DOMReady()
JS 函数(就像您调用inject()
现在)。 DOM 将在此时完全加载。这个选项唯一的不安全之处是,DOM 将被完全加载但可能尚未完全呈现。所以如果你需要某些 DOM 元素的大小,这个选项是不安全的(因为元素可能在那个时候还没有被渲染)。但是,如果您只是在做一些不依赖于完全呈现 DOM 的事情,那么这个选项应该没问题。
关于javascript - DOMContentLoaded 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9722950/