首页 > 代码库 > 深入理解DOM事件类型系列第五篇——文本事件

深入理解DOM事件类型系列第五篇——文本事件

×
目录
[1]change [2]textInput [3]input[4]propertychange[5]兼容

前面的话

  如果DOM结构发生变化,触发的是变动事件;如果文本框中的文本发生变化,触发的是文本事件

  HTML5为input控件新增了很多type属性,大大增加了input控件的应用场景。其中一个是type="range"的input控件,可以通过拖动游标改变value值,但并不是所有浏览器都可以实时显示,除了IE10+浏览器

<input type="range" min="0" max="10" step="0.5" value="6" />

<iframe style="width: 100%; height: 50px;" src="http://sandbox.runjs.cn/show/iwlms4om" frameborder="0" width="320" height="240"></iframe>

  那么哪些文本事件可以实时监测游标变化呢?本文将以此为引子详细介绍文本事件

 

change

  说起文本变化,最先想到的可能就是change事件

  对于<input>和<textarea>元素,在它们失去焦点且value值改变时触发;对于<select>元素,在其选项改变时触发

<input id="test" value="请改变内容并移除焦点"><script>test.onchange = function(){    test.style.backgroundColor = pink;}</script>

<iframe style="width: 100%; height: 50px;" src="http://sandbox.runjs.cn/show/kzfgingc" frameborder="0" width="320" height="240"></iframe>

  只有在IE浏览器下,change事件对游标实时变化起作用;其他浏览器下,必须松开鼠标后,change事件才起作用

<input id="test" type="range" min="0" max="10" value="6" /><span id="result"></span><script>test.onchange = function(){    result.innerHTML = test.value;}</script>

<iframe style="width: 100%; height: 50px;" src="http://sandbox.runjs.cn/show/cpggwhw4" frameborder="0" width="320" height="240"></iframe>

textInput

  D0M3级事件引人了一个新事件——textInput,用来替代keypress事件。当用户在可编辑区域中输入字符时,就会触发这个事件

  [注意]该事件只支持DOM2级事件处理程序,且只有chrome和safari浏览器支持

  textInput与keypress事件有两点不同

  【1】textInput事件只会在用户按下能够输人实际字符的键时才会被触发,而keypress事件则在按下那些能够影响文本显示的键时也会触发(如回车键)

  【2】任何可以获得焦点的元素都可以触发keypress事件,但只有可编辑区域才能触发textInput事件

<button id="test">按钮</button><script>//控制台只输出1,不输出2test.onkeypress = function(){console.log(1);}test.addEventListener(textInput,function(){console.log(2)})</script>
<input id="test"><script>//控制台以1-2的顺序输出test.onkeypress = function(){console.log(1);}test.addEventListener(textInput,function(){console.log(2)})</script>

  由于textInput事件主要考虑的是字符,因此它的event对象中还包含一个dada属性,这个属性的值就是用户输入的字符

  比如用户在小写模式下,按下了S键,data值就是‘s‘,而如果在大写模式下按下该键,data的值就是‘S‘

<input id="test"><span id="result"></span><script>test.addEventListener(textInput,function(e){    e = e || event;    result.innerHTML = e.data;})</script>

<iframe style="width: 100%; height: 40px;" src="http://sandbox.runjs.cn/show/3tr0hlvi" frameborder="0" width="320" height="240"></iframe>

  由于<input type="range">的游标并不是可编辑区域,所以,textInput事件对游标变化无作用

 

input

  文本事件中,除了textInput事件,还有一个input事件

  HTML5新增了一个input事件,只要输入框内容发生变化就会立即触发,但通过javascript改变value时不会触发

  所以这事件与change事件的区别就是不需要移除焦点就可以触发

  [注意]该事件IE8-浏览器不支持

<input id="test"><script>test.oninput = function(){    this.style.background = pink;}</script>

<iframe style="width: 100%; height: 50px;" src="http://sandbox.runjs.cn/show/npv9x9sj" frameborder="0" width="320" height="240"></iframe>

  该事件可以在chrome/safari/firefox/IE9浏览器中,实时监测游标的变化

