2012-03-15 379 views
3

我试图检测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()永远不会被调用。任何想法为什么不呢?

感谢

回答

4

的原因是你注入在webViewDidFinishLoad:方法的JavaScript。该方法在UIWebLoad加载HTML页面后调用。这意味着DOMContentLoaded事件可能已经在您的JavaScript注入之前被触发。

我看到两个possiblities如何解决这个问题:

  1. 如果你有机会到您正在加载到一个UIWebView的HTML,直接插入的JavaScript到HTML。这保证了当DOMContentLoaded被解雇时javascript已经存在。

  2. 如果您无法访问HTML,则可以直接从webViewDidFinishLoad:方法(如您现在致电inject())调用DOMReady() JS功能。 DOM将在该点完全加载。这个选项唯一的不安全性在于,DOM将被完全加载,但可能尚未完全呈现。所以如果你需要某些DOM元素的大小,这个选项是不安全的(因为这个元素可能没有被渲染)。但是如果你只是在做一些不依赖完全渲染的DOM,这个选项应该没问题。