Подтвердить что ты не робот

Событие изменения jQuery в <select> не работает в IE

У меня есть страница с переменным числом элементов <select> (что объясняет, почему я использую здесь делегирование событий). Когда пользователь меняет выбранный параметр, я хочу скрыть/показать разные области содержимого на странице. Вот код, который у меня есть:

$(document).ready(function() {
  $('#container').change(function(e) {
    var changed = $(e.target);

    if (changed.is('select[name="mySelectName"]')) {
      // Test the selected option and hide/show different content areas.
    }
  });
});

Это работает в Firefox и Safari, но в IE событие изменения не срабатывает. Кто-нибудь знает, почему? Спасибо!

4b9b3361

Ответ 1

Событие change не пузырится в IE (см. здесь и здесь). Вы не можете использовать делегирование событий в тандеме с ним.

Фактически, из-за этой ошибки IE, что jQuery live должен был официально исключить change из списка поддерживаемых событий (FYI: условия спецификации DOM change должны пузыриться). [1]

В отношении вашего вопроса вы можете привязываться непосредственно к каждому из них:

$('#container select').change(/*...*/)

Если вы действительно хотите делегировать событие, вы можете найти какой-то успех, пытающийся сделать что-то этого человека и привязать к click только в IE, что делает пузырь:

$('#container').bind($.browser.msie ? 'click' : 'change', function(event) {
    /* test event.type and event.target 
     * to capture only select control changes
     */
})

Но это обнаружение браузера кажется действительно неправильным. Я бы действительно попытался работать с предыдущим примером (привязка непосредственно к раскрывающимся спискам). Если у вас есть сотни ящиков <select>, делегирование событий в любом случае не купило бы вас здесь.


[1] Примечание: jQuery >= 1.4 теперь имитирует событие bbbling change в IE через live()/on().

Ответ 2

Идея, которая может помочь:

$(document).ready(function() {
  $('#container select[name="mySelectName"]').change(function(e) {
    var s = $(e.target);
    if (s.val()=='1') //hide/show something;
  });
});

Если вы используете AJAX, попробуйте функция live():

 $(document).ready(function() {
       $('#container select[name="mySelectName"]').live('change', function(e) {
        var s = $(e.target);
        if (s.val()=='1') //hide/show something;
      });
    });

Ответ 3

Если я правильно помню, вам нужно будет вызвать blur(), чтобы jQuery вызывал change() на машинах IE. Попробуйте что-то вроде:

$("select[name=mySelectName]").click(function() {
    $(this).blur();
});

Ответ 4

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

Ответ 5

Добавьте эти строки в свою страницу, откиньтесь и расслабьтесь!:)

$(document).ready(function(){$('select').bind('onChange',function(){$(this).blur()});});

Ответ 6

onchange=doAction будет работать в IE и Firefox, но не поддерживается в Chrome.

Чтобы обработать это, вам нужно использовать событие jQuery .change.

Ответ 7

Я пытаюсь понять, почему вам нужно дважды проверить имя выбора после получения ему события.

У вас есть несколько элементов с одним и тем же идентификатором?

Вы на самом деле хотели сказать "#container select" вместо "#container"?

Ответ 8

Я просто основываюсь на примере, заданном "Crescent Flesh" для кросс-платформенного решения, которое сохранится даже при загрузке этого SELECT внутри # контейнера через вызов AJAX.

$('#container').bind($.browser.msie ? 'click' : 'change', function(event) {
  if ((event.type == 'click') || (event.type == 'change')) {
    if (event.target.toString().indexOf('Select') != -1) {
      var sWhich = $('#container SELECT').val();
      handleSelectionChange(sWhich);
    }
  }
});

Теперь вы просто создаете функцию handleSelectionChange(), переименовывая ее, как хотите.

Ответ 9

IE требует, чтобы событие изменения помещалось в готовый документ. Кажется, это связывает событие изменения с ассоциированным элементом. Надеюсь, что это поможет.

Ответ 10

: D: D Ничего себе, я нашел решение... Почему так сложно? Просто:
<select onchange="doAction">