【问题标题】:window.onload != <body onload="">window.onload != <body onload="">
【发布时间】:2009-10-27 21:59:58
【问题描述】:

我认为这很有趣。考虑以下代码,window.onload 和 body onload="" 调用相同的函数。然而,结果是不同的。在我看来,window.onload 的集合有问题。代码如下:

<html>
<script type="text/javascript">

    window.onload = getSpanElements();

    function getSpanElements(){
        var collectionBoolean = document.getElementsByTagName("span")?true:false;
        alert(
            "collection exists? " + collectionBoolean + "; number of collection members: " + document.getElementsByTagName("span").length
        );
    }


</script>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>Untitled Document</title>
</head>
<body onload="getSpanElements()">
    <span> test </span>
</body>

如您所见,两者都报告集合存在,但是 window.onload 报告它没有成员。有什么想法吗?

【问题讨论】:

    标签: javascript collections onload


    【解决方案1】:

    你的功能设置错误:

    window.onload = getSpanElements();
    

    应该是

    window.onload = getSpanElements;
    

    您现在正在将 onload 处理程序设置为 getSpanElements() 的返回值。

    【讨论】:

      【解决方案2】:
      window.onload = getSpanElements();
      

      应该是

      window.onload = getSpanElements;
      

      您的代码调用getSpanElements 函数并将其返回值分配为onload 事件处理程序。

      【讨论】:

        【解决方案3】:

        你做错了:

        window.onload = getSpanElements();
        

        window.onload 设置为调用函数getSpanElements 的结果(未定义)。

        你应该这样做:

        window.onload = getSpanElements;
        

        【讨论】:

        • 其实函数返回的是undefined,而不是null
        【解决方案4】:

        您可能希望将 window.onload 分配移到 getSpanElements 声明下方:

        <html>
        <script type="text/javascript">
        
        
                function getSpanElements(){
                        var collectionBoolean = document.getElementsByTagName("span")?true:false;
                        alert(
                                "collection exists? " + collectionBoolean + "; number of collection members: " + document.getElementsByTagName("span").length
                        );
                }
        
                window.onload = getSpanElements;
        
        </script>
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
                <title>Untitled Document</title>
        </head>
        <body onload="getSpanElements()">
                <span> test </span>
        </body>
        

        在您分配 window.onload 事件处理程序的代码中,尚未定义 getSpanElements()。此外,该行应该是

        window.onload=getSpanElements;
        

        不是

        window.onload=getSpanElements();
        

        不带括号的函数名是对该函数的引用。带括号,执行函数,返回值赋值给window.onload。

        【讨论】:

        • 由于 getSpanElements 是用函数语句而不是函数表达式定义的,所以它会被提升——因此它不需要出现在代码顺序中的赋值之前。
        【解决方案5】:

        您必须将对函数getSpanElements 的引用分配给window.onload - 目前,该函数不会在onload 执行,而是在解析后立即执行。

        你实际分配的是未定义的返回值。

        简而言之:删除()

        【讨论】:

          【解决方案6】:

          我认为window 对象是在解析任何实际元素之前创建的。

          【讨论】:

          • 我也这么认为,但它很清楚该集合的存在,这让我感到困惑。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-13
          相关资源
          最近更新 更多