【整合】input標簽JS改變Value事件處理方法


  某人需要在時間控件給文本框賦值時,觸發事件函數。實現的效果:

  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

 


免責聲明!

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



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