第二十八课:focusin与focusout,submit,oninput事件的修复
focusin与focusout
这两个事件是IE的私有实现,能冒泡,它代表获得焦点或失去焦点的事件。现在只有Firefox不支持focusin,focusout事件。其实另外两个事件focus和blur是用来实现获取焦点和失去焦点的事件,但是由于这两个事件不能冒泡,所以很多浏览器就使用focusin,focusout来代替它,但是火狐不支持这两个事件,所以暂时还不能使用focusin,focusout事件代替focus和blur事件。
那么兼容性写法是怎么样的呢?如下:
if (document.addEventListener) { //如果是W3C的方式,就用捕获的机制(从父元素到目标元素),来实现冒泡的机制(从目标元素到父元素),这样父元素就能获得目标元素的focus和blur事件了
el.addEventListener('focus', focusHandler, true);
el.addEventListener('blur', blurHandler, true);
} else {
el.onfocusin = focusHandler; //IE不支持捕获阶段,但是支持focusin和focusout这两个事件,这两个事件本身就是冒泡的。因此父元素能获得目标元素的focus和blur事件
el.onfocusout = blurHandler;
}
当然另外一种写法是:
if("onfocusin" in form){
addEvent(form,"focusin",focusHandler,false); //第一个参数为绑定的元素,第二个是事件类型,第三个是事件处理函数,第四个是是否捕获阶段,false代表冒泡。
addEvent(form,"focusout",blurHandler,false);
}
else{
addEvent(form,"focus",focusHandler,true); //第一个参数为绑定的元素,第二个是事件类型,第三个是事件处理函数,第四个是是否捕获阶段,true代表捕获。
addEvent(form,"blur",blurHandler,true);
}
submit事件
在IE6-8下,submit不会冒泡到顶层,它只执行form元素的submit回调,冒泡到form元素,就提交跳转。submit事件跟鼠标事件和键盘事件不一样,它是一种复合事件,既可以通过鼠标事件实现,也可以通过键盘事件实现。
如果我们通过鼠标或者键盘来触发submit事件:在IE9+以及其他标准浏览器会触发form元素以及祖先元素一直到window的submit事件,才会跳转。IE8-,只触发到form元素的submit事件就跳转了。它们都不会触发form元素之内的元素绑定的submit事件的回调方法,因此submit事件的回调方法只能放在form元素中。
怎么来解决这个兼容性问题呢:
我们对submit事件进行处理,如果触发submit事件时,使用的是事件代理,那么就在代理元素上绑定两个事件,click,keypress。如果是键盘事件,根据keyCode是否为13(键盘事件keypress,当keyCode=13时,就代表用户按了enter按键,就代表用户正在触发submit事件,提交数据。这里的enter按键需要是在input元素中触发才行,IE下type=file的input也可以。),如果是点击事件,根据input元素的type属性值是否是submit,image(鼠标click事件,当点击的input是submit或image类型时,就代表用户正在触发submit事件,提交数据)。是的话,就手动模拟冒泡(因为submit事件在IE6-8下只能冒泡到form元素,因此手动模拟)。把submit事件一直模拟冒泡到window对象(这时代理元素就能触发submit事件了)。
如果最后都没有阻止默认行为,就通过el.submit()方法提交数据,进行跳转。el.submit()方法,不会执行submit回调的(也就是说执行el.submit方法会提交数据,进行跳转,但是不会执行submit的事件处理函数),而其他的click,blur,focus这样的DOM方法会同时执行回调和默认行为的。
reset事件跟submit事件一样,解决办法也一样,只是keyCode值不一样或者type的属性值不一样而已。
oninput事件
在做搜索框的智能提示,微博发布区@好友出现列表等功能时,我们需要监听输入框内部的变化。如果使用change事件,只能等失去焦点时才会触发回调,如果使用keydown,keypress,keyup,这几个键盘事件来监听,就监听不了右键的复制,剪贴,粘贴这些操作,这时我们就需要oninput事件了。
oninput事件是W3C提出来的,IE9才支持,但IE9对回退键,粘贴复制操作的监听也失灵,解决办法,用onkeydown解决回退键,oncut和onpaste解决粘贴复制操作(也可以通过onselectionchange事件来解决)。IE6-8下通过onpropertychange事件监听元素一切属性与特性的变化,因此可以通过它模拟oninput事件(事件对象的propertyName属性获取当前变动的属性名)。
兼容写法如下:
if(window.addEventListener){ //IE9+,以及其他标准浏览器
element.addEventListener("input",callback);
}
else{
element.attachEvent("onpropertychange",function(e){ //如果是IE6-8,input元素上的任何属性有变化就会触发
if(e.propertyName === "value"){ //如果是value属性有变化,就会触发回调
callback();
}
})
}
if(IE9){ //解决IE9下,input事件对回退,粘贴复制操作的失灵
var selectionchange = function(e){
if(e.type === "focus"){
document.addEventListener("selectionchange",callback);
}else{
document.removeEventListener("selectionchange",callback);
}
}
element.addEventListener("focus",selectionchange); //input获得焦点就绑定document的selectionchange事件,因此在input中的任何操作都会冒泡到document中
element.addEventListener("blur",selectionchange); //input失去焦点,就移除这个绑定事件
}
跟事件相关的操作已经全部讲完了,如果想做兼容性的操作,还是有点复杂的,大家认真看吧。
下面的课程将会讲到异步处理,敬请期待。
加油!
第二十八课:focusin与focusout,submit,oninput事件的修复的更多相关文章
- NeHe OpenGL教程 第二十八课:贝塞尔曲面
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Python学习第二十八课——Django(templates)
templates 讲后台得到的数据渲染到页面上:话不多说,先看具体代码. urls: from django.conf.urls import url from django.contrib imp ...
- Python学习第二十八课——Django(urls)
Django框架中的urls配置: 首先通过pycharm创建一个Django项目: 例如要写blog的功能:则在digango_lesson中的urls代码如下: """ ...
- 潭州课堂25班:Ph201805201 django 项目 第二十八课 新闻elasticsearch搜索前后功台能实现 (课堂笔记)
后端功能实现 文件,类,字段,命名不要改动, 在apps/news/search_indexes.py中创建如下类:(名称固定为search_indexes.py) # -*-# -*- coding ...
- python第二十八课——编码小常识
2.内存和硬盘: 内存:计算机硬件组成部分之一,它是一个容器,用来存储数据:处理数据速度快, 存储数据量小:断电死机数据会丢失,短暂性存储数据 硬盘:计算机硬件组成部分之一,它是一个容器,用来存储数据 ...
- Spring入门第二十八课
事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播,例如:方法可能继续在现有事务中运行,也可能开启一个新的事务,并在自己的事务中运行. 事务的传播行为可以由传播属性指定.Spr ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第十八课:二次几何体
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课
centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 ...
随机推荐
- HTML5客户端数据存储
HTML5 使在不影响网站性能的情况下存储大量数据成为可能.之前,这些都是由 cookie 完成的,cookie不适合大量数据的存储,因为会影响速度. 举个例子: var obj = {x:1}; / ...
- c#分页读取GB文本文件
应用场景: a.我在做BI开发测试的时候,有可能面对source文件数GB的情况,如果使用一般的文本编辑器,则会卡死,或要等很久才能显示出来. b.有时候,我们使用ascii(01)或ascii(02 ...
- Hadoop 概述
Hadoop 是 Apache 基金会下的一个开源分布式计算平台,以 HDFS 分布式文件系统 和 MapReduce 分布式计算框架为核心,为用户提供底层细节透明的分布式基础设施.目前,Hadoop ...
- CentOS 6.5上MySQL安装部署与入门。
centos 6.5 yum 安装mysql1. 安装软件:yum install -y mysql-server mysql mysql-devel2.启动服务:service mysqld sta ...
- A*算法详解 BZOJ 1085骑士精神
转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...
- ADS(一)
LC匹配 已知输入输出阻抗,设计LC匹配电路使输入输出阻抗共轭匹配 Step1 Step2 Result1 Result2 微带线单枝匹配 已知源和负载阻抗,求微带线单枝匹配电路 Step1 ...
- readonly与const
readonly与const 在C#中,readonly 与 const 都是定义常量,但不同之处在于:readonly 是运行时常量,而 const 是编译时常量. ; public void Te ...
- codeforces 477A A. Dreamoon and Sums(数学)
题目链接: A. Dreamoon and Sums time limit per test 1.5 seconds memory limit per test 256 megabytes input ...
- 2014 Super Training #8 B Consecutive Blocks --排序+贪心
当时不知道怎么下手,后来一看原来就是排个序然后乱搞就行了. 解法不想写了,可见:http://blog.csdn.net/u013368721/article/details/28071241 其实就 ...
- java 11-8 在大串中查找小串的案例
1.统计大串中小串出现的次数 举例: 在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun& ...