Баг Object.each в Chrome

45 views
Skip to first unread message

Avol

unread,
Mar 13, 2012, 6:10:34 AM3/13/12
to RightJS Для Бородатых Хакеров
Object.each в Google chrome перебирает ещё и такие свойства объекта,
как length и item.

Т.е. в firefox при переборе результата el_form.input('name') с выводом
console.log(key) будет:
0
1
2
А в Chrome:
0
1
2
length
item

Nikolay Nemshilov

unread,
Mar 13, 2012, 6:52:34 AM3/13/12
to right...@googlegroups.com
Привет,

Можете полный кусок кода привести?

--
Thanks,
Nikolay

Avol

unread,
Mar 13, 2012, 7:21:54 AM3/13/12
to RightJS Для Бородатых Хакеров
Вот, здесь if ( typeof el == 'object' ) я добавил именно для решения
этой проблемы, иначе была ошибка.


els_input_route = el_form.input('route');

if ( els_input_route )
{
Object.each( els_input_route, function(key,el)
{
if ( typeof el == 'object' )
{
var el_ = $(el);

if ( el_.checked() )
{
el_input_route = el_;
}
}
} );

Nikolay Nemshilov

unread,
Mar 13, 2012, 7:40:23 AM3/13/12
to right...@googlegroups.com
Как-то не очень понял смысл этой конструкции.

Form#input возвращает поле ввода с типом Input. Какой смысл в том чтобы проводить итерации по этому объекту не понятно.

Но в общем и целом, если вам нужны только собственные параметры объекта, то в JavaScript это делается примерно так

for (key in object) {
  if (object.hasOwnProperty(key)) {
    // do stuff
  }
}

Смысл Object.each в том чтобы проитерировать через _все_ доступные свойства объекта, кому то нужны свойства из прототипа, кому-то нет. При этом список естественно может отличаться от браузера к браузеру


--
Thanks,
Nikolay

Avol

unread,
Mar 13, 2012, 8:32:13 AM3/13/12
to RightJS Для Бородатых Хакеров
Ну я здесь просто пытаюсь получить ссылку на выбранный radio button из
группы. И Form#input возвращает объект с перечнем элементов.
Я просто ожидал поведения, как у Array#each.

Nikolay Nemshilov

unread,
Mar 13, 2012, 8:40:04 AM3/13/12
to right...@googlegroups.com
не уверен что Form#input вернет перечень элементов. по идее можете просто вызвать Form#find, в этом случае вы получите просто Array, например

el_form.find("input[type=radio][name=route]").each(function(input, index) {
  // тут должны проитерироваться только подходящие элементы
});


--
Thanks,
Nikolay

Avol

unread,
Mar 13, 2012, 10:23:47 AM3/13/12
to RightJS Для Бородатых Хакеров
Ну не знаю, но мне он возвращал именно перечень (по крайней мере в
firefox) -- детально проверял это через console.log, так как сам не
знал, что будет на выходе (в документации этот момент не рассмотрен)
(кстати, элемента в этом списке не обёрнуты -- видимо, здесь всё-же
какая-то нестандартная ситуация).
Про find -- действительно, спасибо -- я как-то зациклился на специальном
методе формы, и про обычный find и не подумал.

Nikolay Nemshilov

unread,
Mar 13, 2012, 10:34:21 AM3/13/12
to right...@googlegroups.com
Вообще там никакой магии нет, метод совершенно тривиален

https://github.com/rightjs/rightjs-core/blob/master/src/dom/form.js#L65-67

Но если честно я на вскидку не скажу, что this._[name] возвращает в случае радиобокса, возможно там действительно будет список элементов т.к. параметр name у них всех один и тот же.


--
Thanks,
Nikolay

Reply all
Reply to author
Forward
0 new messages