美文网首页
常见的js兼容

常见的js兼容

作者: 浅忆_0810 | 来源:发表于2020-10-23 23:48 被阅读0次

1. 通过注释语句

<!--[if lt IE 9]> 
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js">
    // 兼容ie9以下
  </script> 
<![endif]-->

<!--[if lte IE 9]> 
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js">
    // 兼容ie9及其以下
  </script> 
<![endif]-->

2. 获取元素样式

/**
 * @param { ele } 要获取样式的元素
 */
function getStyle(ele){
  // IE || 非IE
  return ele.currentStyle || getComputedStyle(ele);
}

var oWrap = document.getElementById("wrap");
var style = getStyle(oWrap);
console.log(style.width);

3. requestAnimationFrame

浏览器专门为动画提供的API,在运行时浏览器会自动执行方法的调用,并且如果页面不是激活状态下的话,
动画会自动暂停,有效节省CPU开销,会以浏览器的最低刷新频率来调用函数

cancelAnimationFrame()  取消定时器
// 兼容写法
window.requestAnimationFrame = window.requestAnimationFrame || function(fn){
  return setTimeout(fn, 1000/60);
};
window.cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;

4. getElementsByClassName

不兼容IE8及以下
方法:
  1、通过特定标签查找
  2、遍历所有的标签查找
/**
 * 通过特定标签查找
 * @param { tagName } 要查找的元素,如:div
 * @param { className } 要查找的类名
 * @param { return } 所有包含该类名元素的数组
 */
function getClassName(tagName, className) {
  // 判断IE浏览器
  if (document.getElementsByClassName) {
    // 能使用
    return document.getElementsByClassName(className);
  } else {
    // 不能使用内置方法的IE低版本浏览器
    var arrEle = []; // 放符合条件的元素

    // 查询当前在文档的标签
    var arrNodes = document.getElementsByTagName(tagName);
    // toggle不支持IE8及以下
    for (var i = 0, len1 = arrNodes.length; i < len1; i++) {
      var nowClassName = arrNodes[i].className.split(/\s+/);
      for (var j = 0, len2 = nowClassName.length; j < len2; j++) {
        if (nowClassName[j] == className) {
          arrEle.push(arrNodes[i]); // 把查到的类名和需要类名比较,符合条件就放到数组中
          break;
        }
      }
    }
    return arrEle; // 返回数组
  }
}

var aLi = getClassName("div", "list-item");
console.log(aLi[0].innerHTML);
/**
 * 遍历所有的标签查找
 * @param { eleClassName } 要查找的类名
 * @param { return } 所有包含该类名元素的数组
 */
if (!document.getElementsByClassName) {
  // 将 undefined时取反,能进来这里一定是IE低版本
  document.getElementsByClassName = function (eleClassName) {
    var aEle = document.getElementsByTagName("*"), // 通配符,获得所有的标签
      reg = new RegExp("\\b" + eleClassName + "\\b"),
      arrEle = [];
    for (var i = 0, len = aEle.length; i < len; i++) {
      if (reg.test(aEle[i].className)) {
        arrEle.push(aEle[i]); // 为true表示,当前元素符合条件,放入数组
      }
    }
    return arrEle;
  };
}

var aLi = document.getElementsByClassName("list-item");

5. scrollTopscrollLeft

// 主流浏览器 || IE
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;

6. pageXpageYevent事件对象

/*
  event.pageX / event.pageY 相对于文档顶部和左边,不兼容IE8及以下
  event.clientX / event.clientY 相对于可视区域,无兼容性问题
*/
document.onclick = function (e) {
  // e事件对象,事件函数的第一个形参,这里面存储触发当前这一次事件的鼠标事件信息
  e = e || window.event; // 兼容IE的写法
  if (!e.pageY) {
    // IE8及以下
    // 点击时,鼠标位置离可视区域的距离 + 被滚动遮住的那一部分距离
    console.log(e.clientY + document.documentElement.scrollTop);
  } else {
    // 主流浏览器
    console.log(e.pageY);
  }
};

7. 阻止事件冒泡

document.onclick = function(e){
  e = e || window.event;
  // 主流 | IE8 及以下
  e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
};

8. 阻止默认行为

document.onclick = function(e){
  e = e || window.event;
  // 主流 | 低版本 IE
  e.preventDefault ? e.preventDefault() : e.returnValue = false;
};

9. 事件监听

