總結oninput、onchange與onpropertychange事件的使用方法和差別


前端頁面開發的非常多情況下都須要實時監聽文本框輸入,比方騰訊微博編寫140字的微博時輸入框hu9i動態顯示還能夠輸入的字數。

過去一般都使用onchange/onkeyup/onkeypress/onkeydown實現,可是這存在着一些不好的用戶體驗。

比方onchange事件僅僅在鍵盤或者鼠標操作改變對象屬性,且失去焦點時觸發,腳本觸發無效;而onkeydown/onkeypress/onkeyup在處理復制、粘貼、拖拽、長按鍵(按住鍵盤不放)等細節上並不完好。

onpropertychange屬性可在某些情況下解決上面存在的問題,不用考慮是否失去焦點。無論js操作還是鍵盤鼠標手動操作,僅僅要HTML元素屬性發生改變就可以馬上捕獲到。遺憾的是。onpropertychange為IE專屬的。其它瀏覽器下假設想要實現這一實時監聽的需求。就要用到HTML5中的標准事件oninput,只是IE9下面的瀏覽器是不支持oninput事件的。

所以我們須要綜合oninput和onpropertychange二者來實現文本區域實時監聽的功能。舉比例如以下:

例1、對支持oninput的瀏覽器用oninput。其它瀏覽器(IE6/7/8)使用onpropertychange:


var testinput = document.createElement('input');    
if('oninput' in testinput){
    object.addEventListener("input",fn,false);
}else{
    object.onpropertychange = fn;
}

例2、對全部ie使用onpropertychange,其它瀏覽器用oninput:


var ie = !!window.ActiveXObject;
if(ie){
    object.onpropertychange = fn;
}else{
    object.addEventListener("input",fn,false);
}

匯總onchange onpropertychange 和oninput事件的差別:


1、onchange事件與onpropertychange事件的差別: 
onchange事件在內容改變(兩次內容有可能還是相等的)且失去焦點時觸發;onpropertychange事件卻是實時觸發,即每添加或刪除一個字符就會觸發。通過js改變也會觸發該事件。可是該事件IE專有。

 


2、oninput事件與onpropertychange事件的差別: 
oninput事件是IE之外的大多數瀏覽器支持的事件。在value改變時觸發,實時的,即每添加或刪除一個字符就會觸發,然而通過js改變value時。卻不會觸發;onpropertychange事件是不論什么屬性改變都會觸發的,而oninput卻僅僅在value改變時觸發,oninput要通過addEventListener()來注冊,onpropertychange注冊方式跟一般事件一樣。(此處都是指在js中動態綁定事件,以實現內容與行為分離) 

3、oninput與onpropertychange失效的情況: 
(1)oninput事件:a). 當腳本中改變value時。不會觸發。b).從瀏覽器的自己主動下拉提示中選取時,不會觸發。 
(2)onpropertychange事件:當input設置為disable=true后。onpropertychange不會觸發。 

以下引用一篇譯文:

HTML5將oninput事件標准化了,該事件用來檢測用戶的輸入狀態。當然,通過使用onkeydown或者onkeyup作為取代也是能夠的。這些事件設計本意也並不是如此,參見詳情


全部的現代瀏覽器支持 oninput ,當中包含IE9。

對於那些老式瀏覽器,在不支持該事件時用keydown作為優雅降級。

不幸的是,檢測瀏覽器對該oninput事件的支持性並不easy。

假定瀏覽器支持oninput。那么下面這段js代碼的返回值為true,否則為false


'oninput' in document.createElement('input')
這段代碼在大多數瀏覽器中正常執行,除了Firefoxbug #414853),故仍舊須要為oninput作瀏覽器特性檢測。除此以外就不是必需為其它瀏覽器作特性檢測了,僅僅需為inputkeydown綁定事件。並在oninput事件觸發之后刪除onkeydown就可以。示比例如以下:
someElement.oninput = function() {   el.onkeydown = null;   // Your code goes here }; someElement.onkeydown = function() {   // Your code goes here }

keydown事件僅會被觸發一次(在oninput事件觸發前)。之后再觸發oninput。盡管並不完美。但總比寫上一大堆oninput特性檢測代碼要好些吧。


譯文部分轉自:http://blog.163.com/jinlu_hz/blog/static/1138301522011431102044154/
譯文原地址:http://mathiasbynens.be/notes/oninput
譯文原作者:mathias


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM