Javascript 如何从使用val()的jQuery插件侦听事件
我在我的项目中使用jQuery插件,并打算在将来对其进行更新,所以我不想更改它的代码 在插件内部,它使用Javascript 如何从使用val()的jQuery插件侦听事件,javascript,jquery,Javascript,Jquery,我在我的项目中使用jQuery插件,并打算在将来对其进行更新,所以我不想更改它的代码 在插件内部,它使用val()函数更改元素的值,但不会立即触发change事件,这意味着我无法使用如下代码监听事件: on("change", function(){ //do something; }) *详情可在此找到: 问题:是否有解决方法?如果插件出现以下情况,如何在不修改插件代码的情况下收听change事件: 使用val()修改元素value 在调用val()后不会触发change事件 我不知道它
val()
函数更改
元素的值,但不会立即触发change
事件,这意味着我无法使用如下代码监听事件:
on("change", function(){
//do something;
})
*详情可在此找到:
问题:是否有解决方法?如果插件出现以下情况,如何在不修改插件代码的情况下收听change
事件:
使用val()
修改元素value
在调用val()
后不会触发change
事件
我不知道它是否有效,因为我从未做过。然而,根据:
您可以重新定义jQuery的val函数以触发更改事件
这样,您就不必触摸插件,每次调用val()
都会触发一个事件。
示例代码包含在提供的链接中
编辑:对类似问题的回答指出,这是一种不好的做法,因为这样做有时会导致jQuery出现不可预测的行为。您可以修饰jQuery val函数
编辑:我忍不住做出建议的改变,因为这是一个很好的解决方案
//装饰.val的jQuery插件
(函数($){
var_uval=$.fn.val,
//将以前的值保存到哈希表中
值={};
$.fn.val=函数(newVal){
//基于标记偏移id和类别创建唯一键
var hashId=this.prop('nodeName').toLowerCase()+'['+this.index()+']'+'.'+'.'+'.'这个.attr('id')+'.+this.attr('class')。替换(''');
log('hashId',hashId);
if(newVal&(!values[hashId]| |(values[hashId]!==newVal))){
值[hashId]=newVal;
var ret=u val.apply(这是参数);
这个。触发(‘变更’);
返回ret;
}
console.log(“无更改”);
return u val.apply(这是参数);
}
})(jQuery);
变量$input=$(“#input”),
$changer=$(“#changer”);
$input.on('change',函数(e){
console.log('changed:'+this.value);
});
$changer.单击(函数(){
$input.val('something');
});代码>
更改
查看此小提琴以了解不同的更改事件。您可能希望尝试打开('input')事件。这似乎会在每次价值发生实际变化时触发
$("#testinput").on('input', function(e) {
$("#valuetyped-input").html(e.target.value)
});
不能,如果插件以编程方式更改值,则不会触发任何事件,唯一的修复方法是更改插件,添加一个触发器('change')
调用,看到这个答案或这个答案,但你也可以改为修补插件。@在这种情况下,如果插件作者有一天将val()
放入change
event handler中,我将得到一个无限循环,那么使用mutationobserver怎么样?它是纯javascript,并非所有浏览器都支持它,因为它是新的。我看不到任何其他解决方案不涉及使用jQuery或修改插件源代码。(另一个选项是使用setTimeout进行轮询)@MichaelRomanov请阅读代码,它不会更新您的示例,以便您理解我的意思:。在#testinput 2
中键入一些内容,您将看到#testinput
已更新,但事件未触发此操作可能会很危险,因为插件作者会将val()
放入更改事件处理程序中。这是一个有效点,但我能想到的唯一其他方法是修改插件或检查内容是否在超时时间间隔内更改。不过这有点骇人听闻。正如上面提到的@popla面一样,有一个解决方案与您的解决方案不同:在触发事件之前,它会检查值是否实际更改(stackoverflow.com/a/23635867/822711)。为我工作:)