存在不同浏览器间的JS兼容总结

2016年2月19日个人博客文章--迁移到segmentfault

当我们在编写JS用于处理事件时,由于考虑到不同浏览器间Js代码兼容不同,代码不易记忆,于是做出如下整理。(当然以后还会增加更新的。。。)

示例代码如下:

(1)阻止默认事件

obj.onclick=function(ev){
        var event=ev||window.event;
        if(event.preventDefault){
            event.preventDefault();  /*W3C标准*/
        }else{
            event.returnValue=false;   /*兼容IE*/
        }
     }

小提示:return false; 也能阻止默认事件 但是要注意位置。

(2)获取下(上)一个兄弟节点

function nextnode(obj){  /*获取下一个兄弟节点*/
        if (obj.nextElementSibling) {
            return obj.nextElementSibling;
        } else{
            return obj.nextSibling;
        }
    }
function prenode(obj){ /*获取上一个兄弟节点*/

        if (obj.previousElementSibling) {
            return obj.previousElementSibling;
        } else{
            return obj.previousSibling;
        }
    }

(3)获取第一个子(最后一个)节点

function firstnode(obj){/*获取第一个子节点*/
        if (obj.firstElementChild) {
            return obj.firstElementChild;/*非IE678支持*/
        } else{
            return obj.firstChild;/*IE678支持*/
        }
    }
    function lastnode(obj){/*获取最后一个子节点*/
        if (obj.lastElementChild) {
            return obj.lastElementChild;/*非IE678支持*/
        } else{
            return obj.lastChild;/*IE678支持*/
        }
    }

(4)添加(移除)事件监听

function addEvent(obj,type,fn){ /*添加事件*/
        if(obj.addEventListener){
            obj.addEventListener(type,fn,false); //非IE添加事件监听
        }else{
            obj.attachEvent(‘on‘+type,fn); //IE添加事件绑定
            stopEvent();
        }
    }
   function removeEvent(obj,type,fn){ //移除事件
        if(obj.removeEventListener){
            obj.removeEventListener(type,fn,false); //非IE移除事件,移除事件,第三个参数必须是函数名
        }else{
            obj.detachEvent(‘on‘+type,fn); //IE移除事件
        }
    }

(5)举例click事件阻止事件传播

obj.onclick=function(ev){
            var event=ev||window.event;
            alert(‘aa‘);
            if(event.stopPropagation){
                event.stopPropagation(); //非IE阻止事件传播
            }else{
                event.cancelBubble=true; //IE阻止事件传播
            }
     }

(6)mouseover与mouseover的事件委托(经常用到,用于去除当 鼠标浮动到元素容器中不同子元素间出现闪动问题。只需在函数function(ev){} 头部添加以下代码即可)

// mouseover委托事件
    var event=ev||window.event;
    // var from=event.fromElement||event.relatedTarget;
    //在mouseover事件中from,表示鼠标来自哪个元素,也是事件委托类型,和target与srcElement相反
    // alert(from);
    var from=event.fromElement||event.relatedTarget;
    while(from){
        if (this==from) {
            return false;
        };
        from=from.parentNode;
    }
    //mouseout委托事件
    var event=ev||window.event;
        var to=event.toElement||event.relatedTarget;
        //在mouseout事件中to,表示鼠标指向那个元素,也是事件委托类型,和target与srcElement相反
        // alert(to)
        while(to){
            if (this==to) {
                return false;
            };
            to=to.parentNode;
        }

(7)滚轮事件

box.onmousewheel=function (ev){
     var event=ev||window.event;
     // box.innerHTML=‘鼠标滚动‘+event.wheelDelta;
     if (event.wheelDelta>0) {
     alert(‘鼠标前滚‘);//非火狐 前滚120
     } else{
     alert(‘鼠标后滚‘)//非火狐 后滚-120
     };
     }*/
    box.addEventListener(‘DOMMouseScroll‘,function (ev){
     var event=ev||window.event;
     alert(event.detail);//火狐前滚:-3 ,后滚:3
     },false)//IE678不支持

8.js按需加载 异步加载
demo.js如下

function test() {
    console.log(‘hello‘);
}

index.html如下

  function loadScript(url,callback){
        var script=document.createElement(‘script‘);
        script.type=‘text/javascript‘;
        if(script.readyState){ //ie
            script.onreadystatechange=function(){
                if(script.readyState==‘complete‘||script.readyState==‘loaded‘){
                    callback()
                }
            }
        }else{
            script.onload=function(){ //Safari chrome firefox opera ----Ie script不具备onload方法
                callback();
            }
        }
        script.src=url;  //写在这里是为了防止onreadystatechange状态不改变
        document.head.appendChild(script)
    }
    loadScript(‘demo.js‘,function(){test()})

