Pull to refresh

IE: баг document.getElementById(), о котором необходимо помнить

Reading time2 min
Views1.6K
Информация о проблеме, о которой пойдет речь, наверняка будет полезна всем, кто не так давно начал углубляться в недра JavaScript и кросс-браузерной совместимости. Рассмотрим следующий код:

<HTML>
<HEAD>
<meta name="description" content="Description of the Web site goes here.">
<SCRIPT src="http://www.prototypejs.org/assets/2008/9/29/prototype-1.6.0.3.js"></SCRIPT>
</HEAD>
<BODY>
	<FORM name="test">		
		<INPUT type="text" name="description" id="description" value="test value">
	</FORM>
<SCRIPT>
Event.observe(window, 'load', function() {
	alert("Description's value is '"+$F('description')+"'");  
});
</SCRIPT>
</BODY>
</HTML>

и потестируем его в разных браузерах. В Firefox, Safari, Opera, Konqueror, Chrome этот код выдает то, что задумано — alert с текстом Description's value is 'test value'. Но только не в IE — там будет банальная ошибка выполнения.

Итак, очередная печальная правда об IE: функция document.getElementById(), к которой в результате приводит prototype-вская $F(), работает неправильно. Если у элемента указан аттрибут name, то именно его значение будет использоваться при поиске по ID, даже если сам ID также указан явно. Поэтому с точки зрения IE, в данном примере в DOM существуют два элемента с ID=«description», и первым из них идет тег META, который и будет возращен. Тег META я, кстати, использовал в примере не случайно — именно в таком случае я первый раз наступил на эти грабли, а когда начинаешь искать ошибку глазами, то META как-то не особо то и заметен. :)

Проблема эта старая и, похоже, таковой и останется — по слухам этот баг не фиксабельный, так как его исправление нарушит backward compatibility, как бы ни странно это не звучало :) Кстати, для тех, кто только начинает возиться с IE: отлаживать JS в IE удобнее всего (по моему опыту) с помощью Microsoft Script Editor, который надо устанавливать отдельно. Также стоит упомянуть Firebug Lite, но его возможности ограничены.
Tags:
Hubs:
Total votes 21: ↑18 and ↓3+15
Comments21

Articles