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

<select> событие изменения не запускается при использовании клавиатуры

http://jsfiddle.net/rFEER/

<select id="users">
<option value="1">jack</option>
<option value="2">brill</option>
<option value="3">antony</option>
</select>​

JS:

$("#users").change(function(){
    alert($(this).val());
})​

почему изменение события не запускается при использовании (keyup/keydown) до щелчка мыши.

4b9b3361

Ответ 1

почему изменение события не запускается при использовании (keyup/keydown) до щелчка мыши.

Он также срабатывает, когда фокус выходит из select. Вот как работает change.

Если вы хотите проактивное уведомление, вам нужно следить за change и keydown (по крайней мере, вы можете захотеть click) и обработать случай получения события, когда значение фактически не изменилось, и, вам придется обработать тот факт, что некоторые из этих событий (keydown, например) увольняются до изменения значения, поэтому вам нужно подождать момента перед обработкой события. Или посмотрите ответ SpYk3HH, который использует keyup вместо — это будет менее инициативным (не обновляясь до момента выпуска ключа, что может быть желательным), но тогда вам не нужна задержка (setTimeout) моего кода ниже.

Пример (живая копия):

HTML (я взял на себя смелость изменить значения, чтобы было ясно, что было с каждым именем):

<select id="users">
<option value="j">jack</option>
<option value="b">brill</option>
<option value="a">antony</option>
</select>​

JavaScript:

$("#users").bind("keydown change", function(){
    var box = $(this);
    setTimeout(function() {
        display(box.val());
    }, 0);
});

Примечание в 2016 году: bind в значительной степени было заменено на on. В вышесказанном вы буквально просто замените "bind" на "on".

Ответ 2

Попробуйте изменить