/**
 * 添加事件
 * @param { ele } 要绑定的element
 * @param { type } 触发的事件类型,如:'click'
 * @param { callback } 回调函数
 * @param { bool } 指定事件是否在捕获或冒泡阶段执行 false(默认):冒泡   true:捕获
 */
function on(ele, type, callback, bool){
  // 主流 | IE8 及以下
  ele.addEventListener 
    ? ele.addEventListener(type, callback, !!bool)
    : ele.attachEvent("on"+type, callback);       
}

// 移除事件
function off(ele, type, callback,bool){
  // 主流 | IE8 及以下
  ele.removeEventListener
    ? ele.removeEventListener(type, callback, !!bool)
    : ele.detachEvent("on"+type, callback);
}

10. event.target

e = e || window.event;
// 主流 | IE
e.target = e.target || e.srcElement; // 得到当前触发事件的是哪个元素

11. 滚动事件

/**
 *  谷歌 ie
      滚轮事件 mousewheel
      方向取值 event.wheelDelta 上滚120 下滚-120

    火狐独有
      滚轮事件 DOMMouseScroll 只允许DOM2级事件绑定
      方向取值 event.detail 上滚-3 下滚3
      
 *  @param { obj } 需要绑定的事件对象
 *  @param { eFn ) 需要执行的函数
 */
function mouseWheel(obj, eFn) {
  function fn(e) {
    e = e || window.event;
    // 让滚动方向和值统一
    var direction = e.wheelDelta / 120 || -e.detail / 3;
    if (eFn.call(obj, e, direction) === false) { // 阻止默认行为
      e.preventDefault ? e.preventDefault() : e.returnValue = false;
    }
  }
  // 判断是否是火狐浏览器
  var type = document.onmousewheel === null ? "mousewheel" : "DOMMouseScroll";
  // 判断是否是IE8
  window.addEventListener ? obj.addEventListener(type, fn) :
    obj.attachEvent("on" + type, fn);
}

12. rem

(function (win, doc) {
  // 获取HTML标签 
  var docEl = doc.documentElement || document.body;
  // 判断是移动端设备还是PC,移动就采用'orientationchange',横竖屏事件,PC端就采用onresize,窗口改变事件 
  var resize = 'orientationchange' in win ? 'orientationcha nge' : 'resize';

  function rem() {
    var w = docEl.clientWidth / 720 > 1 ? 720 : docEl.clientWidth;
    docEl.style.fontSize = 100 * (w / 720) + 'px';
  }
  // 监听'DOMContent事件: DOM加载完成执行,如果DOMContent事件,那么执行rem函数
  doc.addEventListener('DOMContentLoaded', rem, false);
  // win下监听resize事件,如果resize事件,那么执行rem函数
  win.addEventListener(resize, rem, false);
})(window, document);

相关文章

  • js常见兼容

    整理一些常见的兼容 1、事件兼容 2、阻止冒泡 3、获取浏览器滚动条滚动的距离 4、文本框失去焦点: blur ...

  • js常见兼容

    1,滚动条 document.documentElement.scrollTop || document.body...

  • 常见的js兼容

    1. 通过注释语句 2. 获取元素样式 3. requestAnimationFrame 4. getEl...

  • js中比较常见的兼容

    e 事件对象的兼容 2.屏幕宽度的兼容问题,一般在是用到屏幕宽度的,比如使用rem布局来,根据屏幕宽度动态计算根节...

  • js中常见的兼容问题及其解决方法

    在编写js的代码时,总会遇到一些兼容问题,下面来总结一些常见的兼容写法: 1.获取样式的兼容写法: A. 非IE浏...

  • 浏览器兼容性问题及解决方案(JS部分)

    关于浏览器兼容性问题的姊妹篇《浏览器兼容性问题及解决方案(CSS部分)》请点击这里。 常见的JS兼容性部分的问题有...

  • js常见的事件兼容性写法

    1:获取事件及事件对象 x.onclick=function(ev){ var event=ev||window....

  • JS下载图片

    JS下载图片兼容IE

  • 文本溢出

    css单行 兼容性较好 css多行 兼容移动端和chrome js多行 可使用插件解决 Clamp.js

  • 兼容性问题

    CSS兼容性问题PC页面布局兼容JS兼容问题移动页面兼容问题 CSS兼容问题.header {_width:100...

网友评论

      本文标题:常见的js兼容

      本文链接:https://www.haomeiwen.com/subject/vbhmmktx.html