我有一个表单,其中检查输入字段的值,然后我使用 typewatch 插件进行 Ajax 调用(检测用户在预定义的时间间隔后停止输入的小东西)。它工作得很好。
由于此字段是订单中的“优惠券折扣”,因此可以通过复制粘贴电子邮件或其他内容中的“优惠券代码”来输入该值。它也适用于 Ctrl+C - Ctrl+V 用于复制和粘贴,但当用户用鼠标选择文本、单击上下文菜单中的复制然后从该菜单粘贴时,则无效。
jQuery中有没有办法以某种方式检查jQuery中的这种行为?
您可以设置一个较短的超时时间(1 秒),以检查自上次检查以来该值是否已更改。
您也可以简单地忽略它,并在提交表单时获取此优惠券折扣输入的内容并进行处理。
我以前也有过类似的问题。据我所知,当用户通过右键单击粘贴时,浏览器不会发出任何事件,也不会在他们从先前使用的值列表中选择时发出任何事件。
通过将我的事件处理程序另外绑定到 blur 事件,我最终以足够好的方式解决了它。唯一没有发现的情况是当他们用鼠标粘贴一个值,然后按 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();
}
});
正如 Josh K 之前提到的,您可以简单地将某些内容绑定到表单上的提交事件以执行类似的操作。但是,如果您在那里使用 Ajax,请确保async: false
在传递的选项中进行设置,否则表单将继续并提交,而无需等待调用完成。
(此解决方案尚未经过测试,但是!)我会尝试这样的事情:
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
}
});
请记住,尽管人们总是可以通过浏览器插件绕过这一点,因此并不能保证事情会按照您希望的方式进行。您也应该始终执行某种服务器端验证