一.輸入框經常使用的幾個事件javascript
onblur | 元素失去焦點。 |
onchange | 域的內容被改變。 |
onclick | 當用戶點擊某個對象時調用的事件句柄。 |
ondblclick | 當用戶雙擊某個對象時調用的事件句柄。 |
onfocus | 元素得到焦點。 |
onkeydown | 某個鍵盤按鍵被按下。 |
onkeypress | 某個鍵盤按鍵被按下並鬆開。 |
onkeyup | 某個鍵盤按鍵被鬆開。 |
onpaste | 粘貼 |
oncopy | 複製 |
oncut | 剪切 |
下面對以上幾個事件進行監聽java
var events = [ 'keyup','keydown','copy','paste','input','blur','focus','keypress','change' ]; for(var i in events){ (function(i){ $addEvent(textarea,events[i], function(e){ console.log('event:' + events[i],e); }); })(i); }
總結:node
(1)關於blur focus事件 ,都只會觸發一次,什麼意思呢,就是你點擊輸入框後,會觸發一次focus事件,你在輸入框中再怎麼點都不會觸發第二次focus。blur 同理。chrome
(2)關於keydown 和 keyup,在輸入框輸入文字時,首先觸發keydown → keypress → input → keyup 事件。瀏覽器
(3)關於change事件,在火狐和chrome 下面用戶在輸入框輸入文字後,輸入框纔會觸發change事件,而後緊接着是失去焦點(blur)事件。 spa
(4)面對特殊字符的表現 對象
shift、control 只有keydown → keyup 兩個事件,由於不會改變輸入框內容,因此沒有 input 事件blog
caps lock 火狐下面 只有keydown 事件,chrome 能夠判斷是按下普通狀態仍是按下狀態,給出的分別的keyup 和 keydown 事件。事件
delete 若是刪除了輸入框的文字,觸發的事件爲ip
keydown → keypress(keypress事件在chrome 下面有,火狐沒有) → input → keyup 事件
若是文字已經全刪除,再次按delete 觸發的事件只有keydown → keyup 事件
總之:
只有輸入框中的文字內容變化了,input 事件纔會被觸發。
基本上keydown 和 keyup 就能夠監聽文本的變化了,可是沒法監聽到複製、粘貼事件(非快捷鍵)
(5)輸入法開啓時
輸入的過程當中不會出現keypress事件,觸發的是keydown → input → keyup 事件
(6)onpropertychange 方法只能用在IE中,因此在判斷一個輸入框中內容改變時,須要兼容IE 以及非IE 問題
(7)程序控制輸入框屬性(height, value , innerHTML)
在IE 中使用onpropertychange 能夠很好的進行捕獲。
在非IE 中沒法捕獲。
二.需求
如今問題來了,如何實時監聽輸入框的輸入內容呢?
方案一: 對IE 監聽onpropertychange事件,非IE 使用input 事件
var ua = navigator.userAgent.toLowerCase(); var isIE = /msie/.test(ua); var node = document.getElementById('input'); var func = function(){ //TODO } if(isIE){ node.attachEvent('onpropertychange', function(){ if(window.event.propertyName == 'value'){ //func(); } }); } else{ node.addEventListener('input',func, false); }
方案二:
不區別瀏覽器,判斷 'keyup', 'paste', 'cut', 'mousedown', 'mouseup', 'keydown', 'focus' 事件
//密集操做延時處理,減輕計算壓力 $each(['keyup', 'paste', 'cut', 'mousedown', 'mouseup', 'keydown', 'focus'], function (event, index) { $addEvent(node, event, function () { clearTimeout(me._checkTimer); me._checkTimer = setTimeout(function () { me._checkInput(); }, 500); }); });