原文地址:https://www.cnblogs.com/homehtml/p/11965185.html

时间: 2024-11-09 11:52:33

存在不同浏览器间的JS兼容总结的相关文章

浏览器间CSS样式兼容问题

1.display:table居中显示 在chrome和safari浏览器上兼容问题 2.滤镜 在chrome浏览器中能正常显示,在360浏览器中不能正常显示 3.省略号问题 对于一行显示,基本上对所有的浏览器而言,没有什么兼容问题,但对于多行显示时,就会存在一些问题,css3样式中有专门针对webkit浏览器多行显示的省略号,但这种样式在其他浏览器中,可能就会没有效果 更新中... 记录自己在码代码过程中遇到的问题.

JS兼容方式获取浏览器的宽度

<script type="text/javascript"> //need to wait until onload so body is available window.onload = function(){ function getWindowWidth(){ if (window.innerWidth){ return window.innerWidth; } else if (document.documentElement.clientWidth){ ret

Js获取当前浏览器支持的transform兼容写法

// 获取当前浏览器支持的transform兼容写法 function getTransfrom() { var transform = '', // document.createElement() 创建元素节点, divStyle = document.createElement('div').style, // 返回的是一组object对象,里面包含了transform // 可能涉及到的几种兼容性写法,通过循环,找出浏览器识别的那个 // 依次为: 全部.Safari 和 Chrome.

从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(转)

前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----超长文+多图预警,需要花费不少时间.---- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏览器多进程.浏览器内核多线程.JS单线程.JS运行机制的区别.那么请回复我,一定是我写的还不够清晰,我来改... ----正文开始---- 最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参

谷歌、火狐浏览器下实现JS跨域iframe高度自适应的完美解决方法,跨域调用JS不再是难题!

谷歌.火狐浏览器下实现JS跨域iframe高度自适应的解决方法 导读:今天开发的时候遇到个iframe自适应高度的问题,相信大家对这个不陌生,但是一般我们都是在同一个项目使用iframe嵌套页面,这个ifame高度自适应网上一搜一大把,今天要讲的如何在不同的网站下进行相互的调用跟在同一个网站下是一个效果:例如我在自己的项目里面Iframe  了第一博客的页面  http://www.diyibk.com/   当第一博客的页面高度变化了怎么通知父页面呢? 这个时候在谷歌下肯定是拿不到 ifram

js兼容ie获取上传excel文件名称以及大小,绝对路径

/**  *   * @param obj file对象 document.getElementById(elementId);  * @returns  */ function getExcelFileFullPath(obj){ if (obj){ // ie if (window.navigator.userAgent.indexOf("MSIE") >= 1){ obj.select(); return document.selection.createRange().t

【js】IE、FF、Chrome浏览器中的JS差异介绍

如何判断浏览器类型 转:http://www.cnblogs.com/carekee/articles/1854674.html 1.通过浏览器特有的对象 如ie 的ActiveXObject  ff 的getBoxObjectFor  opera 的window.opera  safari 的openDatabase  Chrome 的MessageEvent有趣的是,Chrome的userAgent还包含了Safari的特征,也许这就是Chrome可以运行所有Apple浏览器应用的基础吧 2

浏览器检测(BrowserDetect.js)

浏览器检测是在工作中经常用到的,如果只是简单判断当前是什么浏览器的话可以通过window.navigator.useragent这样的js来直接判断就可以了! 但是针对浏览器版本要求比较高的时候,如果只是单纯的判断浏览器的名字的话还不能解决问题,这时候就要通过其他方式来实现!现有的jquery已经废弃了$.browser的使用,所以在这里我介绍一个叫做"浏览器嗅探器"的程序来实现! 代码如下:(BrowserDetect.js) var BrowserDetect = { init:

浏览器检测(BrowserDetect.js)使用

浏览器检测是在工作中经常用到的,如果只是简单判断当前是什么浏览器的话可以通过window.navigator.useragent这样的js来直接判断就可以了! 但是针对浏览器版本要求比较高的时候,如果只是单纯的判断浏览器的名字的话还不能解决问题,这时候就要通过其他方式来实现!现有的jquery已经废弃了$.browser的使用,所以在这里我介绍一个叫做"浏览器嗅探器"的程序来实现! 代码如下:(BrowserDetect.js) var BrowserDetect = { init: