實時監聽input輸入

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

 

  

 

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

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

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

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

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 兩個事件就能夠了,示例代碼以下:瀏覽器

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 仍然是監聽輸入框值變化的最佳方案post

 

 

 

 

 

 

實時監聽input輸入的變化(兼容主流瀏覽器)

 

遇到如此需求,首先想到的是change事件,但用過change的都知道只有在input失去焦點時纔會觸發,並不能知足實時監測的需求,好比監測用戶輸入字符數。this

在通過查閱一番資料後,欣慰的發現firefox等現代瀏覽器的input有oninput這一屬性,能夠用三種方式使用它:url

1,內嵌元素方式(屬性編輯方式)spa

<input id="test" oninput="console.log('input');" type="text" />

2,句柄編輯方式

document.getElementById('test').oninput=function(){
    console.log('input');
}

3,事件偵聽方式(jquery)

$('#test').on('input',function(){
console.log('input');
})

 

可是,以上代碼僅在除了ie的瀏覽器大大們裏才work,那ie該怎麼處理呢? 在ie中有一個屬性叫作onpropertychange:

<input id="test" onpropertychange="alert('change');" type="text" />

通過調試後立刻就會發現,這個屬性是在元素的任何屬性變化時都會起做用,包括咱們這裏所提到的value,但至少是起做用了,那接下來的任務就是篩選出property爲value的變化。

document.getElementById('test').attachEvent('onpropertychange',function(e) {
    if(e.propertyName!='value') return;
    $(that).trigger('input');
});

在上面代碼中的回調函數中會傳入一個參數,爲該事件,該事件有不少屬性值,搜尋一下能夠發現有一個咱們很關心的,叫作propertyName,也就是當前發生變化的屬性名稱。而後就至關簡單了,只要在回調函數中判斷一下是否爲咱們所要的value,是的話就trigger一下‘input’事件。

 

而後,就能夠在主流瀏覽器中統一用這樣的方式來監聽‘input’事件了。

$('#test').on('input',function(){
    alert('input');
})

 

最後貼上完整代碼:

複製代碼
$('#test').on('input',function(){
    alert('input');
})

//for ie
if(document.all){
    $('input[type="text"]').each(function() {
        var that=this;

        if(this.attachEvent) {
            this.attachEvent('onpropertychange',function(e) {
                if(e.propertyName!='value') return;
                $(that).trigger('input');
            });
        }
    })
}
複製代碼

 

轉自:http://www.cnblogs.com/lhb25/archive/2012/11/30/oninput-and-onpropertychange-event-for-input.html

http://www.cnblogs.com/asie-huang/archive/2012/07/10/2585038.html

相關文章
相關標籤/搜索