input事件在ie9以下不兼容问题完美解决

上周四好不容易加了几天班把刚接手的一个pc页面做完,周五同事说要兼容ie7~ie9,结果在上面一跑,输入都没法输入。

我的需求是用6个span作为虚拟的密码输入框,实际上是用一个藏在页面里的input来实现输入的。如下图

上面是我要实现的页面,和页面结构dom,就是点击span的的父节点div的时候,要让input获取焦点。左边是input,为了给大家展示就先不藏起来了,对了,千万别用display:none来隐藏input,否则无法获取焦点。

先来给大家复习一下input标签的所有事件:

1. focus  当input 获取到焦点时触发

2. blur  当input失去焦点时触发,注意:这个事件触发的前提是已经获取了焦点再失去焦点的时候会触发相应的js

3. change 当input失去焦点并且它的value值发生变化时触发

4. keydown 在 input中有键按住的时候执行一些代码

5. keyup 在input中有键抬起的时候触发的事件,在此事件触发之前一定触发了onkeydown事件

6. click  主要是用于 input type=button,当被点击时触发此事件

7. select  当input里的内容文本被选中后执行一段,只要选择了就会触发,不是非得全部选中

8. input  当input的value值发生变化时就会触发,不用等到失去焦点(与onchange的区别)

开始我一直是用谷歌浏览器调试的,用的input事件,每次用户的输入和删除都可以完美的监听到,但一到ie8上,input事件就失效了,ie9以下版本根本不支持。

这时就需要用到ie专属的onpropertychange事件

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

经过调试后马上就会发现,这个属性是在元素的任何属性变化时都会起作用,包括我们这里所提到的value,但至少是起作用了,那接下来的任务就是筛选出property为value的变化。以下的attachEvent是ie的绑事件方法。

document.getElementById(‘test‘).attachEvent(‘onpropertychange‘,function(e) {
    if(e.propertyName!=‘value‘) return;
    /*    input值变化触发回调方法    ...  */});

但经过我测试,ie8上点backspace按钮删除的时候,不进事件啊,怎么ie会有这么多蛋疼的问题,查了很多资料都无法很好的解决这个问题,只能自己来用keydown事件实现了。

$(‘input‘).bind(‘keydown‘,function(e){
      if(e.keyCode==8||e.keyCode==46){ //处理回退与删除    
     //每删除input末位一个字符时的回调方法
  }
}) 

但是keydown事件,每次进入,都是在value里的最后一个字符未被删除之前,比如我开始输入了123,我按下删除按钮,断点进了keydown事件,但此时获取input的value还是123,这该如何是好。于是我先记录删除前的value,再在事件里面获取删除后的value,如果删除后的value长度比删除前的小,就进我的回调方法。

var len=self.setpsd.value().length;  //获取删除前长度
this.setpsd.bind(‘keydown‘,function(e){
       if(e.keyCode==8||e.keyCode==46){
               var newlen=self.setpsd.value().length;  //获取删除后长度
               if(newlen<len){
                     //每删除input末位一个字符时的回调方法
               }
       }
})                

处理完以上这些,又遇到个问题,就是在ie8中当我输入过程中,点了下页面其他地方,失去了焦点,再点到span上,重新获取焦点,但此时光标不在我已输入字符的后面,而跑到最前面去了,这样我就死活删除不了已输入的内容了,因为用户是无法操作那藏起来的input的。

要操作光标的位置我们都有耳闻,textRange对象,没错,你答对了一半。因为textRange是IE私有对象

那么我们怎么获取textRange对象呢?查看IE的DHTML文档。

从文档中我们得到了creatTextRange方法可以创建textRange对象。

通过文档api的筛选,我们看到,红框中的几个方法对我们有用。这里,我提一下select方法,select方法文档上的翻译是“将当前选中区置为当前对象”。这句话怎么理解呢?

这句话是说,我们通过createTextRange方法创建了textRange对象,注意是创建,也就是说原本不存在这个对象。然后我们使用这个对象的collapse或者move,moveStart方法的时候,操作的都是textRange对象,而最后的状态表现是在input对象上的,select方法的作用就是,把textRange对象上的操作影印到input对象上的文本区域中。

明白了select方法,我们看collapse方法:将插入点移动到当前范围的开始或者结束。

有点英语水平的,上面的介绍应该能看懂,就是说我们要想让光标移动到末尾话应该传入false,

那么使用collapse的方法代码应该是(我们定义是在itext上的onfocus事件)

