如何处理使用js兼容所有浏览器的问题
首先:如何处理兼容问题
1.如果两个都是属性,用逻辑||做兼容
2.如果有一个是方法,用三元做兼容
3.如果是多个属性或方法,封装函数做兼容
分享两个小知识点:
1、取消拖拽的默认行为:
document.ondragstart = function(){
return false
}
2、阻止右键菜单的默认行为:
document.oncontextmenu = function(){
return false
}
开始兼容问题:
一、运用逻辑运算符||做的相关兼容
1、关于获取滚动高度的不兼容问题
var scrollTop=documentElement.scrollTop
var scrollTop=document.body.scrollTop(chrome写法)
兼容写法:
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop
2、关于获取事件对象的兼容:
function (eve){
var e = eve || window.event
}
3、获取键盘编码的兼容:
function (eve){
var e = eve || window.event
var keyValue = e.keyCode || e.charCode || e.which
}
4、关于事件委托获取事件源的兼容问题:
function (eve){
var e = eve || window.event
var target = e.target || e.srcElement
}
二、运用三元表达式做的兼容
1、阻止事件冒泡的兼容
function (eve){
var e = eve || window.event
e.stopPropagation ? e.stopPropagation : e.cancleBubble = true;
}
2、阻止超链接的默认行为:
oA.onclick = function (eve){
var e = eve || window.event
e.preventDefault ? e.preventDefault() : e.returnValue = false
}
三、运用方法进行兼容的问题:
1、添加事件监听:
function addEventListener(obj,event,fn,boo){
if(obj.addEventListener){
obj.addEventListener(event,fn,boo);
}else{
obj.attachEvent("on" + event,fn);
}
}
运用:
addEventListener(oBtn,"click",fn1,false);
addEventListener(oBtn,"click",fn2,false);
addEventListener(oBtn,"click",fn3,false);
2、移除事件监听:
function removeEventListener(obj,evt,fn,boo){
if(obj.removeEventListener){
obj.removeEventListener(evt,fn,boo);
}else{
obj.detachEvent("on" + evt,fn);
}
}
removeEventListener(oBtn,"click",fn2,false);
3、获取鼠标键值的兼容:(event.button)
function getbutton(eve){
var e = eve || window.event;
if(eve){//判断是否为标准浏览器
return e.button
}else if(window.event){//判断是不是IE
switch(e.button){
case 1 : return 0;
case 4 : return 1;
case 2 : return 2;
}}}
二:关于使用getAttribute获取className不兼容的问题
<div id="box1"></div>
var oBox=document.getElementById("box1")
(1)console.log(oBox.getAttribute("className"))//标准浏览器不支持,ie7支持
(2)console.log(oBox.getAttribute("class")//标准浏览器支持,ie7不支持
兼容写法:
function fn(obj){
if(obj.getAttribute("class"))==null{
return obj.getAttribute("className");
}else{
return obj.getAttribute("class")
}
};
三:关于getElementsByClassName("class属性名称")的不兼容问题;
console.log(obj.getElementsByClassName("class属性名称"))//标准浏览器支持,ie8以下不支持
兼容写法:
function fn(obj.class属性名称){
if(obj.getElementsByClassName){
return obj.getElementsByClassName(className);
}else{
var list = [];
var arr = obj.getElementsByTagName(*)//上一步是获取页面所有的标签元素
for(var i = 0;i < arr.length;i ++){
if(arr[i].className == className){
list.push(arr[i]);
}
}
return list;}}
遍历所有元素,找出class名为指定名字的元素
四: 关于处理空白文本节点的问题
1.忽略空白文本节点
function fn(nodes){
var arr = [];
for(var i = 0;i < nodes.length;i ++){
if(nodes[i].nodeType === 3 &&
/^\s+$/.test(nodes[i].nodeValue)){
continue;
}else{
arr.push(nodes[i]);
}} return arr;}
2.删除空白文本节点:
function fn(nodes){//nodes;所有的子节点
for(var i = 0;i < nodes.length;i ++){
if(nodes[i].nodeType === 3 &&
/^\s+$/.test(nodes[i].nodeValue)){
nodes[i].parentNode.removeChild(nodes[i]);}}
return nodes
}
3.移除空白节点
function fn(node){//node:父节点
var childs = node.childnodes;//获取所有子节点
for(var i = 0;i < childs.length;i ++){
if(childs[i].nodeType === 3 &&
/^\s+$/.test(childs[i].nodeValue)){
node.removeChild(childs[i]);}}
return node;
}
五:获取非行内样式的兼容写法
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,true)[attr];
}
attr:是属性;比如
<style>#box{width:100px;}</style>
<div id = box></div>
<script>
var oBox = document.getElementById("box");
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,true[attr];
};
var s = getStyle(oBox,"width");
alert(s);
</script>
如何处理使用js兼容所有浏览器的问题的更多相关文章
- JS兼容各个浏览器的本地图片上传即时预览效果
JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...
- js兼容各个浏览器的复制功能
看似简单的复制功能,用js做起来竟然遇到各种情况.刚开始在网上搜索到复制功能的几种实现方法,但是都不兼容.最后还是用的插件代码如下 html模板 <tr> <td>1</ ...
- JS兼容IE浏览器的方法
背景 系统需要兼容蛋疼的IE6... 解决方案 *{ 兼容IE6-8 }* <!--[if lt IE 9]> <script src="@{'/public/mng/ja ...
- js兼容多浏览器的关闭当前页面
关闭当前页面,相信不少人在开发中都遇到过这个需求,但面对这么多的浏览器,要做到js的兼容还需要做特殊的处理.关于这方面网上有很多的资料,但大多都是复制粘贴的,没有达到兼容的效果,或者是效果不好. 下面 ...
- 调用iframe 中的js[兼容各种浏览器]
*chrome浏览器需要在服务器环境中测试 <!DOCTYPE html> <html> <head> <meta http-equiv="cont ...
- JS兼容各个浏览器的本地图片上传即时预览效果\、
在firefox\chrome\ie10等浏览器中可以使用HTML5中的内容实现图片即时预览效果,在IE10以下浏览器中使用滤镜来解决图片显示问题. HTML5中的FileReader对象主要是把文件 ...
- ZeroClipboard.js兼容各种浏览器复制到剪切板上
http://www.cnblogs.com/huijieoo/articles/5569990.html <script type="text/javascript" sr ...
- JS兼容所有浏览器的一段加入收藏代码,设置为首页
<script language="javascript" type="text/javascript"> function addfavorite ...
- JS获取回车事件(兼容各浏览器)
一.用到onkeydown获取事件动作, 二.用到键盘对应代码keyCode, 三. var event=arguments.callee.caller.arguments[0]||window.ev ...
随机推荐
- 移动端1px 边框完整方案(四个方向)
使用stylus(预处理) 需要一个函数接收两个参数 第一个需要在哪个方向出现边框 第二个边框颜色 $border1px(face,$color) 根据传入的方向属性,调整其他参数 l 左右方向 t ...
- J-Link驱动下载和Hex程序下载
J-LINK驱动下载 1.首先拥有硬件J-Link硬件. 2.安装J-Link驱动程序SEGGER 下载地址如下 https://www.segger.com/downloads/jlink/JLin ...
- WebView之js调用Android类的方法传递数据
1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只 ...
- SQL Server 分页技术(存储过程)
alter proc proc_getpage ), )='*', ), )='asc', @pagesize int , @pageindex int, )='' as begin declare ...
- web-故道白云&Clound的错误
web-故道白云 题目: 解题思路: 0x01 首先看到题目说html里有秘密,就看了下源代码如图, 重点在红圈那里,表示输入的变量是id,当然上一行的method="get"同时 ...
- 我们是80后 golang入坑系统
现在这个系列,已经开始两极分化了. 点赞的认为风格轻松,看着不困.反之,就有人嫌写的罗里吧嗦,上纲上线.所以善意提醒,里面不只是技术语言,还有段子.专心看技术的,千万别点!别怪我没提醒!差点忘说,版权 ...
- JavaScript学习笔记(十一)——闭包
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- 关于IDEA无法引入包和类的情况
原因:修改一些包结构后,会出现无法将类引入的情况. 通过清理缓存解决:
- 在没有DOM操作的日子里,我是怎么熬过来的(中)
前言 继上篇推送之后,在掘金.segmentfault.简书.博客园等平台上迅速收到了不俗的反馈,大部分网友都留言说感同身受,还有不少网友追问中篇何时更新.于是,闰土顺应呼声,在这个凛冽的寒冬早晨,将 ...
- postman接口测试系列:接口参数化和参数的传递
接着上一个章节时间戳和加密继续,上一节中我们使用Pre-Request Script可以正确获取时间戳和加密后的数据,接口响应结果也达到了预期目标.这里先简单说明一下接口的用例设计的测试点,截图所示 ...