如何处理兼容问题
如果两个都是属性,用逻辑||做兼容
如果有一个是方法,用三元做兼容
如果是多个属性或方法,封装函数做兼容
两个小知识点:
1、取消拖拽的默认行为:
document.ondragstart = function(){
return false
}
2、阻止右键菜单的默认行为:
document.oncontextmenu = function(){
return false
}
兼容问题:
一、运用逻辑运算符||做的相关兼容
1、关于获取滚动高度的不兼容问题
IE,Chrome: document.body.scrollTop
FF: document.documentElement.scrollTop
兼容写法:
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop
2、关于获取事件对象的兼容:
在ie中事件对象定义为window.event,
高版本浏览器必须给函数加入e作参数传递。IE忽略该参数,用window.event来读取该event。
function (e){
var e = e || window.event
}
3、获取键盘编码的兼容:
IE8 及其更早版本不支持 which 属性。不支持的浏览器可使用 keyCode 属性。
但是, keyCode 属性在 Firefox 浏览器的 onkeypress 事件中是无效的。
var x = event.which || event.keyCode;
4、关于事件委托获取事件源的兼容问题:
IE下,event对象有srcElement属性,但是没有target属性;
在高版本浏览器下,event对象有target属性,但是没有srcElement属性
function (e){
var e = e || window.event
var target = e.target || e.srcElement
}
二、运用三元表达式做的兼容
5、阻止事件冒泡的兼容
stopPropagation()是方法,是标准的写法;
cancelBubble是属性,赋值true表示阻止,是IE的写法。
function (e){
var e = e || window.event
e.stopPropagation ? e.stopPropagation : e.cancleBubble = true;
}
6、阻止浏览器的默认行为:
preventDefault()是标准写法,
returnValue()是IE写法
oA.onclick = function (eve){
var e = eve || window.event
e.preventDefault ? e.preventDefault() : e.returnValue = false
}
三、运用方法进行兼容的问题:
7、添加事件监听:
判断addEventListener是否存在,如果存在则用否则用IE8以下的版本(含IE8)的绑定方法attachEvent,removeEventListener()和detachEvent()也是一样的用法。
function addEventListener(obj,type,callback,capture){
if(obj.addEventListener){
obj.addEventListener(type,callback,capture); //标准浏览器
}else{
obj.attachEvent("on" + type,callback); //IE
}
}
参数
|
说明
|
type
|
事件类型
IE:事件需要添加'on'前缀,如on+事件
W3C:事件不需要添加'on'前缀,如事件
|
callback
|
事件的处理程序,通常是一个匿名函数
|
capture
|
浏览器模型,true(捕获模型),false(冒泡模型),默认IE8以下浏览器只支持冒泡模型,所以其值默认为false。
|
IE内核与W3C内核事件监听区别
1. 绑定语法不同
IE:attachEvent
W3C:addEventListener
2. type参数不同
IE:事件需要添加'on'前缀,如on+事件
W3C:事件不需要添加'on'前缀,如事件
3. 参数数量不同
IE:2个参数,type、callback
W3C:3个参数,type、callback、capture(浏览器模型)
4. 触发顺序不同
IE:倒序触发,先绑定后触发
W3C:正序触发,先绑定先触发
移除事件监听:
特别说明:如果一个对象向进行事件移除,那么其绑定事件监听时事件处理程序必须是有名函数,否则是无法进行移除
function removeEventListener(obj,type,callback){
if(obj.removeEventListener){
obj.removeEventListener(type,callback);
}else{
obj.detachEvent(type,callback); // IE
}
}
8、获取鼠标键值的兼容:(event.button)
function getbutton(e){
var e = e || window.event;
if(e){ //判断是否为标准浏览器
return e.button
}else if(window.event){ //判断是不是IE
switch(e.button){
case 1 : return 0;
case 4 : return 1;
case 2 : return 2;
}
}
}
9、关于使用getAttribute获取className不兼容的问题
function fn(obj){
if(obj.getAttribute("class"))==null{
return obj.getAttribute("className"); //标准浏览器不支持,ie7支持
}else{
return obj.getAttribute("class"); //标准浏览器支持,ie7不支持
}
}
10、关于getElementsByClassName("class属性名称")的不兼容问题;
function fn(obj.class属性名称){
if(obj.getElementsByClassName){
return obj.getElementsByClassName(className); //标准浏览器支持,ie8以下不支持
}else{
var list = [];
var arr = obj.getElementsByTagName(*) //上一步是获取页面所有的标签元素
for(var i = 0;i < arr.length;i ++){ //遍历所有元素,找出class名为指定名字的元素
if(arr[i].className == className){
list.push(arr[i]);
}
}
return list;
}
}
11、获取非行内样式的兼容写法
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,true)[attr];
}
12、event.pageX和event.pageY
event.pageX和event.pageY:获取鼠标相对于整个文档的水平及垂直坐标,但IE9之前的版本不支持
event.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft);
event.clientY+(document.documentElement.scrollTop||document.body.scrollTop);
13、获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条)。
对于Internet Explorer、Chrome、Firefox、Opera 以及 Safari:
window.innerHeight – 浏览器窗口的内部高度
window.innerWidth – 浏览器窗口的内部宽度
对于 Internet Explorer 8、7、6、5:
document.documentElement.clientHeight
document.documentElement.clientWidth
或者
document.body.clientHeight
document.body.clientWidth
window.innerHeight || document.documentElement.clientHeight
window.innerWidth || document.documentElement.clientWidth
- 不可错过的炒鸡棒的js迷你库
小而美被实践是最好用的,这里收藏了一些很好用的js库,他们都功能单一且非常小. COOKIE.JS https://github.com/js-coder/cookie.js 如果你操作过cooki ...
- 拖放排序插件Sortable.js 兼容好及功能全个人觉得比dragula.js 好的多
经测试,Sortable.js 兼容好和使用方便都是比较不错的,特别手机端使用很棒 介绍 Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大)下载地址:https: ...
- css js 兼容问题
js 兼容问题 1. document.form.item 问题问题:代码中存在 document.formName.item("itemName") 这样的语句,不能在FF下运 ...
- io.js - 兼容 NPM 平台的 Node.js 新分支
io.js(JavaScript I/O)是兼容 NPM 平台的 Node.js 新分支,由 Node.js 的核心开发者在 Node.js 的基础上,引入更多的 ES6 特性,它的目的是提供更快的和 ...
- 初学canvas,遇到width和height显示问题和用excanvas.js兼容IE问题
/*-----------------------ITEYE 祈祷幸福博客原创,转载请注明.-------------------*/ 第一次认真写技术博客文~~~若有不严谨的地方,望指正. 今天是第 ...
- js兼容火狐显示上传图片预览效果
js兼容火狐显示上传图片预览效果[谷歌也适用] <!doctype html> <html> <head> <meta content="text/ ...
- JS兼容各个浏览器的本地图片上传即时预览效果
JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...
- 炒鸡简单的canvas粒子(山东数漫江湖)
位图的canvas一直不会被svg比下去的原因了. 俗话说,须弥芥子,是大小之说,也有以小见大之说,颗颗粒子,足以构建宏大效果. 这是一篇炒鸡简单的canvas粒子教程,主要是讲如何粒子特效的原理,一 ...
- [转]FireFox与IE 下js兼容触发click事件的代码
本文转自:http://www.jb51.net/article/16549.htm FireFox与IE 下js兼容触发click事件 ,对于需要兼容这两者的朋友,就需要参考下下面的代码了<a ...
- Confluence 6 识别慢性能的宏
Page Profiling 给你了有关页面在载入的时候操作缓慢的邪教,你可以将下面的内容添加到调试(debug)级别: Version 3.1 及其后续版本 设置包名字为 com.atlassian ...
- Confluence 6 邮件队列
需要发送的电子邮件将会在邮件队列中进行等待,Confluence 的邮件队列每分钟刷新一次.Confluence 的管理员也可以手动的刷新邮件队列中等待发送的消息. 如果在发送的时候出现了错误,那么出 ...
- 怎么编辑PDF,如何给PDF加水印
在使用PDF文件的时候,往往会用到PDF编辑器来修改,那么,在使用PDF编辑器修改文件的时候,想要在文件中添加水印,这该怎么操作呢,不会的小伙伴可以看看下面的文章了哦,说不定就会了. 1.打开运行PD ...
- Nginx详解二:Nginx基础篇之Nginx的优点
Nginx是一个开源且高性能.可靠的HTTP中间件.代理服务 常见的HTTP服务: HTTPD--Apache基金会 IIIS--微软 GWS--Google(不对外开放) Nginx优势: 一.IO ...
- jQuery之导航菜单(点击该父节点时子节点显示,同时子节点的同级隐藏,但是同级的父节点始终显示)
注:对于同一个对象不超过3个操作的,可直接写成一行,超 过3个操作的建议每行写一个操作.这样可读性较强,可提高代码的可读性和可维护性 核心代码: $(".has_children" ...
- spring cloud 使用ribbon简单处理客户端负载均衡
假如我们的multiple服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改 ...
- Java基础知识➣面向对象(八)
概述 Java和C#都是面向对象语言,面向对象编程是目前高级语言习惯的编程模式,与C++编写过程编程而言,面向对象使用起来高效.灵活:面向对象的三个特征:封装.继承和多态. Java面向对象 1.类封 ...
- 【AtCoder】ARC071
ARC071 C - 怪文書 / Dubious Document 题目大意:给n个字符串,每个字符串可以通过扔掉一些字母将剩下的字母重排得到新的字符串,求n个字符串都能拼出的字符串且长度最大,若有多 ...
- Codeforces 877F Ann and Books 莫队
转换成前缀和, 预处理一下然后莫队. #include<bits/stdc++.h> #define LL long long #define fi first #define se se ...
- jenkins(8): 实战jenkins+gitlab持续集成发布php项目(代码不需要编译)
一. jenkins 的配置 1.前提条件安装了GitLab Plugin (源码管理使用),GitLab Hook(gitlab webhook需要) Manage Jenkins--->Ma ...