修复IE9下oninput事件(原生,jq)
2015-09-17 21:58
746 查看
IE9下虽然有oninput事件,但是这个input事件只是个半成品,它无法响应删除(Backspace,Del,右键菜单删除,右键菜单剪切)。
而且最奇葩的是 IE8下可以响应删除的propertychange事件,在IE9下也无法响应删除操作。
不过我们可以用onselectionchange这个事件来帮助修正这个BUG。
onselectionchange 触发的条件有很多,其中一个就是在可编辑的元素里使用删除命令时触发。
不过onselectionchange只能绑定在document上。
接下来,要在jquery中修正这个事件,以达到使用 .on('input',callback) 在IE8即以下下绑定propertychange事件,在IE9下修正input的BUG;
先上代码然后再解释~~。
setup则是在事件绑定的时候触发,this指代当前元素,此处$.event.add换成$(this).on也是可以的。
handle则是在每次事件触发时都会执行的(前提handle是函数)。
这里并不知道handle要返回什么值才能让绑定的函数执行,所以使用了
使用时只需:
seajs.use(['fix/input-jq','$'],function(inputFix,$){
$('#input').on('input',function(e){
console.log(e)
})
})
而且最奇葩的是 IE8下可以响应删除的propertychange事件,在IE9下也无法响应删除操作。
不过我们可以用onselectionchange这个事件来帮助修正这个BUG。
onselectionchange 触发的条件有很多,其中一个就是在可编辑的元素里使用删除命令时触发。
不过onselectionchange只能绑定在document上。
module.exports=function(node,callback){ //先执行W3C if(document.addEventListener){ node.addEventListener('input',callback,false) //IE9 使用 selectionchange fix if(document.documentMode==9){ var selectionchange=function(){ callback.call(node); } node.addEventListener('focus',function(){ document.addEventListener('selectionchange',selectionchange,false); },false) node.addEventListener('blur',function(){ document.removeEventListener('selectionchange',selectionchange,false); },false) } } //lte IE8 else{ node.attachEvent('onpropertychange',function(e){ if(e.propertyName=='value'){ callback.call(node); } }) } }在页面中如下使用即可:
seajs.use('fix/input',function(oninput){ var input =document.getElementById('input'); oninput(input,function(){ console.log(this.value); }); })
接下来,要在jquery中修正这个事件,以达到使用 .on('input',callback) 在IE8即以下下绑定propertychange事件,在IE9下修正input的BUG;
先上代码然后再解释~~。
var $=require('$'); var handle=(function(){ if(!document.addEventListener){ return function(e){ if(e.originalEvent.propertyName=='value'){ e.handleObj.handler.apply(this,arguments); } } } })() var bindType=(function(){ if(window.addEventListener)return 'input'; return 'propertychange'; })() $.event.special['input']={ bindType:bindType, setup:function(){ if(document.documentMode==9){ var input=this; $.event.add(this,'focus._input',function(){ $.event.add(document,'selectionchange._input',function(){ $.event.trigger('input','',input) }); }); $.event.add(this,'blur._input',function(){ $.event.remove(document,'selectionchange._input'); }); } return false; }, handle:handle } exports.inputFixed=true;bindType接受一个字符串值,来决定真实绑定的事件名,这里使用一个立即执行的JS函数来根据浏览器返回input还是propertychange。
setup则是在事件绑定的时候触发,this指代当前元素,此处$.event.add换成$(this).on也是可以的。
handle则是在每次事件触发时都会执行的(前提handle是函数)。
这里并不知道handle要返回什么值才能让绑定的函数执行,所以使用了
e.handleObj.handler.apply(this,arguments);
使用时只需:
seajs.use(['fix/input-jq','$'],function(inputFix,$){
$('#input').on('input',function(e){
console.log(e)
})
})
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- JavaScript演示排序算法
- 2015-2016网页设计趋势分析 Web Design of Trends
- jQuery Ajax 跨域调用
- 移动端的长按事件
- jquery教程靠边站,一分钱不花让你免费学会jquery
- JQuery+Strusts1.x无刷新登录
- “百度与站长”更新:关于网站收录,删除,seo等
- jQuery菜单插件用法实例
- JQuery 初体验(建议学习jquery)
- Jquery实现的table最后一行添加样式的代码
- jQuery实现向下滑出的平滑下拉菜单效果
- jQuery 练习[一] 学习jquery的准备工作
- jquery获得页面元素的坐标值实现思路及代码
- 用vbs删除某些类型文件和磁盘空间报告的脚本
- 使用Browserify配合jQuery进行编程的超级指南
- jquery如何实现在加载完iframe的内容后再进行操作
- jquery $.ajax()取xml数据的小问题解决方法
- jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
- Jquery 表单取值赋值的一些基本操作