处理由第三方javascript触发的onchange?

时间:2015-04-07 11:03:00

标签: javascript jquery

我有第三方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,但解决方案应该适用于所有浏览器!

2 个答案:

答案 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);