2009-08-10 3 views
2

Да, я знаю, что он не работает в IE и использует «щелчок». Но вот моя проблема.Событие jquery 'change' не работает в IE

У меня есть две коробки выбора - страна и город. Выбор страны заполняет окно выбора города (и обновляет карту google).

Следующий код работает как шарм в IE и Opera:

if (jQuery('#city').length > 0) { 
    jQuery('#city').change(function(){ populateCityListBox(); }); 
    } 

Если я использую «нажмите» вместо «изменить», то populateCityListBox() срабатывает один раз, когда я нажимаю на поле выбора, стрелка , и еще один раз, когда я нажимаю элемент списка.

Как я могу избежать этого двойного запуска?

ответ

2

Проблема заключается в том, что IE не запускает событие изменения, пока элемент не теряет фокус.

Простым решением может быть отслеживание последнего значения выбора и только разрешение функции выполнять, если она отличается.

Кроме того, обратите внимание, что в обратном вызове change вам не нужно обертывать его анонимной функцией, если все, что вы делаете, вызывает его.

jQuery('#city').change(populateCityListBox); 

работает так же, как и у вас там.

+0

У меня есть выбор, который отлично работает с .change в IE8 и IE7 (Совместимость) без потери фокуса. – Marc

+0

Mark: Можете ли вы дать нам код? – Steven

+0

@Steven, нет волшебства $ ("# id-selector"). Change (function); как было заявлено TM – Marc

0

это может работать (не тестировался, хотя):

if ($.browser.msie) { 
    var interval = 50; 
    var changeHack = 'change-hac'; 
    var select = $("#viewByOrg"); 
    select.data(changeHack) = select.val(); 
    var checkVal=function() { 
    var oldVal = select.data(changeHack); 
    var newVal = select.val(); 
    if (oldVal !== newVal) { 
     select.data(changeHack, newVal); 
     select.trigger('change') 
    } 
    setTimeout(changeHack, interval); 
    } 
    setTimeout(changeHack, interval); 
} 

игра с интервалом номер своих чувств. также - если триггер ('change') трюк не будет работать, попробуйте прямо позвонить на ваш метод обмена.

Смежные вопросы