2012-03-15 27 views
3

DOMContentLoadedを使用してDOMの準備が整ったときを検出しようとしています。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(); 
} 

それはによって追加されます:私は、アラートの呼び出しを追加した場合、私はaddEventListenerをへの呼び出しがされていることがわかります

-(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; 
    } 

成功しました。しかし、関数DOMReady()は決して呼び出されません。どんなアイデアでもないのですか?その理由は、あなたがwebViewDidFinishLoad:方法でJavaScriptを注入していることである

おかげ

答えて

4

。このメソッドは、UIWebLoadがHTMLページをロードした後に呼び出されます。あなたのjavascriptが注入される前に、DOMContentLoadedというイベントが既に発生している可能性があります。

私はこの問題を解決する方法を2つのpossiblitiesを参照してください。

  1. あなたがのUIWebViewにロードされているHTMLへのアクセス権を持っている場合は、直接HTMLにJavaScriptを挿入します。それはDOMContentLoadedが解雇されているときにjavascriptが既に存在することを保証します。あなたがHTMLへのアクセス権を持っていない場合(あなたが今inject()を呼び出すように)

  2. 、あなたはwebViewDidFinishLoad:方法から直接DOMReady() JS関数を呼び出すことができます。 DOMはその時点で完全にロードされます。このオプションの唯一の不安は、DOMが完全にロードされますが、まだ完全にレンダリングされない可能性があることです。したがって、特定のDOM要素のサイズが必要な場合、このオプションは安全ではありません(要素がその時点でレンダリングされていない可能性があるため)。しかし、DOMが完全にレンダリングされていることに頼らないものを実行しているだけの場合は、このオプションを有効にする必要があります。

関連する問題