我有第三方javascript,当使用以下脚本单击按钮时,它会更改文本框的值:
$("#button").click(function (e) {
//Code in this function is from a third party source and i can't modify it!
var elt = $("#text").get(0);
elt.value = "test";
if (document.createEventObject) {
elt.fireEvent("onchange");
} else if (document.createEvent) {
var e = document.createEvent("HTMLEvents");
e.initEvent("change", true, true);
elt.dispatchEvent(e);
}
});
但是这似乎没有触发$.change
所以如何检测到这个事件?
限制:我无法修改第三方javascript,也无法修改文本框的html。
以下不起作用:
$("#text").change(function () {
alert("Change!");
});
完整的测试来源:
<!DOCTYPE html>
<meta http-equiv="X-UA-Compatible" content="IE=10" />
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
<script src="Scripts/jquery-1.11.2.js"></script>
<script>
$(document).ready(function () {
$("#text").change(function () {
alert("Change!");
});
$("#button").click(function (e) {
//Code in this function is from a third party source and i can't modify it!
var elt = $("#text").get(0);
elt.value = "test";
if (document.createEventObject) {
elt.fireEvent("onchange");
} else if (document.createEvent) {
var e = document.createEvent("HTMLEvents");
e.initEvent("change", true, true);
elt.dispatchEvent(e);
}
});
});
</script>
</head>
<body>
<input id="text" type="text" onchange="javascript:alert('onchange')" />
<input id="button" type="button" value="Test" />
</body>
</html>
目标浏览器是IE11,但解决方案应该适用于所有浏览器!
答案 0 :(得分:0)
好的问题是你所拥有的是一个jquery less事件处理程序而不是触发jquery事件流。
这可能与绑定事件的顺序有关。如果&#34;香草&#34;事件处理程序在jQuery之前绑定它将首先被触发。如果它有隐含的重定向,浏览器将立即调用onunload并执行清理,从不执行脚本。
如果我知道你想要成为抓住这个事件的结果会有所帮助。
如果你想停止卸载,你可以简单地取消绑定重定向你的页面的事件监听器
的document.getElementById(&#39;测试&#39)。removeEventListener(&#39;变更&#39);
如果你想在脚本之前绑定jQuery,第三方有它的钩子你需要取消绑定事件,添加jQuery事件监听器然后重新连接第三方事件。
在卸载之前没有其他方法可以及时拦截它,因为脚本总是会在添加事件处理程序时击败jQuery,除非您能够以这样的方式操作脚本加载顺序,之后事件处理程序将首先被绑定第三方脚本的事件处理程序。
使用第三方脚本查看完整示例会很有帮助。
答案 1 :(得分:0)
有点奇怪的是.change()没有激活,可能作为解决方法可以设置计时器吗?
var lastValue = '';
setInterval(function() {
if ($("#text").val() != lastValue) {
lastValue = $("#text").val();
console.log('I am definitely sure the text box realy realy changed this time');
}
}, 500);