Почему ошибка JS в IE6 (не переменные) - PullRequest
0 голосов
/ 10 декабря 2010

Я кодировал следующий 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>

не проблема Я не могу понять причину, почему Не могли бы вы объяснить мне?

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

Если вы опустите var при объявлении переменной, и эта переменная не существует в текущей локальной области, произойдет одно из двух:

  1. , вы объявитеновая «глобальная» переменная, к которой у каждой функции будет доступ -> не делайте этого
  2. вы установите новое существующее глобальное значение в новое значение;если какая-то другая функция полагается на эту переменную, вы можете нанести ущерб

Так что не используйте глобальные переменные и по возможности используйте var.Как уже отмечал Томас, ваш скрипт может быть запущен до загрузки структуры браузером.

1 голос
/ 10 декабря 2010

Сценарий выполняется до загрузки всей структуры тела браузером.Итак, ваша функция не может найти элемент img.Вызов вашей функции при событии onLoad body исправит ошибку.

Т.е.:

<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>
0 голосов
/ 10 декабря 2010

Единственная проблема в том, что вы не используете var для объявления переменной img.Нет проблем с тем, что остальная часть тела, возможно, не была проанализирована, поэтому не беспокойтесь об этом.

Причина, по которой отсутствие var вызывает проблему, заключается в том, что img сталкивается со свойством глобального объекта, созданного для вас браузером.В IE каждый элемент с идентификатором создает свойство глобального объекта (который, следовательно, доступен везде), соответствующий этому идентификатору.Это свойство доступно только для чтения, поэтому, если вы попытаетесь присвоить его, вы получите ошибку.Если вы объявляете это первым, вы создаете новую переменную, которая не мешает глобальному свойству IE, и она будет работать так, как вы ожидаете.

Вы также обнаружите, что изменение имени переменной не вступает в противоречие с ID илисвойство window решит проблему:

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

... но это тоже не очень хорошая идея, так как вы автоматически загрязняете глобальную область с помощью banana, что может иметь последствия вдругой код, и в строгом режиме ECMAScript 5 вы получите сообщение об ошибке.

Наконец, если вы не используете XHTML (которым вы почти наверняка не должны быть и ваш пример не имеет типа документа XHTML),нет необходимости в разметке CDATA.Вы должны удалить его.

Мораль истории: всегда объявляйте свои переменные .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...