jQuery: дважды срабатывает текстовое поле

У меня есть текстовое поле, и мне назначена следующая функция (это единственная назначенная функция):

txt.bind("keyup",function(event){
    if(event.keyCode==13)
    {
        var nu = $("#debug").html();
        nu+="<br>enter";
        $("#debug").html(nu);
    }
});

Странно то, что на самом деле он срабатывает дважды, поэтому в моем окне отладки дважды отображается «enter». Кто-нибудь знает, что вызывает это?


person Fuxi    schedule 05.03.2010    source источник
comment
в моем случае я использовал сканер, и он имитировал нажатия клавиш для каждого набранного символа, поэтому я использовал инструмент обнаружения jquery, codepen.io/krissco/pen/XdywLo решил мою проблему, его время проверки между каждым нажатием, чтобы различать обычные нажатия клавиш :)   -  person shareef    schedule 21.01.2018


Ответы (8)


Я знаю, что это было довольно давно, но я удивлен, что никто не предложил:

txt.unbind();
txt.bind("keyup",function(event){
    if(event.keyCode==13)
    {
        var nu = $("#debug").html();
        nu+="<br>enter";
        $("#debug").html(nu);
    }
});

Если каким-то образом txt уже была привязана, вызов unbind перед новой привязкой должен это исправить. Конечно, предпочтительнее выяснить, почему он связан дважды. Это только что случилось со мной, потому что я случайно дважды включил свой файл JavaScript. Вызов unbind помог мне определить, в чем проблема.

person Dave    schedule 01.08.2014

я сам узнал - txt.bind дважды был назначен текстовому полю, поэтому он дважды срабатывал. это ошибка? я думал, что привязка функции всегда будет срабатывать только один раз.. хм

person Fuxi    schedule 05.03.2010
comment
Это не ошибка, потому что вы можете захотеть, чтобы две отдельные функции срабатывали при нажатии клавиши. Вы просто должны быть осторожны при создании привязки. - person EndangeredMassa; 05.03.2010

У меня та же проблема: события keyup и keydown запускаются дважды, хотя их обработчики привязаны только один раз, и я определенно привязываю их только к одному элементу.

Интересно, что такое поведение можно наблюдать только в Internet Explorer и только в одном особом случае, когда мое веб-приложение отображается во встроенном элементе управления ActiveX (CLSID_InternetExplorer). ОС: Windows 7, IE 8, встроенный элемент управления ActiveX работает в режиме совместимости с IE7.

Однако я нашел обходной путь - обработать событие jQuery keypress, что также имело более семантический смысл в моем случае. веб-приложение.

person martinsb    schedule 10.11.2010
comment
Я могу подтвердить, что проблема связана с событием keyup, даже в (последней на данный момент) версии jQuery v3.3.1. Изменение его на нажатие клавиши решает проблему. - person Zoltán Hajdú; 07.02.2018

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

person Wade Price    schedule 13.05.2019

У меня была похожая проблема
обнаружил, что объект с назначенной функцией keyup был внутри другого объекта
сначала был div, второй был input
обнаружил, что keyup был назначен на ввод и на div с этим вводом

person antiqe    schedule 01.02.2012

У меня такая же проблема. Хотя я еще не смог найти решение, я нашел причину, по которой он срабатывает дважды.

Я передаю событие, если введенный текст имеет "@". Для этого я перечисляю каждое нажатие клавиши. Чтобы ввести '@', вам нужны две прецессии клавиш (@+shift), и именно поэтому он срабатывает дважды.

person user3363533    schedule 28.04.2015
comment
Очевидно, если подумать! :-) - person toepoke.co.uk; 05.12.2015

возможно ли, что ваш html-элемент дважды содержится в txt?

было бы полезно, если бы вы предоставили html и код назначения javascript.

person Phil Rykoff    schedule 05.03.2010

Вот мой обходной путь для той же проблемы:

$('input').live('keyup keydown', function(e) {
    var thisKey = e.keyCode ? e.keyCode : e.which;
    if (thisKey == 13) {
        e.preventDefault();
        e.stopPropagation();
        if (e.type == 'keyup') {
            $(this).closest('form').submit();   
        }
    }
});
person Spencer Mark    schedule 27.06.2012