2014-09-01 40 views
0

我有一個腳本在我的腦海如下:

<script type='text/javascript' src='http://code.jquery.com/jquery-2.1.1.min.js'></script> 
<script> 
    function editdoc(){ 
     document.getElementById("editme").innerHTML = "hello world"; 
    } 

    $(document).ready(editdoc()); 
</script> 

主體由單純的正確命名的div。

現在,當我將此傳遞給瀏覽器時,Chrome會給我提供Uncaught TypeError: Cannot set property 'innerHTML' of null錯誤。

如果我將此腳本移入正文或者使用匿名函數,則不會發生此錯誤。我認爲這意味着在DOM準備好之前正在執行該功能。

This表示命名函數應該在由$(document).ready調用時與匿名函數一樣工作。這裏發生了什麼?

回答

3

要調用的功能立即而不是通過參考。你應該editdoc後使用這種未經()

$(document).ready(editdoc); 

你在做什麼用editdoc()立即調用的函數,並從經過的返回值來$(document).ready()。因此,你觀察到函數被立即調用。

任何時候,你把()放在一個函數名或定義之後,就是告訴JS解釋器立即執行它。如果你只是傳遞一個函數的名字,那麼你傳遞一個引用(像一個指針)和你傳遞給它的函數可以稍後執行它,這就是你想要的。

1

做到這一點,而不是:

<script type='text/javascript' src='http://code.jquery.com/jquery-2.1.1.min.js'></script> 
<script> 
    $(document).ready(function() { 
     function editdoc(){ 
      document.getElementById("editme").innerHTML = "hello world"; 
     } 
     editdoc(); 
    }); 
</script> 
+0

+1因爲我正要張貼了同樣的答案.. – Lal 2014-09-01 16:52:35

+0

我不認爲這是一個很好的答案,因爲它不沒有幫助解釋行爲,它通過創建一個具有與匿名函數相同範圍的命名函數來解決問題,這可能不適合我的需要。 – romnempire 2014-09-01 16:58:00

2

您腳本的問題是您正在執行該功能。它應該是這樣的。

你應該改變這種

$(document).ready(editdoc()); 

這個

$(document).ready(editdoc); 
相關問題