Как можно запустить функцию javascript, когда пользователь вводит текст в поле ввода или вставляет в него текст? - PullRequest
1 голос
/ 05 января 2010
$(document).ready(function() {
 $("input[id^='question']").live('keyup',function(ev){
    id=this.id.substr(8);
    if (ajaxCallTimeoutID != null)
    clearTimeout(ajaxCallTimeoutID);
ajaxCallTimeoutID = setTimeout(function(){subjectivecheck(id)}, 1000);
}); 
});

Проблема есть. Когда пользователь вставляет текст в поле ввода, вышеописанная функция не может быть запущена. Как решить эту проблему?

Ответы [ 4 ]

1 голос
/ 05 января 2010

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

Поэтому вместо .live('keyup', используйте live('change'.

Это так же хорошо, как и без смешных интервальных опросов. И просто в целях контекста, имейте в виду, что любой пользователь может отключить Javascript в браузере, когда захочет.

0 голосов
/ 05 января 2010

При событии onfocus на поле вы можете запустить таймер, чтобы проверить, изменилось ли значение поля.

А при onblur очистите этот таймер.

Вставка с помощью Ctrl + V в порядке с onkeyup, но не с помощью щелчка правой кнопкой мыши или отмены браузера.

0 голосов
/ 05 января 2010

Это не единственная проблема. Даже если бы вы могли надежно перехватывать фрагменты и вставлять их во всех браузерах, а это невозможно, есть еще способы размещения контента в поле формы. Например, на некоторых платформах при перетаскивании файла на вход вводится путь, и вы не можете его перехватить. Или пользователь может щелкнуть правой кнопкой мыши по Undo, чтобы изменить содержимое. Или Удалить. Или выберите какой-нибудь текст из ввода или другого ввода и перетащите его. И, вероятно, еще много, о чем я не думал.

Если вы хотите получать информацию обо всех изменениях в поле формы быстрее, чем onchange, я боюсь, что нет другого выбора, кроме как постоянно отслеживать value элемента в опросе setInterval.

0 голосов
/ 05 января 2010

Событие вставки (onpaste) не является стандартным - оно AFAIK поддерживается только в Internet Explorer (см .: http://msdn.microsoft.com/en-us/library/ms536955(VS.85).aspx)

Событие изменения (onchange handlder) является стандартным, но оно срабатывает только в том случае, если значение текстового поля изменилось за время между получением и потерей фокуса - т.е. обнаружение изменений требует, чтобы текстовое поле потеряло фокус.

Что вы могли бы сделать, это использовать setInterval() (http://www.w3schools.com/jsref/met_win_setinterval.asp), чтобы опросить значение текстового поля и сравнить его с предыдущим значением.

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