我的代码在$ document.ready中调用,但似乎在加载DOM之前运行。为什么?

时间:2014-09-01 16:48:57

标签: javascript jquery html dom

我脑子里有一个脚本如下:

<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 个答案:

答案 0 :(得分:3)

您正在立即调用您的函数,而不是传递引用。您应该在()之后editdoc使用此{<1}}

$(document).ready(editdoc);

您正在做的是立即使用editdoc()调用该函数并将返回值传递给$(document).ready()。因此,您观察到函数被立即调用。

任何时候,你将()放在函数名或定义之后,就是告诉JS解释器现在执行它。如果你只是传递一个函数的名字,那么你传递一个引用(比如一个指针),你传递给它的函数可以在以后执行它,这就是你想要的。

答案 1 :(得分:2)

脚本问题在于您正在执行该功能。它应该是这样的。

你应该改变这个

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

到这个

$(document).ready( editdoc );

答案 2 :(得分: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>