2015-04-07 52 views
-1

我有一个第三方JavaScript的一个按钮被点击以下面的脚本时改变文本框的值:handle onchange由第三方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

好的问题是,你有一个jQuery的事件处理程序没有触发jQuery事件流。

这可能与绑定事件的顺序有关。如果“香草”事件处理程序绑定在jQuery之前,它将首先被触发。如果它有一个重定向,如你所暗示的那样,浏览器将立即调用onunload并执行清理操作,而不执行脚本。

如果我知道你想成为捕捉此事件的结果,这将有所帮助。

,如果你想阻止你可以简单地解除绑定的事件侦听器重定向你的网页

的document.getElementById(“测试”)卸载removeEventListener(“变化”)。

如果你想要在脚本之前绑定jQuery,那么第三方必须解除绑定事件,添加jQuery事件侦听器,然后重新连接第三方事件。

在卸载之前没有其他方法可以及时拦截它,因为在添加事件处理程序时,脚本始终会将jQuery击败jQuery,除非您可以以这种方式操作脚本加载顺序,这样您的事件处理程序将首先被绑定在第三方脚本的事件处理程序之前。

这将有助于查看第三方脚本的完整示例。

+0

这首先应该是作为其不解决方案,正如我所说的'限制评论:我不能修改第三方JavaScript和我不能修改HTML的textbox.' – Peter

+0

我修改回答。 – Tschallacka

+0

感谢您修改您的答案,但这种行为发生在我的例子中,那里没有重定向? – Peter

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); 
+0

整洁的解决方案,但问题是在改变值后进行重定向(这你不知道,因为我没有在我的问题中包含它)。 – Peter