要達到的效果
很多情況下我們都會即時監聽輸入框值的變化,以便作出即時動作去引導瀏覽者增強網站的用戶體驗感。比如即時顯示輸入框已經被輸入的字節數,或者即時讀取輸入的值來進行搜索引導,也就是google的關聯搜索效果等
需要了解的知識
首先,我們需要了解onchange和onpropertychange的不同:
IE8下,當一個HTML元素的屬性改變的時候,都能通過 onpropertychange來即時捕獲。
onchange在屬性值改變時還必須使得當前元素失去焦點(onblur)才可以激活該事件。
了解這一點后我們發現onpropertychange的效果就是我們想要的,可是很遺憾,它只在IE8以下有效果。我們能不能找到另外一個時間來代替onpropertychange呢?
經過翻閱資料得知,在其他瀏覽器下可以使用oninput事件來達到同樣的效果,這樣我們只需要把IE8以下瀏覽器區分出來就可以。
js判斷IE瀏覽器的四種方法:
方法一:
if(window.addEventListener){ alert("not ie"); }else if(window.attachEvent){ alert("is ie"); }else{ alert("這種情況發生在不支持DHTML的老版本瀏覽器(現在一般都支持)") }
注釋:該方法在IE9及以上IE版本會彈出not ie結果
方法二:
if(document.all){ alert("IE"); }else{ alert("not ie"); }
方法三:
var navigatorName = "Microsoft Internet Explorer"; if( navigator.appName == navigatorName ){ alert("ie") }else{ alert("not ie") }
方法四:
利用了IE與標准瀏覽器在處理數組的toString方法的差異.對於標准游覽器,如果數組里面最后一個字符為逗號,JS引擎會自動剔除它.
if(!+[1,])alert("這是ie瀏覽器"); else alert("這不是ie瀏覽器");
注釋:IE8及以上版本會彈出“這不是IE瀏覽器”
判斷常用瀏覽器的方法:
var explorer =navigator.userAgent ; //ie if (explorer.indexOf("MSIE") >= 0) { alert("ie"); } //firefox else if (explorer.indexOf("Firefox") >= 0) { alert("Firefox"); } //Chrome else if(explorer.indexOf("Chrome") >= 0){ alert("Chrome"); } //Opera else if(explorer.indexOf("Opera") >= 0){ alert("Opera"); } //Safari else if(explorer.indexOf("Safari") >= 0){ alert("Safari"); } //Netscape else if(explorer.indexOf("Netscape")>= 0) { alert('Netscape'); }
到目前為止我們遇到的問題就已經解決了,開始寫代碼來實現功能。
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js監聽輸入框值的即時變化</title> </head> <body> <input type="text" id="text"> <div id="div"></div> <script type="text/javascript"> var watch = function(){ var txt = inp.value; div.innerHTML = txt; } var div = document.getElementById("div"); var inp = document.getElementById("text"); if(!+[1,]){ inp.onpropertychange = watch; }else{ inp.oninput = watch; } </script> </body> </html>