2010-05-14 5 views
5

У меня есть форма, где есть поле ввода для его значения, а затем я делаю вызов Ajax с помощью плагина typewatch (маленькая вещь, которая обнаруживает, что пользователь прекратил печатать после предопределенного интервал). Он отлично работает.jQuery Ajax: Copy - Paste thingy

Поскольку это поле является «купонной скидкой» в форме заказа, значение может быть введено копией, вставляющей «код купона» из электронного письма или что-то в этом роде. Он также работает с Ctrl + C - Ctrl + V для копирования и вставки, но не тогда, когда пользователь выбирает текст с помощью мыши, клики копируют из контекстного меню, а затем вставляют из этого меню.

Есть ли способ в jQuery проверить каким-то образом поведение в jQuery?

ответ

1

Вы можете установить низкий тайм-аут (1 секунду), который проверяет, изменилось ли значение с момента последней проверки.

Вы также можете просто проигнорировать его и когда форма подает, возьмите содержимое этого скидочного купона и обработайте его.

0

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

Я в конечном итоге решил его достаточно хорошо, добавив привязку моего обработчика событий к событию размытия. Единственный случай, который не удалось поймать, - это когда они вставляют значение с помощью мыши, а затем нажмите клавишу Enter для отправки. Я смог обойти это через небольшой повозка, запряженная волами:

$(element) 
    .bind('keydown blur', handlerFunction) 
    .keydown(function(event) { 
    if (event.keyCode === 13 /* Enter Key */) { 
     event.preventDefault(); 
     event.stopPropagation(); 
    } 
    }) 
    .keyup(function(event) { 
    if (event.keyCode === 13 /* Enter Key */) { 
     $(this).closest('form').submit(); 
    } 
    }); 

По сути, это работает, потому что JQuery будет выполнять события в том порядке, они были связаны. Обычно подача формы происходит при нажатии клавиши Enter. Чтобы дать время манипулятора для выполнения своей магии, вам нужно отложить это представление формы до тех пор, пока не произойдет событие keyup, поэтому другой обработчик клавиатуры может работать первым.

Теперь вы сказали, что используете плагин, который добавляет задержку, прежде чем реагировать на событие пользователя. Это означает, что вы не сможете использовать эту технику дословно. Одна вещь, которая могла бы работать вместо этого, заключалась бы в том, чтобы вызвать функцию обработчика напрямую, прежде чем разрешать отправку формы. Чтобы сделать это, вы бы изменить последний обработчик KeyUp к:

.keyup(function(event) { // Part 2 
    if (event.keyCode === 13 /* Enter Key */) { 

     handlerFunction.call(this, event); // force it to happen now 

     $(this).closest('form').submit(); 
    } 
    }); 

Как Josh K упоминалось ранее, вы можете просто связать что-то к представить события на форме, чтобы сделать что-то подобное. Если вы делаете Ajax там, не забудьте установить async: false в пройденных параметрах, потому что в противном случае форма будет продолжена и будет отправлена, не дожидаясь завершения вызова.

0

(это решение не было проверено, но!) Я хотел бы попробовать что-то вроде этого:

var keys_pressed = 0; // count the number of key press events 
var required_keys_pressed = 10; 
$('#yourinputElement').keydown (function() { 
    keys_pressed++; // add one 
}); 
$('#yourform').submit (function() { 
    if (keys_pressed < required_keys_pressed) 
    { 
    // not enough keys pressed or was a CTRL + v 
    } 
    else 
    { 
    // required number of keys pressed for your code 
    } 
}); 

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