某人需要在時間控件給文本框賦值時,觸發事件函數。實現的效果:
1、文本框支持手工輸入,通過用戶輸入修改值,手工輸入結束后觸發事件。阻塞在於失去焦點后才觸發(輸入過程中不觸發事件)
2、通過JS方法修改值,修改后觸發事件。重點阻塞在於此(JS賦值要觸發)
最終采用方案:
1、IE(IE8及以下)下使用onpropertychange實現JS賦值后觸發事件
2、需求是手工輸入結束后才觸發事件,避免在文本框實時輸入文字的時候也因為onpropertychange觸發事件,在trigger之前判斷當前焦點位置。這樣onpropertychange就對手工輸入無效;
3、實現手工輸入結束后要觸發事件,使用onchange事件
1、其他瀏覽器中也可以使用onchange模擬輸入結束后觸發事件,但是沒法使用onpropertychange事件。使用定時器模擬效果
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type"; content="text/html; charset=utf-8"> <script type="text/javascript" src="jquery-1.9.1.min.js" charset="utf-8"></script> <script> function init(){ //每次點擊給不一樣的值 var i=0; $("#testchange").on("click",function(){ $("#name").val(i); i++; }); var jsDate = ""; if(document.all){//ie8及以下 $("#name").on("change",function(){ console.log(i);//改變值后要觸發的代碼 }); $('input[type="text"]').each(function() { var that=this; if(this.attachEvent) { this.attachEvent('onpropertychange',function(e) { if($("#name").is(":focus")) return; if(e.propertyName!='value') return; debugger; $(that).trigger('change'); }); } }) } else {//非ie和IE9以上 var intervalName; intervalName = setInterval(handle,100); function handle(){ if($("#name").val() != jsDate && !$("#name").is(":focus")){//模擬失去焦點后時才會觸發 jsDate = $("#name").val(); console.log(i + " oninput");//改變值后要觸發的代碼 } }; } } </script> </head> <body onload ="init();"> <button id="testchange">JS賦值</button> <label>文本框:</label><input type="text" id="name"/> </body> </html>
總結對比在input標簽中onchange、oninput、onpropertychange對比
onchange:老東西,基本兼容所有瀏覽器。實現原理為元素得到焦點后開始監聽Value,元素失去焦點后對比前后的Value,前后Value不相等時觸發。
適用場景為:輸入內容失去焦點后,才觸發事件的場景
注:在查資料的過程中看到有的地方說onchange在非IE8以下的瀏覽器中會實時監聽文本變化,但是我在實際測試中發現並沒有實時監聽,此處有問題貨錯誤還請指教 :-D
或者是Jquery的鍋? 我測試的代碼為 $("#id").on("change",function());
oninput:html5的標准標簽。實現機制為實時監聽文本框變化,有變化就觸發事件,這個效果在用中文輸入法時很奇怪,具體的以后有時間研究。
適用場景為:文本框輸入過程中實時監聽輸入內容,觸發事件
onpropertychange:IE中元素特有的屬性,直接在底層監聽元素的屬性變化(不止是Value),任何變化都會觸發事件,包括適用JS操作
適用場景為:頁面運行期間實時監聽元素屬性變化,觸發事件,特別適用於在IE中JS操作觸發事件的場景
后記:項目原需求的實現其實最好是在控件里面更改,這里做了個奇怪的東西~ 權當學習
參考:
change,propertychange,input事件小議
http://www.cnblogs.com/AndyWithPassion/archive/2011/12/18/change_propertychange_input.html
javascript開發中使用onpropertychange,oninput事件解決onchange事件的不足
http://www.jb51.net/article/25275.htm
總結oninput、onchange與onpropertychange事件的用法和區別
http://blog.csdn.net/freshlover/article/details/39050609
實時監聽輸入框值變化的完美方案:oninput & onpropertychange
http://www.cnblogs.com/lhb25/archive/2012/11/30/oninput-and-onpropertychange-event-for-input.html