實時監聽輸入框值變化:oninput & onpropertychange

oninput 是 HTML5 的標準事件,對於檢測 textarea, input:text, input:password 和 input:search 這幾個元素經過用戶界面發生的內容變化很是有用,在內容修改後當即被觸發,不像 onchange 事件須要失去焦點才觸發。oninput 事件在主流瀏覽器的兼容狀況以下:javascript

 

  

 

  從上面表格能夠看出,oninput 事件在 IE9 如下版本不支持,須要使用 IE 特有的 onpropertychange 事件替代,這個事件在用戶界面改變或者使用腳本直接修改內容兩種狀況下都會觸發,有如下幾種狀況:php

  • 修改了 input:checkbox 或者 input:radio 元素的選擇中狀態, checked 屬性發生變化。
  • 修改了 input:text 或者 textarea 元素的值,value 屬性發生變化。
  • 修改了 select 元素的選中項,selectedIndex 屬性發生變化。

  在監聽到 onpropertychange 事件後,能夠使用 event 的 propertyName 屬性來獲取發生變化的屬性名稱。html

  集合 oninput & onpropertychange 監聽輸入框內容變化的示例代碼以下:html5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<head>
     <script type= "text/javascript" >
     // Firefox, Google Chrome, Opera, Safari, Internet Explorer from version 9
         function  OnInput (event) {
             alert ( "The new content: "  + event.target.value);
         }
     // Internet Explorer
         function  OnPropChanged (event) {
             if  (event.propertyName.toLowerCase () ==  "value" ) {
                 alert ( "The new content: "  + event.srcElement.value);
             }
         }
     </script>
</head>
<body>
     Please modify the contents of the text field.
     <input type= "text"  oninput= "OnInput (event)"  onpropertychange= "OnPropChanged (event)"  value= "Text field"  />
</body>

  使用 jQuery 庫的話,只須要同時綁定 oninput 和 onpropertychange 兩個事件就能夠了,示例代碼以下:java

1
2
3
$( 'textarea' ).bind( 'input propertychange' function () {
     $( '.msg' ).html($( this ).val().length +  ' characters' );
});

  下面是 JsFiddle 在線演示,若是不能顯示請刷新一下頁面或者點擊後面的連接(http://jsfiddle.net/PVpZf/): 瀏覽器

 

  最後須要注意的是:oninput 和 onpropertychange 這兩個事件在 IE9 中都有個小BUG,那就是經過右鍵菜單菜單中的剪切和刪除命令刪除內容的時候不會觸發,而 IE 其餘版本都是正常的,目前尚未很好的解決方案。不過 oninput & onpropertychange 仍然是監聽輸入框值變化的最佳方案,若是你們有更好的方法,歡迎參與討論。this

  參考資料:spa

相關文章
相關標籤/搜索