2012-03-15 174 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,這個選項應該沒問題。