首页 web前端 js教程 一些js中兼容性易错问题的总结

一些js中兼容性易错问题的总结

Dec 18, 2017 am 11:26 AM
javascript 兼容性

关于js兼容问题我们也遇到过很多,本文就为大家分享一篇总结js中的一些兼容性易错的问题,具有很好的参考价值,希望对大家有所帮助,希望能帮助到大家。

一、属性相关

我们通常把特征(attribute)和属性(property)统称为属性,但是他们确实是不同的概念,

特征(attribute)会表现在HTML文本中,对特征的修改一定会表现在元素的outerHTML中,并且特征只存在于元素节点中;

属性(property)是对于JS对象进行修改,除了浏览器内置的部分特征外,其它的属性操作并不会影响HTML文本。

1. IE6/7不区分属性和特征

其它浏览器会区分属性和特征,而IE67并不会区分它们,在IE67下我们只能用属性名来删除特征,虽然这两个名字很多时候一样,但总会有不一样的地方。

2. IE6/7不能通过getAttribute/setAttribute来操作值不为字符串的特征

在现代浏览器中getAttribute一定会返回HTML中对应的字符串,而IE67返回的结果不可预知,因此在IE67下,我们要用AttributeNode来操作属性。

3. IE6/7/8不能通过style属性来获取CSS文本

这个问题应当是IE6/7不区分属性和特征的后遗症,在获取style这个属性的时候,使用elem.style.cssText就好了。

4. IE6/7会解析相对URL成为绝对URL

这个问题甚至导致了IE6/7下空的src属性会产生重复的请求,可以使用getAttribute('href/src', 4)。

5. 元素特征的默认行为不同

这一类的BUG会比较多,比如在一些旧的webkit浏览器里面,checkbox/radio 的默认值为"",而不是on。在一些旧的webkit浏览器select的第一个元素不会被选中。

二、样式操作

通常情况下,样式包括获取和设置行内样式以及获取元素的计算出的样式

1. IE支持background-position-x/y而其它浏览器不支持

background-position-x/y可以用来方便的渐变一个图片的位置,不支持的情况下我们可以考虑使用解析background-position属性的来处理。

2. IE6/7不支持opacity属性

可以通过alpha滤镜来实现相同的效果,不过要记得触发元素的haslayout。

3. IE6/7/8会错误的让clone产生的节点继承一些属性

比如background,修改一个两个同时会改。

4. 不同的获取计算出样式的方式

IE6/7/8使用elem.currentStyle而其它浏览器要用window.getComputedStyle函数。

5.不同的像素化方式

像素化指的是将单位不是像素的距离转换成像素,以方便进行计算。严格的说这不是一个兼容性问题,但可能全用到。在IE6/7/8中,我们可以使用elem.runtimeStyle配合pixelLeft来进行处理。

而现代浏览器可以使用width属性处理。

6. 一些获取CSS时的BUG行为

在Webkti核心的浏览器中,margin-right经常会出错。

三、查询操作

查询通过指的是通过一些特征字符串来找到一组元素,或者判断元素是不是满足字符串。

1. IE6/7不区分id和name

在IE6/7下使用getElementById和getElementsByName时会同时返回id或name与给定值相同的元素。由于name通常由后端约定,因此我们在写JS时,应保证id不与name重复。

2. IE6/7不支持getElementsByClassName和querySelectorAll

这两个函数从IE8开始支持的,因此在IE6/7下,我们实际可以用的只有getElementByTagName。

3. IE6/7不支持getElementsByTagName('*')会返回非元素节点

要么不用*,要么自己写个函数过滤一下。

4. IE8下querySelectorAll对属性选择器不友好

几乎所有浏览器预定义的属性都有了问题,尽量使用自定义属性或者不用属性选择器。

5. IE8下querySelectorAll不支持伪类

有时候伪类是很好用,IE8并不支持,jquery提供的:first、:last、:even、:odd、:eq、:nth、:lt、:gt并不是伪类,我们在任何时间都不要使用它们。

6. IE9的matches函数不能处理不在DOM树上的元素

只要元素不在dom树上,一定会返回false,实在不行把元素丢在body里面匹配完了再删掉吧,当然了我们也可以自己写匹配函数以避免回流。

四. 事件操作

通常一问大家JS的兼容性,第一反应都会是attachEvent和addEventListener,但是关于这两个函数的区别,也还是有很多的细节。

1. 事件作用对象不同

addEventListener为事件冒泡到的当前对象,而attachEvent是window。

. 事件参数对象不同

一定要注意,attachEvent绑定的函数有参数e,不要再写e = e || event了,不过两者的参数属性有很多的差别,如button还是witch,支持不支持pageY等等。

2. 万恶的滚轮事件

滚轮事件的支持可谓是乱七八糟,规律如下:
IE6-11 chrome mousewheel wheelDetla 下 -120 上 120

firefox DOMMouseScroll detail 下3 上-3

firefox wheel detlaY 下3 上-3

IE9-11 wheel deltaY 下40 上-40

chrome wheel deltaY 下100 上-100

3. 三大不冒泡事件

所有浏览器的focus/blur事件都不冒泡,万幸的是大部分浏览器支持focusin/focusout事件,不过可恶的firefox连这个都不支持。

IE678下submit事件不冒泡。

IE678下change事件要等到blur时才触发。

而我们没有什么有效的手段去解决这三个问题,只能通过模拟触发的方式来处理。

4. a.click()

这方法在很多浏览器下都不安全,一执行哪怕阻止了默认行为,还是会造成页面跳转。

五、节点操作

节点操作通常指的是复制、生成一个节点或者移动节点的位置。

1.. innerHTML

