Событие огня каждый раз, когда элемент DropDownList выбирается с помощью jQuery - PullRequest
34 голосов
/ 22 мая 2009

У меня выпадающий список: <asp:DropDownList id="dropdownid" runat="server" class=blah"/>

в моем jQuery я назначаю событие изменения следующим образом:

$('#dropdownid').change(function() {......});

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

Ответы [ 10 ]

28 голосов
/ 22 мая 2009

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

Шаг 1 : создание функции jQuery

(function($) {
    $.fn.selected = function(fn) {
        return this.each(function() {
            var clicknum = 0;
            $(this).click(function() {
                clicknum++;
                if (clicknum == 2) {
                    clicknum = 0;
                    fn(this);
                }
            });
        });
    }
})(jQuery);

Шаг 2 : убедитесь, что для вновь созданного файла функции jQuery есть ссылка на использование:

<script src="Scripts/jqDropDown.js" type="text/javascript"></script>

Шаг 3 : Использовать новую функцию:

$('#MyDropDown').selected(function() {
    //Do Whatever...
});

ОРИГИНАЛЬНАЯ ИНФОРМАЦИЯ
С вашей текущей кодовой базой, выбор того же значения из asp: DropDownList не вызовет событие изменения.

Вы можете попробовать добавить еще одну функцию jQuery для события .blur. Это срабатывает, когда элемент управления теряет фокус:

$('#dropdownid').blur(function() {......});

Если функция размытия у вас не работает, я бы добавил кнопку обновления или что-то такое, что вызывает срабатывание функции, которую вы пытаетесь использовать.

16 голосов
/ 22 мая 2009

Попробуйте это:

$(document).ready(function(){
 var clicknum = 0;
 $("#dropdownid").click(function(){
    clicknum++;
    if(clicknum == 2){
        alert($(this).val());
        clicknum = 0;
    }
 });
});

Сначала вы создаете переменную clicknum для отслеживания количества нажатий, потому что вы не хотите, чтобы событие вызывалось каждый раз, когда пользователь нажимает раскрывающийся список. Второй щелчок - это выбор, который делает пользователь.

Если число кликов равно 2, то это второй щелчок, поэтому запустите событие и сбросьте clicknum до 0 в следующий раз. В противном случае ничего не делать.

7 голосов
/ 22 мая 2009

Просто подключите обработчики событий щелчка к вложенным элементам управления вместо выбора:

$('#dropdownid option').click(function() {......});

Срабатывает только при выборе параметра из раскрывающегося списка, независимо от того, изменяется ли он.

3 голосов
/ 25 апреля 2014

Многие текущие решения сломаются во многих ситуациях. Любое решение, которое основано на проверке количества кликов дважды, будет очень непостоянным.

Некоторые сценарии для рассмотрения:

  • Если вы нажмете, затем выключите, а затем снова включите, он будет считать как щелчки, так и выстрелы.
  • В Firefox вы можете открыть меню одним щелчком мыши и перетащить к выбранной опции, даже не поднимая мышку.
  • Если вы используете любую комбинацию нажатий клавиш, вы, скорее всего, отключите счетчик кликов или вообще пропустите событие изменения.
    • Вы можете открыть раскрывающийся список с помощью Alt + (или Пробел в Chrome и Opera).
    • Когда выпадающий список имеет фокус, любая из клавиш со стрелками изменит выбор
    • Когда раскрывающееся меню открыто, нажатие Tab или Enter сделает выбор

Вот более полное расширение:

Самый надежный способ проверить, была ли выбрана опция, - это использовать событие change, которое вы можете обработать с помощью обработчика jQuery .change().

Осталось только определить, был ли исходный элемент выбран снова.
Об этом много спрашивали ( один , два , три ), но без отличного ответа в любой ситуации.

Самое простое, что нужно сделать, это проверить, не было ли click или keyup события в элементе option:selected НО Chrome, IE и safari, похоже, не поддержка событий для option элементов , даже если они соответствуют рекомендации w3c

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

Следующая лучшая вещь, похоже, обрабатывает событие blur. Это будет означать, что пользователь сфокусировался на раскрывающемся списке (возможно, видел список, возможно, нет) и принял решение, что он хотел бы придерживаться первоначального значения. Чтобы продолжить обработку изменений, мы все равно подпишемся на событие change. И чтобы мы не удваивали счет, мы установим флаг, если событие change было вызвано, поэтому мы не будем запускать дважды:

Код:

(function ($) {
    $.fn.selected = function (fn) {
        return this.each(function () {
            $(this).focus(function () {
                this.dataChanged = false;
            }).change(function () {
                this.dataChanged = true;
                fn(this);
            }).blur(function (e) {
                if (!this.dataChanged) {
                    fn(this);
                }
            });
        });
    };
})(jQuery);

Тогда звоните так:

$("#dropdownid").selected(function (e) {
    alert('You selected ' + $(e).val());
});

Обновленный пример в jsFiddle

3 голосов
/ 22 мая 2009

Согласно API :

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

Возможно, вы захотите попробовать mousedown или щелкнуть события в качестве альтернативы.

2 голосов
/ 31 декабря 2009

Проверьте это решение:
http://ledomoon.blogspot.com/2009/12/dropdown-selected-change-event-by.html

$(document).ready(function () {
    // select all the divs and make it invisible
    $("div.Content").css("display", "none");
    // Find all the combos inside the table or gridview
    $("#tblItems").find("select.Status").each(function () {
        // Attached function to the change event of each combo
        $(this).change(function () {
            if ($(this).val() == "test1") {
                // Change the visibility of the next div after the selected combo if the selected value = test1
                $(this).parent().find("div.Content").fadeIn("slow"); //css("display","block");
            } else {
                $(this).parent().find("div.Content").fadeOut("slow"); //.css("display","none");
            }
        });
    });
});

Надеюсь, это поможет

0 голосов
/ 23 августа 2012

Также:

$('#dropdownid select option').click(function() {
   ....
}
0 голосов
/ 28 сентября 2010

Для меня следующее решение работало нормально:

$("#dropdownid select").click(function() {
  alert($("#dropdownid select option:selected").html());
});
0 голосов
/ 22 мая 2009

Выбранный элемент раскрывающегося списка отображает уже сделанный выбор.

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

  1. Пользователь выбирает действие A из раскрывающегося списка.
  2. Действие A выполнено, и раскрывающийся список сброшен.
  3. Пользователь выбирает действие A из раскрывающегося списка.
  4. Действие A выполнено, и раскрывающийся список сброшен.

Надеюсь, это поможет,

Rich

0 голосов
/ 22 мая 2009

Эта проблема связана с обработкой клиентом базового выбора HTML. Так как большинство клиентов не собираются помечать не изменения, вам придется попробовать что-то другое.

Я бы, наверное, добавил кнопку "обновить" или что-то в этом роде, но я разработчик, а не дизайнер, поэтому я, вероятно, ошибаюсь. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...