要达到的效果
很多情况下我们都会即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感。比如即时显示输入框已经被输入的字节数,或者即时读取输入的值来进行搜索引导,也就是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>