Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.02.2015, 13:45
Аспирант
Посмотреть профиль Найти все сообщения от freee
 
Регистрация: 05.02.2015
Сообщений: 51

Ошибка в учебнике
Не знаю, куда запотсить, перенесите тему, если чо.

Вот тут
http://learn.javascript.ru/searching-elements-dom
Цитата:
Важно, что в документе может быть только один элемент с данным id. Конечно, можно нарушить это правило и создать много элементов с одинаковым идентификатором, но в таком случае поведение метода getElementById будет непредсказуемым.
естественно, семантически неверно использовать неуникальные идентификаторы, но технически, данное утверждение, о непредсказуемом поведении, по-моему, ошибочно. Во всяком случае, я ни разу не встречал UB в широко поддерживаемых на данный момент браузерах(в том числе ie8). Всегда возвращается первый элемент.
<html>
<head>
</head>
<body>

<div id="foo">foo</div>
<div id="foo">bar</div>
<div id="foo">baz</div>

<script>
alert(document.getElementById("foo").innerHTML)
</script>

</body>
</html>


И вот еще что, следом там идет
Цитата:
Браузер автоматически создаёт переменные для элементов с id, через которые к ним можно обратиться.

...

Это поведение соответствует стандарту. Оно существует, в первую очередь, для совместимости, как осколок далёкого прошлого.
это сугубое ИМХО, но это не "осколок", а вполне обоснованая фича, сделанная для удобства программиста, которая позволяет избежать лишней писанины типа myelement=document.getElementById("element"). К сожалению, в большинстве случаев использется именно последнее, а это ни что иное, как тупое дублирование кода.
BTW, может кто в курсе, что говорит последний стандарт по поводу данного поведения?

Последний раз редактировалось freee, 08.02.2015 в 16:28.
Ответить с цитированием
  #2 (permalink)  
Старый 08.02.2015, 15:17
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

freee, фишка с ID не везде работает, поэтому лучше всегда писать так:
var test = document.getElementById('test');
Ответить с цитированием
  #3 (permalink)  
Старый 08.02.2015, 15:22
Аспирант
Посмотреть профиль Найти все сообщения от freee
 
Регистрация: 05.02.2015
Сообщений: 51

Сообщение от Ruslan_xDD
фишка с ID не везде работает, поэтому лучше всегда писать так:
А где не работает? Я проверял в ff, v8, и ie8. На остальные, в принципе, можно забить, в большинстве случаев. Правда, работа немного отличается, при дублировании id.
Ответить с цитированием
  #4 (permalink)  
Старый 08.02.2015, 16:11
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
это сугубое ИМХО, но это не "осколок", а вполне обоснованая фича, сделанная для удобства программиста, которая позволяет избежать лишней писанины типа myelement=document.getElementById("element"). К сожалению, в большинстве случаев использется именно последнее, а это ни что иное, как тупое дублирование кода.
Это засирание глобала, нарушение инкапсуляции. В жопу.
Ответить с цитированием
  #5 (permalink)  
Старый 08.02.2015, 16:20
Аспирант
Посмотреть профиль Найти все сообщения от freee
 
Регистрация: 05.02.2015
Сообщений: 51

Сообщение от Erolast
засирание глобала, нарушение инкапсуляции
В таком случае в начале каждого скрипта удаляй все имена которые соответствуют идентификаторам в документе.

И, при чем тут инкапсуляция?
Ответить с цитированием
  #6 (permalink)  
Старый 08.02.2015, 16:27
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

freee, я как-то забыл записать элемент в переменную, а потом полдня гадал почему в FF не работает.
Ответить с цитированием
  #7 (permalink)  
Старый 08.02.2015, 16:40
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
И, при чем тут инкапсуляция?
При том, что засирание глобала и есть нарушение инкапсуляции.
Цитата:
В таком случае в начале каждого скрипта удаляй все имена которые соответствуют идентификаторам в документе.
Вот именно. Какого хрена я должен при написании контроллера оглядываться на верстку представления?
Ответить с цитированием
  #8 (permalink)  
Старый 08.02.2015, 16:53
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Erolast, ну а что теперь сделать? Может ещё неиспользуемые методы API удалять?
Ответить с цитированием
  #9 (permalink)  
Старый 08.02.2015, 17:04
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

А такие есть?
Ответить с цитированием
  #10 (permalink)  
Старый 08.02.2015, 17:14
Аспирант
Посмотреть профиль Найти все сообщения от freee
 
Регистрация: 05.02.2015
Сообщений: 51

Сообщение от Erolast
А такие есть?
Он имеет в виду, видимо, неиспользуемые в конкретном приложении.
Кстати в самом языке, тоже много чего можно поудалять, для более лучшей инкапсуляции.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
firebug пишет ошибка invalid range in character class Dim@ Общие вопросы Javascript 5 10.05.2012 16:52
ошибка NS_ERROR_DOM_SECURITY_ERR h0kum Events/DOM/Window 2 18.12.2010 20:01
Непонятная ошибка в IE6 Servest Internet Explorer 14 10.10.2010 13:19
То-ли лыжи не едут, толи... возможно ошибка в коде. AzriMan Общие вопросы Javascript 19 18.05.2009 16:07
IE: неизвестная ошибка выполнения _Kpot_ Internet Explorer 1 03.04.2008 11:00