IE6/7/8使用innerHTML时必须在前面有一个文本节点,不然会造成很多标签丢失。另外很多情况下使用innerHTML会造成defaultValue属性出错。

2. 无用的tbody

IE6/7/8会给空的table自动加一个空的tbody

3. cloneNode时会复制attachEvent的事件

并且除非我们记录了我们绑定的事件,否则我们没办法解绑他们。

相关推荐:

html和css中常见的浏览器兼容性问题

JavaScript中关于兼容性能的具体分析

JavaScript字符串操作方法和浏览器兼容性实例详解

以上是一些js中兼容性易错问题的总结的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

蓝牙5.3和5.2版本的比较及差异解析 蓝牙5.3和5.2版本的比较及差异解析 Dec 28, 2023 pm 06:08 PM

现在有不少手机都号称支持蓝牙5.3版本,那么蓝牙5.3和5.2的区别是什么呢,其实它们本质上都是蓝牙5的后续更新版本,在大部分的性能和功能上是没有多少区别的。蓝牙5.3和5.2的区别:一、数据速率1、5.3能够支持更高的数据速率最高可达2Mbps。2、而5.2只能最高达到1Mbps,则说明5.3能够更快、更稳定的传输数据。二、加密控制增强2、蓝牙5.3提高了加密密钥长度控制选项,提高了安全性,能够更好的连接门禁等设备。3、同时,由于管理员控制更加简单,在连接的时候还能更加的便捷、快速,5.2则无

i7-7700无法升级至Windows 11的解决方案 i7-7700无法升级至Windows 11的解决方案 Dec 26, 2023 pm 06:52 PM

i77700的性能运行win11完全足够,但是用户却发现自己的i77700不能升级win11,这主要是受到了微软硬性条件的限制,所以只要跳过该限制就能安装了。i77700不能升级win11:1、因为微软限制了cpu的版本。2、intel只有第八代及以上版本可以直升win11。3、而i77700作为7代,无法满足win11的升级需求。4、但是i77700在性能上是完全能流畅使用win11的。5、所以大家可以使用本站的win11直装系统。6、下载完成后,右键“装载”该文件。7、再双击运行其中的“一键

Go语言在Linux系统上的兼容性如何? Go语言在Linux系统上的兼容性如何? Mar 22, 2024 am 10:36 AM

Go语言在Linux系统上的兼容性非常好,它能够无缝地在各种Linux发行版上运行,并且支持不同架构的处理器。本文将介绍Go语言在Linux系统上的兼容性,并通过具体的代码示例展示其强大的适用性。1.安装Go语言环境在Linux系统上安装Go语言环境非常简单,只需要下载对应的Go二进制包并设置相关环境变量即可。以下是在Ubuntu系统上安装Go语言的步骤:

可以使用蓝牙耳机在飞行模式下吗? 可以使用蓝牙耳机在飞行模式下吗? Feb 19, 2024 pm 10:56 PM

随着现代科技的不断发展,无线蓝牙耳机已经成为人们日常生活中不可或缺的一部分。无线耳机的出现解放了我们的双手,让我们可以更自由地享受音乐、通话和其他娱乐活动。然而,当我们乘坐飞机时,我们往往会被要求将手机设置为飞行模式。那么问题来了,飞行模式可以用蓝牙耳机吗?在本文中,我们将探讨这个问题。首先,让我们来了解一下飞行模式的作用和含义。飞行模式是手机的一种特殊模式

详解win11对win10软件的兼容性问题 详解win11对win10软件的兼容性问题 Jan 05, 2024 am 11:18 AM

win10系统中的软件都已经进行了很完美的优化,但是对于最新的win11用户大家肯定都很好奇是不是可以支持这款系统,所以下面就给你们带来了win11支不支持win10软件详细介绍,快来一起了解一下吧。win11支持win10软件吗:1、Win10系统的软件甚至是Win7系统的应用都可以很好的进行兼容。2、经过使用Win11系统的大神反馈目前还没有出现应用不兼容的问题。3、所以大家可以放心大胆的升级,不过普通的用户建议等到Win11发布正式版再升级。4、Win11不仅是兼容性好,而且还有Windo

WIN10兼容性没了进行找回的操作步骤 WIN10兼容性没了进行找回的操作步骤 Mar 27, 2024 am 11:36 AM

1、右键点击程序,发现在打开的属性窗口中,没有找到【兼容性】选项卡。2、在Win10桌面,右键点击桌面左下角的开始按钮,在弹出的菜单里选择【运行】菜单项。3、这时会打开Win10的运行窗口,在窗口中输入gpedit.msc,然后点击确定按钮。4、这时就会打开本地组策略编辑器窗口,在窗口中依次点击【计算机配置/管理模板/Windows组件】菜单项。5、在打开的Windows组件菜单中,找到【应用程序兼容性】菜单项,然后在右侧窗口中找到【删除程序兼容性属性页】设置项。6、右键点击该设置项,在弹出的菜

简易JavaScript教程:获取HTTP状态码的方法 简易JavaScript教程:获取HTTP状态码的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest

介绍win10的驱动下载方法,确保兼容性 介绍win10的驱动下载方法,确保兼容性 Jan 01, 2024 pm 06:59 PM

硬件设备的驱动程序是我们正常使用这个设备最重要的程序之一,但是有时候我们可能会碰到自己下载安装的驱动不兼容,其实系统可以自动找寻兼容的驱动下载安装,下面就一起来看一下吧。win10怎么兼容驱动1、首先找到桌面的此电脑,右键选中打开“属性”2、然后在左侧找到并打开“设备管理器”3、在设备管理器中找到想要下载安装的设备,右键选择“更新驱动程序”4、然后选择“自动搜索更新的驱动程序软件”5、最后等待一段时间弹出下面的窗口就代表驱动安装完成了。

See all articles