添加事件的方法 (元素, 绑定的事件类型, 事件触发的方法)

  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]
}
}

声明:

总结 - 常见的JavaScript兼容性问题的更多相关文章

  1. IE和Firefox的Javascript兼容性总结

    长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...

  2. 【总结】IE和Firefox的Javascript兼容性总结(转)

    文章转自:http://www.cnblogs.com/wiky/archive/2010/01/09/IE-and-Firefox-Javascript-compatibility.html 长久以 ...

  3. [ 兼容 ] IE和Firefox的Javascript兼容性总结

    长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...

  4. 【总结】IE和Firefox的Javascript兼容性总结

    长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...

  5. div+css中常见的浏览器兼容性处理-兼容不同浏览器

    在网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV CSS设计的网,就应该更注意IE6 IE7 FF对CSS样式的兼容,不然,你的网乱可能出去不想出现的效果! div+cs ...

  6. 几种常见的JavaScript混淆和反混淆工具分析实战

    几种常见的JavaScript混淆和反混淆工具分析实战 xiaix2016-03-05+8共1195751人围观 ,发现 5 个不明物体WEB安全 信息安全常被描述成一场军备竞赛,白帽与黑帽,渗透测试 ...

  7. 常见JS(JavaScript)冲突解决方法

    1.一般JS冲突解决办法 a.最容易出现的就是js的命名冲突 ①.变量名冲突 变量有全局变量和局部变量当全局变量变量和局部变量名称一致时,就会js冲突,由于变量传递数值或地址不同就会产生JavaScr ...

  8. 梦游前端,JavaScript兼容性

    前端兼容问题出现的原因 何为操作系统?操作系统(Operating System)是管理和控制计算机硬件与软件资源的计算机程序.是的,任何的应用软件必须在操作系统的支持下运行. 大家会疑问?为什么我要 ...

  9. 10个常见的JavaScript BUG

    译者按: 安全起见,在开发中我基本不用==. 原文: 10 COMMON JAVASCRIPT BUGS AND HOW TO AVOID THEM 译者: Fundebug 为了保证可读性,本文采用 ...

随机推荐

  1. Android SDK更新失败的解决方案(原创)

    笔者在搭建好Android环境后,进行Android的SDK更新下载升级,乌龟的速度,更让人生气的是到了85%的进度时,直接timeout,循环3次无果.查阅相关资料,原来是Google的服务器遭遇了 ...

  2. Educational Codeforces Round 10 D. Nested Segments

    D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. HDU 5178 pairs —— 思维 + 二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5178 pairs Time Limit: 2000/1000 MS (Java/Others)     ...

  4. android 一个TextView设置多种颜色

    时候一个文本框为了强调内容需要显示不同颜色,用以下代码可以轻松实现 方法一:(适用于颜色变化多的情况)   //为文本框设置多种颜色 textView=(TextView)findViewById(R ...

  5. silverlight DataGrid 内嵌ComboBox 实现加载和保存

    <Grid x:Name="LayoutRoot" Background="White" Height="322" Width=&qu ...

  6. [Java] 读取文件

    1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如 ...

  7. GridFS大文件的添加、获取、查看、删除

    GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种: 存储巨大的文件,比如视频.高清图片等. 利用GridFS可以简化需求. GridFS会直接利用已经建立的 ...

  8. NOIP前的水题记录

    CF147B Smile House 二分+矩阵快速幂,注意一下储存矩阵相乘结果的矩阵,初始化时,a[i][i]=-inf(而其他都可以a[i][i]=0,为了保证答案的可二分性). CF715B C ...

  9. RDA PQ工具使用 (Adi Analysis)

    PQ工具“ColorAdjustTool.exe”,请注意芯片的选择: RDA512C选择533 RDA8501选择331 RDA8503选择131  工模菜单 COLOR LUT: R/G/B/Y/ ...

  10. Java多线程:线程状态以及wait(), notify(), notifyAll()

    一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...