Когда вы конвертируете .1 или 1/10 в base 2 (двоичный), вы получаете повторяющийся шаблон после десятичной точки, точно так же, как пытаетесь представить 1/3 в базе 10. Значение не является точным, и поэтому вы можете 't делать точную математику с ней, используя обычные методы с плавающей запятой.
Что должно произойти, так это то, что «именованные элементы» добавляются как кажущиеся свойства объекта document
. Это действительно плохая идея, так как позволяет именам элементов сталкиваться с реальными свойствами document
.
IE затруднил ситуацию, добавив именованные элементы в качестве свойств объекта window
. Это вдвойне плохо, потому что теперь вам нужно избегать именования ваших элементов после того, как захочет использовать какой-либо из объектов document
или window
, которые вы (или любой другой библиотечный код в своем проекте) захотите использовать.
Это также означает, что эти элементы видны как глобальные переменные. К счастью, в этом случае любые реальные глобальные объявления var
или function
в вашем коду затушевывают их, поэтому вам не нужно так беспокоиться об именах здесь, но если вы попытаетесь выполнить присвоение глобальной переменной с конфликтом имя и вы забудете объявить его var
, вы получите сообщение об ошибке в IE, поскольку оно пытается присвоить значение самому элементу.
Обычно считается, что неправильная практика пропускает var
, так как а также полагаться на названные элементы, которые видны на window
или в виде глобальных. Придерживайтесь document.getElementById
, который более широко поддерживается и менее неоднозначен. Вы можете написать тривиальную функцию обертки с более коротким именем, если вам не нравится ввод текста. В любом случае, нет смысла использовать кеш-поиск с id-элементом, поскольку браузеры обычно оптимизируют вызов getElementById
, чтобы использовать быстрый поиск; все, что вы получаете, это проблемы, когда элементы меняются id
или добавляются / удаляются из документа.
Opera скопировала IE, затем присоединился WebKit, и теперь обе ранее нестандартная практика размещения именованных элементов в document
, и ранее применявшаяся только для IE практика помещать их в window
, является стандартизированной HTML5, подход которой заключается в том, чтобы документировать и стандартизировать каждую ужасную практику, причиненную на нас авторами браузеров, делая их частью сети навсегда. Таким образом, Firefox 4 также будет поддерживать это.
Что такое «названные элементы»? Все, что имеет id
, и все, что используется name
для целей идентификации, то есть формы, изображения, привязки и несколько других, но не другие несвязанные экземпляры атрибута name
, например, имена в полях ввода формы, имена параметров в <param>
или тип метаданных в <meta>
. «Идентификация» name
s - это те, которые следует избегать в пользу id
.
Как упоминалось в более раннем ответе, это поведение известно как с именем access по объекту window . Значение атрибута name
для некоторых элементов и значение атрибута id
для всех элементов становятся доступными как свойства глобального объекта window
. Они известны как именованные элементы. Поскольку window
является глобальным объектом в браузере, каждый именованный элемент будет доступен как глобальная переменная.
Это было первоначально добавлено Internet Explorer и в конечном итоге было реализовано всеми другими браузерами просто для совместимости с сайтами которые зависят от этого поведения. Интересно, что Gecko (движок рендеринга Firefox) решил реализовать это только в режиме quirks , тогда как другие механизмы рендеринга оставили его в стандартном режиме.
Однако, с Firefox 14, Firefox теперь поддерживает именованный доступ к объекту window
в стандартном режиме. Почему они изменили это? Оказывается, все еще есть много сайтов, которые полагаются на эту функциональность в стандартном режиме. Microsoft даже выпустила маркетинговую демонстрацию , которая предотвратила демонстрацию работы в Firefox.
Недавно Webkit рассмотрел противоположное , отменив именованный доступ на window
объект только для режима quirks. Они решили против этого по тем же соображениям, что и Гекко.
Итак ... сумасшедший, поскольку кажется, что это поведение теперь технически безопасно использовать в последней версии всех основных браузеров в стандартном режиме. Но хотя названный доступ может показаться несколько удобным, его не следует использовать.
Почему? В этой статье можно суммировать рассуждения о том, почему глобальные переменные являются плохими . Проще говоря, наличие множества дополнительных глобальных переменных приводит к большему количеству ошибок. Допустим, вы случайно набрали имя var
и случайно набрали id
узла DOM, SURPRISE!
Кроме того, несмотря на стандартизацию, все еще существует довольно много несоответствий в реализациях браузера именованный доступ.
name
доступным для элементов формы (ввод, выбор и т. д.). <a>
, доступных через их атрибут name
. И я уверен, что есть больше, если вы попробуете использовать именованный доступ в случаях с краем.
Как упоминалось в других ответах, используйте document.getElementById
, чтобы получить ссылку на узел DOM своим id
. Если вам нужно получить ссылку на узел по его атрибуту name
, используйте document.querySelectorAll
.
Пожалуйста, не распространяйте эту проблему, используя именованный доступ на вашем сайте. Так много веб-разработчиков потратили время, пытаясь отследить это магическое поведение . Нам действительно нужно принять меры и заставить механизмы рендеринга отключить именованный доступ в стандартном режиме. В краткосрочной перспективе это сломает некоторые сайты, делающие плохие вещи, но в конечном итоге это поможет переместить веб-сайт.
Если вам интересно, я более подробно расскажу об этом в своем блоге - http://tjvantoll.com/2012/07/19/dom-element-references-as-global-variables/ .
В этих случаях вы должны придерживаться getElementById()
, например:
document.getElementById('example').innerHTML
IE любит смешивать элементы с атрибутами name
и ID
в глобальное пространство имен, поэтому лучше всего указать, что вы пытаетесь получить.
Да, они делают.
Протестировано в Chrome 55, Firefox 50, IE 11, IE Edge 14 и Safari 10 со следующим примером:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="im_not_particularly_happy_with_that">
Hello World!
</div>
<script>
im_not_particularly_happy_with_that.innerText = 'Hello Internet!';
</script>
<!-- Looking at you W3 HTML5 spec group ಠ_ಠ -->
</body>
</html>