Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.10.2014, 16:18
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Массив (html-коллекция) элементов. Нафига они сделали ЭТО?
<html>
<head>
<title> test </title>

</head>
    <body >
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<p>foo</p>
<script>

//p=document.querySelectorAll("p")
p=document.getElementsByTagName("p")
for(i in p){
if(!(p.hasOwnProperty(i))) break
console.log(p[i])
p[i].style.background="red" // Uncaught TypeError: Cannot set property 'background' of undefined
}
</script>
    </body>
</html>

На последней ирерации валится с ошибкой. Они засунули свойство lenght прямо в объект. Почему не в прототип??? Делаю вот так

if((!(p.hasOwnProperty(i))||i==="length")) break

Все работает. Но я не понимаю, нахера нужно было засовывать в итерируемый объект это свойство? Они специально издеваются, или просто мозга нет? Проверил и для document.querySelectorAll и для
document.getElementsByTagName, работает одинаково.

А какие еще сюрпризы можно ожидать в браузерах от этих мудаков?
Ответить с цитированием
  #2 (permalink)  
Старый 26.10.2014, 16:20
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Ну ты же неумный. Коллекции элементов, как и массивы, перебираются через обычный for или for of в современных браузерах.

Последний раз редактировалось Erolast, 26.10.2014 в 16:22.
Ответить с цитированием
  #3 (permalink)  
Старый 26.10.2014, 16:28
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Erolast,
Ну и что, что они перебираются? Это не значит, что их нельзя перебирать for in. И к вопросу это отношения не имеет. Нахрена имплементаторы засунули с-во length прямо в основной объект? В этом необходимость была, или чо?
Ответить с цитированием
  #4 (permalink)  
Старый 26.10.2014, 18:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Меня тоже этот вопрос беспокоил.

Вот тут можно почитать детали: https://code.google.com/p/chromium/i...tail?id=339202

Цитата:
This is only one of many things that's
very strange about the way DOM objects are reflected in JS. I don't think this
one bit is worth fixing on its own, but a broader fix might actually be really
good. I'm just not sure whether the right fix is in the IDL, the bindings layer,
V8, or all of the above.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 26.10.2014, 18:07
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

По сути проблема не только в length. Проблема во всех DOM-объектах со всеми свойствами и методами. Есть примеры исключений?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 26.10.2014, 21:41
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от terminator-101
нахера нужно было засовывать в итерируемый объект это свойство?
Какой нахер объект? Это обычная live-коллекция с обычными для коллекций пропертями и методами.

И еще раз, фор ин - частный случай, клинический случай - in. if('length' in p) - не имею права? Идите плачьте в унитаз.
Ответить с цитированием
  #7 (permalink)  
Старый 26.10.2014, 21:42
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Ему лень написать свой foreach на фор лупах, будет волосы на ж рвать вписывая проверки на все что еще ему вперде попадется.

Кстати, в коллекциях маст хэв метод item(). Я вроде видел что и коллекции этих элементов такой имеют. Если item() есть, то почему не юзаете?

Последний раз редактировалось kostyanet, 26.10.2014 в 21:45.
Ответить с цитированием
  #8 (permalink)  
Старый 27.10.2014, 01:17
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

как-то долго прожил очередной аккаунт foo
Ответить с цитированием
  #9 (permalink)  
Старый 27.10.2014, 03:52
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Наверно можно подводить итог под темой =)
<img src="http://national-travel.ru/wp-content/uploads/2010/12/belki-isteryhki.jpg"></img><br>
<img src="http://www.netlore.ru/upload/files/19/3_233.jpg"></img>

Последний раз редактировалось MallSerg, 27.10.2014 в 03:56.
Ответить с цитированием
  #10 (permalink)  
Старый 27.10.2014, 07:09
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

kostyanet, про foreach это верно, но факт что в реализациях косяк. Так не должно быть. Но он нормальным людям не мешает, так что нет смысла исправлять.
Сообщение от kostyanet
if('length' in p) - не имею права? Идите плачьте в унитаз
Хоть бы проверял че пишешь:

alert('length' in document.images);

alert('length' in []);

Так что сам поплачь )
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
background resize IceDvl jQuery 4 25.04.2014 17:54
Как в шаблоне диррективы узнать массив это или строка? delias Angular.js 1 18.03.2014 07:33
Собрать массив из элементов DOM Fairy-Wilbury Events/DOM/Window 4 13.09.2013 17:30
Баги Opera пишем сюда devote Оффтопик 101 08.08.2013 05:56
Удалить и вернуть массив из удаленных элементов splice Paulyyy Общие вопросы Javascript 15 29.05.2013 15:36