$("#users").change(function(){

к

$("#users").bind('change keyup', function(e) {

который должен связывать функцию yyour как для события onchange, так и при нажатии клавиши со стрелкой вниз или вверх

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

И если вы хотите окно с прокруткой для прокрутки, у меня есть отличная небольшая функциональность, я написал, что до сих пор для меня, по крайней мере, отлично работает и может быть назначено все самостоятельно, не затрагивая другие действия с клавиатурой, конечно, и с намерением на наш взгляд, это - работа по работе с клавиатурой, и поэтому вам все равно придется нажимать клавишу со стрелкой снова и снова, но она будет продолжать цикл без остановок через все параметры. Хотя, я уверен, что он будет работать и с keydown, но мы не используем его таким образом, поэтому я его не тестировал. Опять же, keydown, может не выполняться так, как предполагалось, особенно если у выбора есть только 2 или 3 варианта.

function selectInfinateScroll() {
    if ($(this).data("lastSelected")) {
        if ($(this).data("lastSelected")[0] == $(this).children("option:selected")[0]) {
            if ($(this).children("option:selected").index() == 0) {
                $(this).children("option:selected").prop("selected", false);
                $(this).children("option:last-child").prop("selected", true).change();
            }
            else {
                $(this).children("option:selected").prop("selected", false);
                $(this).children("option:first-child").prop("selected", true).change();
            };
        };
    };
    $(this).data("lastSelected", $(this).children("option:selected"));
}

$(function() {
    //  Enable 'Scrolling Through' on Select Boxes
    $("select").keyup(selectInfinateScroll);
});

ОБНОВЛЕНО!


Я оставляю исходный ответ, поскольку он использует альтернативный метод, который может быть более полезным для некоторых. Тем не менее, у меня появилась и более короткая функция, которая работает на "keydown" и плагине jQuery, используя указанную функцию, которая позволяет пользователю "удерживать" и стрелку и все равно сортировать параметры бесконечно!

Во-первых, новая функция

function keydownInfiniteSelect(e) {
    var eKey = e.which || e.key,
        selected = $(this).find("option:selected");
    if (eKey == 38 && selected.is(":first-child")) {    //    up arro
        $(this).find("option").last().prop("selected", true);    //    set value to last option
        $(this).change();    //    ensure select triggers change do to return false
        return false;    //    keeps select from skipping to second last option
    }
    else if (eKey == 40 && selected.is(":last-child")) {    //    down arro
        $(this).val($(this).find("option").first().val());    //    set value to first option
        $(this).change();    //    ensure select triggers change
        return false;    //    keeps select from skipping to second option
    }
}

Используйте как: $("select").keydown(keydownInfiniteSelect);

И стиль плагина jQuery!

(function($){$.infiniteSelect||($.extend({infiniteSelect:function(b){return b.each(function(){$(this).data("infiniteSelect")||($.fn.on?$(this).on("keydown",$.infiniteSelect.methods.keydownInfiniteSelect).data("infiniteSelect",!0):$(this).bind("keydown",$.infiniteSelect.methods.keydownInfiniteSelect).data("infiniteSelect",!0))})}}),$.fn.extend({infiniteSelect:function(){return $.infiniteSelect($(this))}}),$.infiniteSelect.methods={keydownInfiniteSelect:function(b){b=b.which||b.key;var c=$(this).find("option:selected");
if(38==b&&c.is(":first-child"))return $(this).find("option").last().prop("selected",!0),$(this).change(),!1;if(40==b&&c.is(":last-child"))return $(this).val($(this).find("option").first().val()),$(this).change(),!1}})})(jQuery);

Использовать как $("select").infiniteSelect() ИЛИ $.infiniteSelect("select")

jsFiddle of Plugin Mini fied

Необработанный скрипт плагина

PS. У меня почти есть готовый для Vanilla JavaScript JavaScript, за исключением того, что часть метода "set to last option" продолжает умирать или идет нулевым или переходит ко второму к последнему. Я просто не могу заставить его правильно установить. Если кто-то захочет исправлять и обновлять, я был бы очень обязан. См. ЗДЕСЬ

Ответ 3

Это нормальное поведение...

Указание спецификаций w3c

изменить
    Событие изменения происходит, когда элемент управления теряет фокус ввода, и его значение было изменено с момента получения фокуса. Это событие действует для INPUT, SELECT и TEXTAREA. элемент.

Ответ 4

Используя вышеприведенные ответы, я смог получить нужное мне поведение:

$( "select" ).bind('keyup', function(e) {
    $(  '#' + e.target.id ).trigger('change');
});

Ответ 5

$("#users").bind('change keyup', function(e) {

было достаточно

Ответ 6

/*After having been searching for hours i wrote my own. */



<script>
jQuery(document).ready(function () {
        /*********** SELECT PLZ ****************/
        /*********** SELECT PLZ ****************/
        /*********** SELECT PLZ ****************/
        jQuery('.dropedZip').html('' +
        '<select name="theName" id="theID" size="4" style="width: 184px" >' +
        '<option value="A">Choice A</option>' +
        '<option value="B">Choice B</option>' +
        '<option value="C">Choice C</option>' +
        '<option value="D">Choice D</option>' +
        '</select>');

        var nextOptValue = 0;
        var prevOptValue = 0;

        jQuery('#prop').keydown(function (e) {

            var key = e.which;
            if(key==13){
                var currOptValue = jQuery('select#theID > option:selected').val();// CURRENT
                alert('ausgesucht: '+currOptValue);
            }
            /* UP */
            if(key==38){
                var currOptValue = jQuery('select#theID > option:selected').val();// CURRENT
                if(currOptValue!=undefined){// CURRENT != undefined ?
                    prevOptValue = jQuery('select#theID > option:selected').prev('option').val();// PREV
                    if(prevOptValue!=undefined){// PREV != undefined ?
                        jQuery('select#theID > option:selected').removeAttr('selected');// REMOVE CURRENT
                        jQuery('select#theID > option[value='+prevOptValue+']').prop('selected',true);// SET PREV
                        jQuery('input#prop').val(prevOptValue);// SET INPUT VALUE : OTHER
                    }
                }
            }
            /* DOWN */
            if(key==40){
                if(jQuery('select#theID > option:selected').val()==undefined){// NULL
                    nextOptValue = jQuery('select#theID > option:first').val();// FIRST
                    jQuery('select#theID > option[value='+nextOptValue+']').prop('selected',true);// SET FIRST
                    jQuery('input#prop').val(nextOptValue);// SET INPUT VALUE : FIRST
                }else{
                    nextOptValue = jQuery('select#theID > option:selected').next('option').val();// NEXT
                    jQuery('select#theID > option:selected').removeAttr('selected');// REMOVE FIRST
                    jQuery('select#theID > option[value='+nextOptValue+']').prop('selected',true);// SET NEXT
                    jQuery('input#prop').val(nextOptValue);// SET INPUT VALUE : OTHER
                }

            }

        });
        /*********** SELECT PLZ ****************/
        /*********** SELECT PLZ ****************/
        /*********** SELECT PLZ ****************/


    });
</script>

        <input id="prop" type="text">
<div class="dropedZip"></div>