2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 原生JS-浏览器兼容性问题总结

原生JS-浏览器兼容性问题总结

时间:2023-09-30 20:56:18

相关推荐

原生JS-浏览器兼容性问题总结

1、获取元素:

通用

document.getElementById('id名');document.getElementsByTagName('标签名');

IE9+ 支持

document.getElementsByClassName('class名');document.querySelector('#id/.className/tag');document.querySelectorAll('#id/.className/tag');

解决方案

​ 先通过通用获取元素的方法如下,获取目标元素的父级或自己或兄弟元素,再通过通用的节点获取方法获取目标元素。(获取节点方法见2)

2、获取节点

通用

parentNode得到的是上级第一个父级 html 的父级打印documentoffsetParent得到第一个有定位的父级,从里到外查找childNodes得到的是所有孩子,是个集合(回车会造成文本节点)children仅返回所有子元素节点firstChild获取第一个子节点lastChild获取最后一个子节点nextSibling获取下一个兄弟节点(包含元素、文本节点)previousSibling获取上一个兄弟节点(包含元素、文本节点)

IE9+ 支持

firstElementChild获取第一个子元素节点lastElementChild获取最后一个子元素节点nextElementSibling 获取下一个兄弟元素节点previousElementSibling 获取上一个兄弟元素

Firefox 9 新引入:目前主流浏览器支持

parentElement 得到的是上级第一个父级元素html的父级打印null

3、获取元素样式

标准浏览器

window.getComputedStyle(元素).属性名

IE8及以下

元素.currentStyle.属性名

解决方案

原理:浏览器能力的判断

​ 在IE9及以上,返回一个函数,在IE8及以下,返回 undefined

函数封装

function getStyle(ele, attr) {if (window.getComputedStyle) {// 标准浏览器return window.getComputedStyle(ele)[attr];} else {// IE8及以下return ele.currentStyle[attr];}}

4、时间戳

通用

时间对象.getTime()

IE8及以下不支持

Date.now()

5、去除字符串左右空格

IE8及以下不支持

字符串.trim()

解决方案

封装方法

function trim(str) {var re = /^\s+|\s+$/g;return str.replace(re, '');}

6、数组方法

IE8及以下不支持

数组.indexOf(要查找的项, 查找的起始位置);

数组.lastIndexOf(要查找的项, 查找的起始位置);

Array.isArray(参数) 作用:判断参数是否是一个数组,如果是,返回true,否则返回false

forEach没有返回返回值

map、filter返回数组

every、some返回布尔值

7、input事件(内容只要发生变化时触发的事件)

IE8及以下不支持

input.oninput = function () {console.log(this.value);}

IE8及以下支持

input.onpropertychange = function () {console.log(this.value);}

8、事件对象

谷歌和IE的事件对象是:全局的event对象

标准浏览器支持:事件函数的第一个参数 通常记作ev

解决方案

var ev = ev || event; // 原理:浏览器能力的判断

9、事件源

IE支持:ev.srcElement

标准浏览器支持:ev.srcElement

解决方案

var target = ev.target || ev.srcElement; // 事件源兼容

10、鼠标相对于文档的位置

ev.pageX, ev.pageY 鼠标相对于文档的位置(IE8及以下不支持)

11、添加事件

IE8及以下不支持

元素.addEventListener(不要on的事件, 函数, 是否捕获); // 添加

元素.removeEventListener(不要on的事件, 函数, 是否捕获); // 解除

IE8及以下支持

元素.attachEvent(带on的事件, 函数); // 添加

元素.detachEvent(带on的事件, 函数); // 解除

解决方案

原理兼容原理:浏览器能力判断(在标准浏览器下返回函数,在IE8及以下返回undefined)

封装函数

添加绑定

// 添加绑定,参数:元素 事件 函数function bind(ele, attr, callback) {if (ele.addEventListener) {ele.addEventListener(attr, callback, false);} else {ele.attachEvent('on' + attr, callback);}}

解除绑定

// 解除绑定,参数:元素 事件 函数function unbind(ele, attr, callback) {if (ele.removeEventListener) {ele.removeEventListener(attr, callback, false);} else {ele.detachEvent('on' + attr, callback);}}

12、阻止冒泡

标准浏览器:ev.stopPropagation();

IE 浏览器:ev.cancelBubble = true;

解决方案

封装函数

原理兼容原理:浏览器能力判断

function stopPropagation(ev) {if (ev.stopPropagation) {// 标准浏览器ev.stopPropagation();} else {// IE8及以下ev.cancelBubble = true;}}

13、阻止事件的默认行为

标准浏览器:ev.preventDefault();

IE8及以下 :ev.returnValue = false;

解决方案

return false;存在缺陷:return后的语句不再解析执行

封装函数

function preventDefault(ev) {if (ev.preventDefault) {ev.preventDefault();} else {ev.returnValue = false;}}

14、按键事件对象属性

IE8 及以下不支持

ev.key 具体的按键

解决方案:获取按键的ASCII编码:ev.keyCode

15、滚轮事件

事件

IE和标准浏览器:onmousewheel

火狐:DOMMouseScroll,必须用addEventListener绑定

滚轮方向

IE和标准浏览器:ev.wheelDelta

火狐:ev.detail

解决方案

封装函数

// 滚轮方向兼容 向上:120 向下:-120function wheelDelta(ev) {if (ev.wheelDelta) {// IE和标准浏览器return ev.wheelDelta; // 向上:120 向下:-120} else {// 火狐return -40 * ev.detail; // 上:120下:-120}}

用(11、添加事件)中封装的方法统一

bind(div[i], 'mousewheel', fn); // IE和标准浏览器bind(div[i], 'DOMMouseScroll', fn); // 火狐

16、数组 IndexOf() 方法

arr.IndexOf() IE9及以上支持

解决方案:重写数组原型上的方法

原理:浏览器能力的判断Array.prototype.indexOfIE8 及以下打印undefined

if (!Array.prototype.indexOf) {Array.prototype.indexOf = function(val, index) {index = typeof index === 'undefined' ? 0 : index;for (var i = index; i < this.length; i++) {if (this[i] === val) {return i;}}return -1;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。