繁体   English   中英

为什么在IE6中出现JS错误(不是var变量)

[英]Why JS Error IN IE6 (not var variables)

我编码了以下JS

<html>
 <body>
   <img id="img" src="http://example.com/img.jpg" />
   <script type="text/javascript"> 
//<![CDATA[
(function(){
    img = document.getElementById("img");
    img.src = "http://example.com/img.png";
})();
  //]]>
</script> 
 </body>

但在IE6上却发生了一些js错误。

因为我应该使用var img吗? 偶然

     <body>
       <img id="img" src="http://example.com/img.jpg" />
       <script type="text/javascript"> 
    //<![CDATA[
    (function(){
        var img = document.getElementById("img");
        img.src = "http://example.com/img.png";
    })();
      //]]>
    </script> 
     </body>

</html>

没问题,我不明白你为什么能解释我?

如果在声明变量时省略var ,并且该变量在当前本地范围中不存在,则会发生以下两种情况之一:

  1. 您将声明一个新的“全局”变量,每个函数都可以访问->请勿执行此操作
  2. 您将已经存在的全局变量设置为新值; 如果其他函数依赖此变量,则可能造成严重破坏

因此,请勿使用全局变量,并尽可能使用var 正如Tomas已经指出的那样,您的脚本可以在浏览器加载结构之前运行。

该脚本在浏览器加载整个主体结构之前运行。 因此,您的函数找不到img元素。 onLoad主体事件上调用您的函数将解决此错误。

即:

<html>
 <head>

   <script type="text/javascript"> 
     //<![CDATA[
    function loadImage(){
      img = document.getElementById("img");
      img.src = "http://example.com/img.png";
      }
  //]]>
  </script>     

 </head>
 <body onLoad="loadImage();">
   <img id="img" src="http://example.com/img.jpg" />

 </body>
</html>

唯一的问题是您没有使用var声明img变量。 身体的其余部分可能没有被解析这一事实没有问题,因此不必担心。

缺少var会在这里引起问题的原因是img正在与浏览器为您创建的全局对象的属性发生冲突。 在IE中,每个具有ID的元素都会创建与该ID相对应的全局对象的属性(因此可以在任何地方访问)。 此属性是只读的,因此,如果尝试为其分配,则会收到错误消息。 如果先声明它,则将创建一个不会干扰IE全局属性的新变量,它将按预期工作。

您还会发现,更改变量名称以使其与window的ID或属性不冲突将解决此问题:

banana = document.getElementById("img");
banana.src = "http://example.com/img.png";

...但这不是一个好主意,因为您会自动用banana污染全局范围,这可能会对其他代码产生影响,而在ECMAScript 5严格模式下,您会得到一个错误。

最后,除非您使用XHTML(几乎可以肯定不应该使用XHTML,并且您的示例没有XHTML文档类型),否则不需要CDATA标记。 您应该将其删除。

故事的寓意: 始终声明您的变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM