总结 - 常见的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 为了保证可读性,本文采用 ...
随机推荐
- SSM整理笔记1——SSM网站初步功能设计
前言 因为公司里一直用Hibernate,但是现在Mybatis是趋势,所以搭建一个Mybatis的网站框架,目的是:1摸清其功能特点,2为以后的项目增加框架选择(以前只用hibernate或者Spr ...
- redis中的五种基本的数据结构
1 String 基本的数据类型. 2 list 2.1 将元素放入一个list中 rpush mylist A rpush mylist B rpush mylist A 如果mylist本来是不存 ...
- luogu2704 炮兵阵地 状态压缩DP
题目大意:一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),在每一格平原地形上最多可以布置一支炮兵部队,能攻击到的区域:沿横向左右各两格,沿纵向上 ...
- 利用QBuffer和QLinkedList做数据块存储队列
Qt中QByteArray存储数据很方便,使用QBuffer存储大块数据更方便.QBuffer类包装了QByteArray类对象,实际存储还是使用了QByteArray,但QBuffer实现了QIOD ...
- 使用a标签下载文件,而不是直接打开,使用属性 download
有的时候,下载的链接文件如果是普通文件类型,如txt,我们下载文件的时候,有的浏览器不会弹出下载框,.而是直接打开了该文件. 针对这种情况,我们只需要在a标签上加上download属性即可显示下载框. ...
- HashTable HashMap区分
主要是安全.速度: 1.HashMap可以接受null的键. 2.HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多 ...
- Tomcat启动报:invalid LOC header (bad signature)的问题
原因:这种一般是因为项目依赖的某个jar包损坏引起的, 解决办法: 1.右键项目,选择maven,更新(update maven project) 2.通过右击项目名 -> Run as -& ...
- spin_lock、spin_lock_irq、spin_lock_irqsave区别
void spin_lock(spinlock_t *lock); void spin_lock_irq(spinlock_t *lock); void spin_lock_irqsave(spinl ...
- 【Java】通过移除空行和注释来压缩 JavaScript 代码
1. [代码]JavaScriptCompressor.java/** * This file is part of the Echo Web Application Framework (herei ...
- 第一次通过AVD Manager创建了一个虚拟设备,但是在Android Studio运行程序时却无设备可选
第一次通过AVD Manager创建了一个虚拟设备,但是在Android Studio运行程序时却无设备可选 原因是adb.exe未运行起来 至于adb.exe未正常运行起来的原因多半是5037端口被 ...