我有一个表单,其中检查输入字段的值,然后我使用typewatch插件进行Ajax调用(一个小的小东西,检测用户在预定义的间隔后停止键入)。它很棒。
由于此字段是订单中的“优惠券折扣”,因此可以通过复制粘贴电子邮件中的“优惠券代码”来输入该值。它也适用于Ctrl + C - Ctrl + V进行复制和粘贴,但不是当用户用鼠标选择文本时,单击上下文菜单中的复制然后从此菜单粘贴。
jQuery中有没有办法以某种方式检查jQuery中的这种行为?
答案 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
}
});
请记住,人们总是可以通过浏览器插件绕过这一点,因此并不能保证事情按照您希望的方式进行。你应该总是执行某种服务器端验证