总结 - 常见的JavaScript兼容性问题
添加事件的方法 (元素, 绑定的事件类型, 事件触发的方法)
addHandler: function (element, type, handler) {
if (element.addEventListener) { // 判断是否为DOM2级方法
// 最后一个参数指定时间是否在捕获或者冒泡阶段执行
// true: 事件句柄在捕获阶段执行
// false: 默认, 事件句柄在冒泡阶段执行
element.addEventListener(type, handler, false)
} else if (element.attachEvent) { //检测是否为IE级方法
// IE只支持时间冒泡
element.attachEvent('on' + type, handler)
} else { //检测是否为DOM0级方法
// element.onclick = handler
// element[onclick] = handler -> 这种方式可以向中括号内传递变量名
element['on' + type] = handler
}
},
移除之前添加的方法
removeHandler: function (element, type, handler) {
if (element.removeEventListener) {
// 如果在element上定义的handler是匿名函数的话, 是无法被移除的
// 最后的变量指定是在哪个阶段移除事件,
// 如果在两个阶段都有添加事件, 那么久应该在两个阶段都对事件进行移除
element.removeEventListener(type, handler, false)
} else if (element.detachEvent) {
element.detachEvent(type, handler)
} else {
element['on' + type] = null
}
},
获取事件对象, 获取事件对象目标
// 事件对象, 某个事件触发的函数中, 参数表示了这个整个事件触发的一些信息和方法
// 或者整个事件触发的一个对象, 里面包含了这个事件的全部信息. 例如: clickEvent, focusEvent
getEvent: function (event) {
return event ? event : window.event
},
// target: 表示这个事件发生在哪个element上.
getTarget: function (event) {
return event.target || window.event.target
},
阻止浏览器的默认事件
// 例如a标签的默认跳转事件, 表单的回车默认提交事件
preventDefault: function (event) {
if (event.preventDefault) {
event.preventDefault()
} else {
event.returnValue = false
}
},
阻止事件冒泡
stopPropagation: function (event) {
if (event.stopPropagation) {
event.stopPropagation()
} else {
event.cancelBubble = true
}
},
获取鼠标离开进入的相关元素
getRelatedTarget: function (event) {
if (event.relatedTarget) { //判断是否为非IE
// mouseover: 返回离开的节点
// mouseout: 返回进入的节点
return event.relatedTarget
} else if (event.toElement) { // IE兼容写法
return event.toElement
} else if (event.fromElement) { // IE兼容写法
return event.fromElement
} else {
null
}
},
鼠标滚轮方法
// 非IE浏览器:
// 0: 表示主鼠标按钮
// 1: 中间的鼠标按钮
// 2: 次鼠标按钮
// IE8:
// 0: 没有按下按钮
// 1: 按下了主鼠标按钮
// 2: 按下了次鼠标按钮
// 3: 同时按下了主、次鼠标按钮
// 4: 按下了中间的鼠标按钮
// 5: 主鼠标按钮、中间鼠标按钮同时按下
// 6: 次鼠标按钮、中间鼠标按钮同时按下
// 7: 同时按下三个鼠标按钮
getButton: function (event) {
// document.implementation === Domimplementaiton
// 代表了一个接口, 提供了不依赖与任何document的方法.
// 这个接口没有特定的属性, 并且也没有继承任何属性
// hasFeature: 用来判断当前DOM, 是否支持某个特性
if (document.implementation.hasFeature('MouseEvents', "2.0")) {
return event.button
} else {
switch (event.button) {
// 因为只有按下鼠标才能执行到这, 所以再提示没有按下, 也默认为按下了主按钮
case 0:
case 1:
case 3:
case 5:
case 7:
return 0;
case 2:
case 6:
return 2;
case 4:
return 1;
}
}
},
能够获取鼠标滚轮增量增(delta)的方法
// 非firefox为event.wheelDelta属性, 属性值为 +-120
// firefox浏览器下, 属性值为 -+3, 与其他浏览器符号相反
getWheelDelta: function (event) {
if (event.wheelDelta) { //非firefox浏览器
// 在 opera 9.5版本以下, 是相反的, 引版本太老, 此处未做兼容处理
return event.wheelDelta
} else { //firefox浏览器
return -event.detail ### 40
}
},
获取按下字符编码
// 获取后的编码, 可以通过String.fromCharCode()
getCharCode: function (event) {
// 这样看的话, 应该有浏览器中有这个属性值, 并且不为undefiend.
if (typeof event.charCode == "number") {
return event.charCode
} else { // 兼容IE写法
return event.keyCode
}
},
获取剪贴板数据对象
// 这个方法只是针对, 在文本框中进行剪切(cut)、复制(copy)和粘贴(paste)这三个操作,快捷键分别是ctrl+x、ctrl+c、ctrl+v
// IE浏览器只有在文本选定字符的时, copy和cut才发生. 且在非文本框中(如div元素)只能发生copy事件
// 能够生效的方法`onpast`, `oncopy`, `oncut`, `onbeforepaste`, `onbeforecopy`, `onbeforecut`
// 在这些事件中才能去到事件对象中的剪切板
// 事件对象有三个方法: getData()、setData()和clearData ()
// getData() 参数: "text" 和 "URL"
// setData() 参数 "text" 和 "URL", 设置的文本, IE成功与否饭后布尔值, 其他浏览器无返回值
// clearData() 参数: text" 和 "URL", IE成功与否饭后布尔值, 其他浏览器返回undeifned
clipboardData: function (event) {
return clipboardData = (event.clipboardData || window.clipboardData);
},
访问剪贴板中的数据
getClipboardText: function (event) {
var clipboardData = (event.clipboardData || window.clipboardData);
return clipboardData.getData("text");
},
设置剪贴板中的数据
setClipboardText: function (event, value) {
if (event.clipboardData) {
return event.clipboardData.setData("text/plain", value);
} else if (window.clipboardData) {
return window.clipboardData.setData("text", value);
}
},
获取页面滚动的高度
// 专业且通俗一点的说法, 获取滚动条相对于其顶部的偏移
getScrollTop: function () {
return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
},
根据类名获取元素
byClassName: function (parent, className) {
if (parent.getElmentsByClassName) { // 判断是否支持直接写法
return parent.getElmentsByClassName(className)
} else { // IE
var arr = []; // 用来存储最终查找到的类名
var els = parent.getElementsByTagName('###') // 查找这个父元素下面的所有子元素
for (var i = 0; i < els.length; i++) {
var child = els[i]
var classNames = child.className.split(' ')
for (var j = 0; j < className.length; j++) {
if (classNames[j] === className) {
arr.push(child)
break
}
}
}
return arr
}
},
获取元素的行外样式
getElementStyle: function (element, styleName) {
if (element.currentStyle) { //IE
return element.currentStyle[styleName]
} else { // 非IE
return getComputedStyle(element, null)[styleName]
}
}
声明:
- 感谢作者分享.
- 起初过半的部分是根据此处整理得来: https://github.com/LuckyWinty/resetFile/blob/master/resetJS/compatible.js
总结 - 常见的JavaScript兼容性问题的更多相关文章
- IE和Firefox的Javascript兼容性总结
长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...
- 【总结】IE和Firefox的Javascript兼容性总结(转)
文章转自:http://www.cnblogs.com/wiky/archive/2010/01/09/IE-and-Firefox-Javascript-compatibility.html 长久以 ...
- [ 兼容 ] IE和Firefox的Javascript兼容性总结
长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...
- 【总结】IE和Firefox的Javascript兼容性总结
长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...
- div+css中常见的浏览器兼容性处理-兼容不同浏览器
在网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV CSS设计的网,就应该更注意IE6 IE7 FF对CSS样式的兼容,不然,你的网乱可能出去不想出现的效果! div+cs ...
- 几种常见的JavaScript混淆和反混淆工具分析实战
几种常见的JavaScript混淆和反混淆工具分析实战 xiaix2016-03-05+8共1195751人围观 ,发现 5 个不明物体WEB安全 信息安全常被描述成一场军备竞赛,白帽与黑帽,渗透测试 ...
- 常见JS(JavaScript)冲突解决方法
1.一般JS冲突解决办法 a.最容易出现的就是js的命名冲突 ①.变量名冲突 变量有全局变量和局部变量当全局变量变量和局部变量名称一致时,就会js冲突,由于变量传递数值或地址不同就会产生JavaScr ...
- 梦游前端,JavaScript兼容性
前端兼容问题出现的原因 何为操作系统?操作系统(Operating System)是管理和控制计算机硬件与软件资源的计算机程序.是的,任何的应用软件必须在操作系统的支持下运行. 大家会疑问?为什么我要 ...
- 10个常见的JavaScript BUG
译者按: 安全起见,在开发中我基本不用==. 原文: 10 COMMON JAVASCRIPT BUGS AND HOW TO AVOID THEM 译者: Fundebug 为了保证可读性,本文采用 ...
随机推荐
- Liunx之Lamp搭建笔记
1:LAMP源代码搭建用户关系 a. apache服务以daemon用户的处理请求.以root身份作为主进程. b. php源代码安装,会在httpd.conf文件里自己主动增加调用模块.可是在该文 ...
- windows下在eclipse上远程连接hadoop集群调试mapreduce错误记录
第一次跑mapreduce,记录遇到的几个问题,hadoop集群是CDH版本的,但我windows本地的jar包是直接用hadoop2.6.0的版本,并没有特意找CDH版本的 1.Exception ...
- Spring在3.1版本后的bean获取方法的改变
xml配置不变,如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...
- String,StringBuilder与StringBuffer的区别
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- CSS3 (一)
属性选择器 1. E[attr^="value"]:指定了属性名,并且有属性值,属性值是以value开头的: .wrap a[href^="http://"]{ ...
- 浅谈js执行机制
关于js执行机制,老早之前就一直想写篇文章做个总结,因为和js执行顺序的面试题碰到的特别多,每次碰到总是会去网上查,没有系统地总结,搞得每次碰到都是似懂非懂的感觉,这篇文章就系统的总结一下js执行机制 ...
- 【矩阵---求A的1到N次幂之和】
引例: Matrix Power Series: 题目大意,给定矩阵A,求A^+A^+A^+...A^N. 题解:已知X=a,可以通过以下矩阵求出ans=a^+a^+...a^=矩阵^(n+)后右上格 ...
- iOS 开发图片资源选择png格式还是jpg格式
对于iOS本地应用程序来说最简单的答案就是始终使用PNG,除非你有非常非常好的理由不用它. 当iOS应用构建的时候,Xcode会通过一种方式优化.png文件而不会优化其它文件格式.它优化得相当的好 他 ...
- BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组
BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...
- ASP.NET Core:WebAppCoreApi
ylbtech-ASP.NET Core:WebAppCoreApi 1.返回顶部 1. 2. 3. 4. 2. Controllers返回顶部 1.ValuesControlle ...