jQuery Ajax:复制 - 粘贴东西

时间:2010-05-14 19:01:04

标签: jquery copy paste

我有一个表单,其中检查输入字段的值,然后我使用typewatch插件进行Ajax调用(一个小的小东西,检测用户在预定义的间隔后停止键入)。它很棒。

由于此字段是订单中的“优惠券折扣”,因此可以通过复制粘贴电子邮件中的“优惠券代码”来输入该值。它也适用于Ctrl + C - Ctrl + V进行复制和粘贴,但不是当用户用鼠标选择文本时,单击上下文菜单中的复制然后从此菜单粘贴。

jQuery中有没有办法以某种方式检查jQuery中的这种行为?

3 个答案:

答案 0 :(得分:1)

您可以设置一个低时间(1秒),检查是自上次检查后值已更改。

您也可以忽略它,当表单提交时抓取此优惠券折扣输入的内容并进行处理。

答案 1 :(得分:0)

之前我遇到过类似的问题。据我所知,当用户通过右键单击粘贴时,浏览器不会发出任何事件,也不会从以前使用的值列表中进行选择。

我最终通过将我的事件处理程序绑定到blur事件来以足够好的方式解决它。唯一没有捕获的情况是用鼠标粘贴值,然后点击Enter键提交。我能够通过一点点hackery来解决这个问题:

$(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键的keydown上。为了让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();
    }
  });

正如Josh K之前提到的,您可以简单地将某些内容绑定到表单上的提交事件以执行类似操作。但是,如果您在那里进行Ajax,请务必在传递的选项中设置async: false,否则表单将继续提交并提交,而无需等待调用完成。

答案 2 :(得分: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
  }
});

请记住,人们总是可以通过浏览器插件绕过这一点,因此并不能保证事情按照您希望的方式进行。你应该总是执行某种服务器端验证