Event.observe не запускается в IE

Event.observe(
    'size_list',
    'change',
    itemOptions["_hiddenSkuField"].getSkuOfProductBySize
);

size_list — это раскрывающийся список с некоторыми параметрами. Итак, это должно вызвать функцию, которая сгенерирует мне некоторый HTML, но этого не происходит. Излишне говорить, что он отлично работает в Chrome и Firefox.

Я не вижу, в чем проблема, я не ввожу код myFoo или даже верхний код .observe при попытке отладки.

getSkuOfProductBySize: function() {
        document.getElementById('product-type').value = '';
        document.getElementById('sku_hidden').value = '';
        var selectedIndex = document.getElementById('dropdown_options').value;
        for (var i=0; i<itemOptions["_hiddenSkuField"].products.length; i++) {
            if (itemOptions["_hiddenSkuField"].products[i].size == selectedIndex) {
                document.getElementById('sku_hidden').value = itemOptions["_hiddenSkuField"].products[i].sku;
                itemOptions["_hiddenSkuField"].backupResponse = itemOptions["_hiddenSkuField"].products[i];
                itemOptions["_hiddenSkuField"].callShowHtmlOfButtons(itemOptions["_hiddenSkuField"].products[i]);
                return;
            }
        };
    }

itemOptions["_hiddenSkuField"] — это глобальный объект, которому я владею всеми вещами. :D

ОБНОВЛЕНИЕ: я попытался поставить простой alert() вокруг функции или наблюдателя, и это не сработало. Также пробовал с событием click - безуспешно...

Я очень редко занимаюсь фронтенд-разработкой, но после того, как я сегодня с этим столкнулся, я понял, почему IE так ненавидят.


person Syspect    schedule 04.03.2014    source источник
comment
Можете ли вы опубликовать HTML, связанный с этим?   -  person MaxiWheat    schedule 04.03.2014
comment
@MaxiWheat - я обновил свой ответ. :) Это функция, которая будет использоваться для генерации HTML.   -  person Syspect    schedule 04.03.2014
comment
какая версия PrototypeJS? - самая последняя общедоступная версия - 1.7.1 - Есть ли на странице несколько элементов с одинаковым идентификатором?   -  person Geek Num 88    schedule 04.03.2014
comment
Вы можете пройти через это и заменить все свои экземпляры document.getElementById на $, поскольку первый не возвращает расширенный элемент (то есть: элемент со всеми добавленными к нему расширениями Prototype) в IE. Только с помощью одного из геттеров Prototype ($() или $$() или Element.extend()) вы получите объект, содержащий весь дополнительный сахар Prototype.   -  person Walter    schedule 04.03.2014
comment
@Walter - Хорошо, я понимаю твою точку зрения. Но проблема в том, что я даже не попадаю в вызываемую функцию getSkuOfProductBySize...   -  person Syspect    schedule 05.03.2014
comment
Мне нужно увидеть здесь больше контекста — находитесь ли вы внутри обратного вызова document.observe('dom:loaded', …) или вы находитесь внизу страницы, так что элемент (size_list) уже загружен в DOM для нахождения? Тот факт, что вы даже не вызываете свою функцию, имеет большое значение. Помните, Event.observe — это анонимное закрытие, оно может воздействовать только на то, что существует на момент его закрытия (если вы не предоставите внутри него метод поиска, поэтому он может действовать лениво).   -  person Walter    schedule 07.03.2014


Ответы (2)


Это немного уродливое решение, так как вы используете прототип.js, но все же вы можете попробовать альтернативу (если вы не найдете другого решения) - привязку события наблюдения с помощью jQuery:

$('#dropdown_options').bind('change', function(){
        itemOptions["_hiddenSkuField"].getSkuOfProductBySize();
});
person Milkncookiez    schedule 05.03.2014

В Prototype это будет

$('size_list').observe('change', function(evt){
  itemOptions['_hiddenSkuField'].getSkuOfProductBySize();
});

Я также подозреваю, что существует гораздо более простой способ спроектировать эту страницу, чтобы объекты сами по себе содержали все необходимые им данные, и вам не понадобился бы этот «божественный объект», болтающийся в DOM.

person Walter    schedule 07.03.2014