JQuery Ajax: Копировать - Вставить чтоли - PullRequest
5 голосов
/ 14 мая 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 14 мая 2010

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

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

0 голосов
/ 29 мая 2010

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

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
  }
});

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

0 голосов
/ 20 мая 2010

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

В итоге я решил ее достаточно хорошо, связав обработчик событий с событием размытия. Единственный случай, когда это не уловилось, это когда они вставили значение мышью, а затем нажали клавишу 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 мог запускаться первым.

Итак, вы сказали, что используете плагин, который добавляет задержку перед реакцией на событие пользователя. Это означает, что вы не сможете использовать эту технику дословно. Вместо этого может сработать прямой вызов функции-обработчика перед тем, как разрешить отправку формы. Для этого вы должны изменить последний обработчик 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();
    }
  });

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

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