Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Массив (html-коллекция) элементов. Нафига они сделали ЭТО? (https://javascript.ru/forum/misc/51150-massiv-html-kollekciya-ehlementov-nafiga-oni-sdelali-ehto.html)

terminator-101 26.10.2014 16:18

Массив (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, работает одинаково.

А какие еще сюрпризы можно ожидать в браузерах от этих мудаков?

Erolast 26.10.2014 16:20

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

terminator-101 26.10.2014 16:28

Erolast,
Ну и что, что они перебираются? Это не значит, что их нельзя перебирать for in. И к вопросу это отношения не имеет. Нахрена имплементаторы засунули с-во length прямо в основной объект? В этом необходимость была, или чо?

danik.js 26.10.2014 18:04

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

Вот тут можно почитать детали: 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.

danik.js 26.10.2014 18:07

По сути проблема не только в length. Проблема во всех DOM-объектах со всеми свойствами и методами. Есть примеры исключений?

kostyanet 26.10.2014 21:41

Цитата:

Сообщение от terminator-101
нахера нужно было засовывать в итерируемый объект это свойство?

Какой нахер объект? Это обычная live-коллекция с обычными для коллекций пропертями и методами.

И еще раз, фор ин - частный случай, клинический случай - in. if('length' in p) - не имею права? Идите плачьте в унитаз.

kostyanet 26.10.2014 21:42

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

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

Octane 27.10.2014 01:17

как-то долго прожил очередной аккаунт foo :)

MallSerg 27.10.2014 03:52

Наверно можно подводить итог под темой =)
<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>

danik.js 27.10.2014 07:09

kostyanet, про foreach это верно, но факт что в реализациях косяк. Так не должно быть. Но он нормальным людям не мешает, так что нет смысла исправлять.
Цитата:

Сообщение от kostyanet
if('length' in p) - не имею права? Идите плачьте в унитаз

Хоть бы проверял че пишешь:

alert('length' in document.images);

alert('length' in []);

Так что сам поплачь )


Часовой пояс GMT +3, время: 09:26.