Javascript jQuery maskedinput触发器在粘贴时完成两次
我用jQuery maskedinput面对这个bug 在屏蔽输入上粘贴值会触发两次已完成事件。 这种行为可以在他们的官方网站上看到 打开链接并单击Javascript jQuery maskedinput触发器在粘贴时完成两次,javascript,jquery,maskedinput,Javascript,Jquery,Maskedinput,我用jQuery maskedinput面对这个bug 在屏蔽输入上粘贴值会触发两次已完成事件。 这种行为可以在他们的官方网站上看到 打开链接并单击Demo。 选择产品密钥输入并键入aa-999-a999。 之后,尝试在字段中粘贴相同的值 还有一些其他问题与在粘贴时不触发事件有关,但这些问题都没有帮助我解决这个错误 有人知道为什么或者有类似的问题吗 提前感谢。所以我尝试了这样一个最简单的例子(用于maskedinput.js,不过请注意,我在下面和jquery-1.11.2.js中对其进行了编辑
Demo
。
选择产品密钥
输入并键入aa-999-a999
。
之后,尝试在字段中粘贴相同的值
还有一些其他问题与在粘贴时不触发事件有关,但这些问题都没有帮助我解决这个错误
有人知道为什么或者有类似的问题吗
提前感谢。所以我尝试了这样一个最简单的例子(用于
maskedinput.js
,不过请注意,我在下面和jquery-1.11.2.js
中对其进行了编辑):
在粘贴内容时,将为“相同”操作调用两个事件处理程序
这两个函数最终都调用了tryfirepleted
,这将触发我们在自己的代码行中设置的.completed
函数,如上所示:
$("#tin").mask("99-9999999",{completed:function(){alert("Now you typed: "+this.val());}});
如果删除粘贴.mask
事件处理程序,该问题将消失。以下是关键部分:
.on(“input.mask paste.mask”,
…变为…
.on(“input.mask”,
…因此,
paste.mask
消失了。(当然,在发布到生产环境之前,请删除console.log
行。)
现在,这可能完全可以自己工作了。粘贴触发了输入
,因此使用粘贴
可能会有点过火。但在将其用作永久修复之前,我会仔细检查。我尝试过用鼠标右键单击粘贴,这很好。不确定何时触发粘贴
,并且输入
t
如果存在调用了paste
而没有调用input
的边缘情况(或者您确实希望tryFireCompleted
触发两次),则需要找到一种方法,用更复杂的代码抑制第二次tryFireCompleted
如果没有
完成的
功能,我不认为触发两次不会是一个明显的问题,这也解释了为什么这可能会漏掉。很好的发现。只是快速查看了一下,但它看起来像是模糊事件
触发了检查值
,而产品
只有掩码
调用了警报
。这通常是一个双重罪魁祸首。请尝试添加completed:function(){alert(“现在键入:“+this.val());}
到另一个处理程序?嘿@ruffin,谢谢你的帮助。你说得对,blurEvent激发checkVal,这可能是个问题。你说“将完成的函数添加到另一个处理程序”是什么意思?不可能更清楚!我正在使用console.log东西进行调试,但方式不同。我会做出你建议的更改,然后再这样做现在应该足够了。我将在周末尝试寻找新的东西……非常感谢,伙计!标记为已接受!干杯!好交易。很高兴它有帮助!
}).on("blur.mask", blurEvent).on("keydown.mask", keydownEvent).on("keypress.mask", keypressEvent).on("input.mask", function() {
console.log("mask called: " + arguments[0].type); // <<< New debugging line.
input.prop("readonly") || setTimeout(function() {
var pos = checkVal(!0);
input.caret(pos);
tryFireCompleted("mask");
}, 0);
}), chrome && android && input.off("input.mask").on("input.mask", androidInputEvent),
mask called: paste
mask called: input
$("#tin").mask("99-9999999",{completed:function(){alert("Now you typed: "+this.val());}});