document.getElementById("psd").onfocus=focushandler;
    function focushandler(){
        if(this.createTextRange){
            var rg=this.createTextRange();
            rg.collapse(false);
            rg.select();
        }
    }

就这么几句,完美解决我的问题,不需要用到什么move、moveStart、moveEnd方法。更详细的请看http://webfront-js.com/articaldetail/29.html

对了,最后介绍下如果判断是ie浏览器,最简单的方法就是

if(!!document.all){
    //ie浏览器处理
}

在 IE 中 document.all 的布尔值是 true ,其他浏览器都是 false。

时间: 2024-11-10 14:13:43

input事件在ie9以下不兼容问题完美解决的相关文章

HTML5 input事件检测输入框变化

之前一直用change事件来监听输入框内容是否发生变化,只有当输入框失去焦点时才会触发,没想到html5还有个input事件,只要输入框内容发生变化就会立即触发,既然有这么好的东西我们干嘛放着不用呢,接下来就来给大家介绍一下: 如果我们页面上有这样一个简单到极致的输入框: 1 <input type="text"> 那么我们现在用jquery给它绑定input事件,如下: 1 $("input:text").bind("input proper

input事件中文触发多次问题研究

我们在网页中经常会遇到实时搜索的情况,或者其他类似需要input实时响应的问题,一般情况下,我们是利用input和propertychange事件来监听input内容的变化来响应,但是有一个问题就是当输入汉字的时候,可能我们要输入 '实时' 的时候,我们的input框中会出现 'shishi'直到我们的空格才会变成 '实时',这也就意味着我们依次响应了 's','sh','shi','shis','shish','shishi','实时',前面的结果明显不是我们需要的 ,造成了我们很多次无用的提

Android4.0 input事件输入流程详解(中间层到应用层)

在Android系统中,类似于键盘按键.触摸屏等事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序进行处理.系统启动时,窗口管理服务也会启动,该服务启动过程中,会通过系统输入管理器InputManager来负责监控键盘消息.当某一个Activity激活时,会在该Service下注册一个接收消息的通道,表明可以处理具体的消息,然后当有消息时,InputManager就会分发给当前处于激活状态下的Activity进行处理. InputManager的启动

input 光标在 chrome下不兼容 解决方案

input 光标在 chrome下不兼容 解决方案 height: 52px; line-height: normal; line-height:52px\9 .list li input[type=text] { width: 304px; height: 52px; line-height: normal; line-height: 52px\9; border: none; color: #FFFFFF; background: url(../images/txt-bg.png) no-r

即时搜索:对于ios自带输入法输入中文时多次触发input事件的处理

实现移动端的即时搜索的最佳方案,一定是使用input propertychange事件了,但是在ios设备上遇到了问题,使用ios自带输入法输入汉字时,会出现多次触发input事件的情况,一开始可能由于搜索的关键字不得法,没有即时找到合适的方案,后来终于在网上找到了解决方案,现记录如下: 代码实现 /** * @param flag: 用于标记是否是非直接的文字输入 */ var flag = false; $('#id').on({ 'compositionstart': function()

input 事件监听的顺序

1.  keydown事件发生时,输入值并没有发生变化,所以keydown可用于阻止某些输入字符的显示. 2.  input事件发生时,无法获取到keyCode值,并且紧随在keydown事件之后. 3.  keyup事件最后发生,一次键盘敲入事件彻底完成. 4.  change事件只会发生在输入完成后,也就是输入框失去焦点之前. 原文地址:https://www.cnblogs.com/fenwen/p/12202507.html

在谷歌浏览器下vue的@input事件问题

在谷歌浏览器下vue的@input事件问题:input输入中文,在输入拼音的时候就在触发(360不这样) 原文链接:https://blog.csdn.net/m0_37817986/article/details/103079249 <input v-on:input="searchOne($event,item.ind)" v-on:compositionstart="flagg=false" v-on:compositionend="flagg

让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法转

让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式).搜狗浏览器等浏览器下均没有问题,而在IE8及IE11下发现样式无法显示,然后各种百度啊,最后在 雅朋网 的一个网友帖子的帮助下解决了问题,也参考了 千寻学习网 的资料,先将解决方法总结如下: 首先需要确保你的HTML页面开始部分要有DOC

转载------让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法

本文是转载及收藏 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式).搜狗浏览器等浏览器下均没有问题,而在IE8及IE11下发现样式无法显示,然后各种百度啊,最后在 雅朋网 的一个网友帖子的帮助下解决了问题,也参考了 千寻学习网 的资料,先将解决方法总结如下: 首先需要确保你的HTML页面