Странная ошибка IE - между глобальной переменной JavaScript и элементом с атрибутом name - PullRequest
3 голосов
/ 13 октября 2010

Я протестировал следующий код в IE6, IE7 и IE8 с тем же результатом:

<a name="cd"/>a</a><br> <script><br> try {<br> cd = new Date;<br> } catch(e) {<br> alert(e);<br> }<br> </script>

Во всех случаях выдается ошибка. Однако, используя

var cd = новая дата;

похоже, решил проблему.
Кто-нибудь знает, почему это так?

Вот пример: http://jsbin.com/ahuhu4/2

Ответы [ 3 ]

6 голосов
/ 13 октября 2010

Если вы не используете спецификатор var для объявления вашей переменной, переменная cd добавляется в качестве свойства к объекту окна, например, window.cd. У вас уже есть элемент объекта, который является дочерним по отношению к окну, <a name="cd">a</a>, который уже набран. Вы не можете указать новую дату как тип для этого объекта, так как он уже существует. Когда вы используете ключевое слово var, вы переопределяете переменную в локальную область и удаляете ее прямое присоединение к объекту окна. Это устраняет ошибку и позволяет IE продолжить. Другие движки браузера обрабатывают это по-другому.

3 голосов
/ 13 октября 2010

IE делает большую пользу, создавая свойства window для каждого элемента страницы со значением "id".Это просто вещь.( примечание: это утверждение на самом деле неверно. )

edit - да, элемент не имеет "id".Хорошо, хорошие новости - IE также обрабатывает ссылки по имени , как если бы они были по "id".Вспомните, что document.getElementById("cd") на этой странице вернул бы ссылку на <a>, как если бы он имел элемент "id".

снова отредактируйте Я думаю, что это не совсемПравильно сказать, что IE действительно создает window свойства, по крайней мере, из-за того, что я прочитал о том, что говорит мне отладчик IE8.Это больше похоже на то, что интерпретатор обрабатывает неявную ссылку на глобальную переменную (в данном случае «cd») как запрос на то, чтобы он что-то искал в контексте глобальной страницы под этим именем.Для IE этот процесс включает проверку DOM для элементов с этим значением «id» или «name».Используя ключевое слово var, вы явно указываете интерпретатору, что объявляете символ в применимой области (здесь, глобальная), так что процесс «поиска» пропускается.

0 голосов
/ 13 октября 2010

// Firefox не определяет глобальные переменные автоматически для элементов с идентификаторами или именами.IE, в том числе # 9, Opera 10, Safari 5 и Chrome 6, поддерживают глобальный свиток именованных или идентифицированных элементов в документе.

Кажется, что он может заполнить глобальное пространство имен ...

function a1(id){
    try{
        window[id].style.color= 'red';
    }
    catch(er){
        return er.message+'\n'+'window.'+id+' = '+window[id];
    }
    return 'window.'+id+'='+window[id];
}
function a2(id){
    window[id]= 'red';
    return 'window.'+id+'='+window[id]
}

/ *

firefox возвращает окно [idstring] не определено.

Все остальные находят его, как старый объект IE document.all.

  • запросить идентификатор как глобальный идентификатор:

alert (a1 ('idstring'))

colors the element red and returns[object HTMLButtonElement] 
(returns [object Object] in older ie browsers)
  • назначить глобальныйновое значение: alert (a2 ('idstring')) возвращает 'red'

  • Попробуйте элемент элемент alert (a1 ('idstring'))

  • выдает ошибку - Невозможно преобразовать 'window [id] .style' в объект

  • или Невозможно установить свойство 'color' из неопределенного или
  • Result of expression 'window[id] .style '[undefined] не является объектом
  • Ожидаемый объект

* /

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