Запустить событие изменения для выбора, даже если выбран тот же параметр - PullRequest
19 голосов
/ 12 октября 2011

По сути, у меня есть раскрывающееся меню, которое выглядит следующим образом:

<select>
  <option>0</option>
  <option selected="selected">1</option>
  <option>2</option>
  <option>3</option>
</select>

Я пытаюсь написать функцию, которая запускается даже при выборе той же опции, т. Е. Даже если раскрывающийся списокоткрыл и повторно выбрал выбранный вариант, я хочу, чтобы он выполнял функцию.

Ответы [ 5 ]

14 голосов
/ 12 октября 2011

Если вы имеете в виду выбор с помощью мыши, вы можете использовать mouseup. Тем не менее, он будет срабатывать и при открытии окна выбора, поэтому вам нужно будет отследить, сколько раз оно было запущено (четное: выбор открывается, нечетный: выбор закрывается): http://jsfiddle.net/T4yUm/2/.

$("select").mouseup(function() {
    var open = $(this).data("isopen");

    if(open) {
        alert(1);
    }

    $(this).data("isopen", !open);
});
3 голосов
/ 05 марта 2012

Ответ pimvdb мне очень помог, но я добавил пару лишних битов, чтобы справиться с активацией клавиатуры и навигацией вне выбора:

$('select').mouseup(... as in pimvdb... )
  .blur(function() {
     $(this).data('isopen', false);
  }).keyup(function(ev) {
     if (ev.keyCode == 13)
        alert(1);
  });

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

2 голосов
/ 12 октября 2011

select не предназначен для такого использования - в большинстве случаев вы можете использовать хаки, чтобы получить такое поведение, например, отслеживание событий мыши и клавиатуры на select, но нет никакой гарантии, что они 'Я буду продолжать работать или работать на каждой платформе.

Я бы предложил либо ...

  1. Сбросить select к его значению по умолчанию при изменении, и использовать другой текст, чтобы указать, какойодин «выбран», или
  2. с использованием элемента управления, отличного от select.

Можете ли вы описать конечную цель немного подробнее?

1 голос
/ 12 октября 2011

В качестве альтернативы используйте событие .blur() - http://jsfiddle.net/VKZb2/4/

Pro

Это сработает в любом случае.

Con

Он срабатывает только тогда, когда элемент управления теряет фокус.

0 голосов
/ 04 января 2013

Я столкнулся с той же проблемой. Я просто добавил событие click в теги option и изменил значение select:

$("#select option").mouseup(function() {
    $(this).parent().val($(this).attr("value"));
    // do something.
});

ПРИМЕЧАНИЕ. Это не работает на устройствах iPhone или iPad.

...