<input type="range" id="input"><span id="result"></span><script>    input.oninput = function(){        result.innerHTML = this.value;    }</script>

<iframe style="width: 100%; height: 50px;" src="http://sandbox.runjs.cn/show/0ezwtgj6" frameborder="0" width="320" height="240"></iframe>

propertychange

  IE有一个专有事件叫propertychange事件,该事件会在设置disable="true"时失效。propertychange触发函数只有一个默认参数,是所有可以触发属性的集合。该事件是在触发对象改变任何属性时都会触发

  [注意]IE11浏览器不支持

<input type="range" id="input"><span id="data"></span><script>    input.onpropertychange = function(){        data.innerHTML = this.value;    }</script>

<iframe style="width: 100%; height: 50px;" src="http://sandbox.runjs.cn/show/tyovorwa" frameborder="0" width="320" height="240"></iframe>

兼容

  如果要使游标变化实现全浏览器兼容,使用input和change事件可以实现

<input type="range" id="test"><span id="result"></span><script>//通过userAgent检测IE浏览器function isIE(){    var ua = navigator.userAgent;    //检测Trident引擎,IE8+    if(/Trident/.test(ua)){        //IE11+        if(/rv:(\d+)/.test(ua)){            return RegExp["$1"];        }            //IE8-IE10            if(/MSIE (\d+)/.test(ua)){            return RegExp["$1"];        }            }    //检测IE标识,IE7-    if(/MSIE (\d+)/.test(ua)){        return RegExp["$1"];    }    }//IE浏览器if(isIE()){    test.onchange = function(){        result.innerHTML = this.value;    }//其他浏览器}else{    test.oninput = function(){        result.innerHTML = this.value;    }}</script>

<iframe style="width: 100%; height: 50px;" src="http://sandbox.runjs.cn/show/zyjcipm0" frameborder="0" width="320" height="240"></iframe>

<script type="text/javascript">// 0){ return; } if(select[i].getBoundingClientRect().top <= 0 && select[i+1]){ if(select[i+1].getBoundingClientRect().top > 0){ change(oCon.children[i+2]) } }else{ change(oCon.children[select.length+1]) } }}document.body.onmousewheel = wheel;document.body.addEventListener(‘DOMMouseScroll‘,wheel,false);var oCon = document.getElementById("content");var close = oCon.getElementsByTagName(‘span‘)[0];close.onclick = function(){ if(this.innerHTML == ‘显示目录‘){ this.innerHTML = ‘ב; this.style.background = ‘‘; oCon.style.border = ‘2px solid #ccc‘; oCon.style.width = ‘‘; oCon.style.height = ‘‘; oCon.style.overflow = ‘‘; oCon.style.lineHeight = ‘30px‘; }else{ this.innerHTML = ‘显示目录‘; this.style.background = ‘#3399ff‘; oCon.style.border = ‘none‘; oCon.style.width = ‘60px‘; oCon.style.height = ‘30px‘; oCon.style.overflow = ‘hidden‘; oCon.style.lineHeight = ‘‘; }}for(var i = 2; i < oCon.children.length; i++){ oCon.children[i].onmouseover = function(){ this.style.color = ‘#3399ff‘; } oCon.children[i].onmouseout = function(){ this.style.color = ‘inherit‘; if(this.mark){ this.style.color = ‘#3399ff‘; } } oCon.children[i].onclick = function(){ change(this); } }function change(_this){ for(var i = 2; i < oCon.children.length; i++){ oCon.children[i].mark = false; oCon.children[i].style.color = ‘inherit‘; oCon.children[i].style.textDecoration = ‘none‘; oCon.children[i].style.borderColor = ‘transparent‘; } _this.mark = true; _this.style.color = ‘#3399ff‘; _this.style.textDecoration = ‘underline‘; _this.style.borderColor = ‘#2175bc‘; }// ]]></script><script type="text/javascript" src="http://files.cnblogs.com/files/xiaohuochai/contextMenu.js"></script>

深入理解DOM事件类型系列第五篇——文本事件