DOMContentLoaded事件没有触发
问题描述:
我试图检测DOM何时准备好使用DOMContentLoaded。DOMContentLoaded事件没有触发
我注入了以下JavaScript代码到页:
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:
方法的JavaScript。该方法在UIWebLoad加载HTML页面后调用。这意味着DOMContentLoaded
事件可能已经在您的JavaScript注入之前被触发。
我看到两个possiblities如何解决这个问题:
如果你有机会到您正在加载到一个UIWebView的HTML,直接插入的JavaScript到HTML。这保证了当
DOMContentLoaded
被解雇时javascript已经存在。如果您无法访问HTML,则可以直接从
webViewDidFinishLoad:
方法(如您现在致电inject()
)调用DOMReady()
JS功能。 DOM将在该点完全加载。这个选项唯一的不安全性在于,DOM将被完全加载,但可能尚未完全呈现。所以如果你需要某些DOM元素的大小,这个选项是不安全的(因为这个元素可能没有被渲染)。但是如果你只是在做一些不依赖完全渲染的DOM,这个选项应该没问题。