2015-04-07 79 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