Информация о проблеме, о которой пойдет речь, наверняка будет полезна всем, кто не так давно начал углубляться в недра JavaScript и кросс-браузерной совместимости. Рассмотрим следующий код:
и потестируем его в разных браузерах. В 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, но его возможности ограничены.
<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, но его возможности ограничены.