编写跨浏览器的javascript代码

74、编写跨浏览器兼容的JavaScript代码:依赖浏览器的代码挑战与解决方案 本文探讨了在现代Web开发中编写跨浏览器兼容的JavaScript代码的重要性,指出了传统浏览器检测的局限性,并提倡使用特性检测来提升代码的兼容性和稳定性。文章还介绍了特性检测在HTML5 API、事件处理、CSS属性等具体场景中的应用,并结合实际案例展示了如何通过特性检测和Polyfill技术解决常见的浏览器兼容性问题。最后,文章总结了最佳实践,帮助开发人员编写更健壮、更易维护的JavaScript代码。 阅读详情
 

 

下面比较了几种浏览器之间的差异,在写javascript代码时 要时刻注意这些差异

序号

操作

分类

IE
(6.0)

FireFox
(2.0)

Mozilla
(1.5)

当前
浏览器

备注

1

"."

访问tag的固有属性

OK

OK

OK

OK

 

2

"."

访问tag的用户定义属性
eg: <input type="checkbox"
myattr="test">

OK

NO

NO

OK

可以用getAttribute函数 替代

3

obj.getAttribute

访问tag的固有属性

OK

OK

OK

OK

 

4

obj.getAttribute

访问tag的用户定义属性
eg: <input type="checkbox"
myattr="test">

OK

OK

OK

OK

 

5

document.all

访问document的所有子元素
eg
:document.all

OK

OK

NO

OK

建议用childNodes对象或者getElementById函数实现对应操作。
有人说它不能取Div元素,测试结果是可以,不知道是不是还有其它因素会影响测试结果。

6

obj.all

访问非document元素的所有子元素
eg: document.getElementById("mydiv").all

OK

NO

NO

OK

同上

7

getElementById()

根据元素的id/name来取得元素。
如果元素只设置name属性,没有设置id属性。

OK

NO

NO

OK

注意:很多元素是没有name属性的,eg: td, div,span...

8

变量名 = ""

隐式定义变量-通过向变量名附值方式定义一个新的变量。

OK

OK

OK

OK

建议:为避免必要的麻烦,显示定义变量。
eg
:var tmp;

9

id

通过id直接调用对象
eg: test_result_1.innerHTML = ""

OK

OK

NO

OK

eval()函数用来执行脚本,所以向eval函数里面传入对象id/name的话,IE同样会返回对象的引用。
建议用document.getElementById(id)方式调用
注意:因为这个原因,IE中隐式定义的变量不能和HTML中元素的id/name相同。

10

name

通过name直接调用对象
eg: test_for_this_name.innerHTML = ""

OK

NO

NO

OK

同上/ 原因同7

11

name

支持的特殊字符("!",".","@","#","$","<",...)
eg: document.getElementsByName("aaaa!page");

NO

OK

OK

NO

其它的字符没有测试

12

tr.innerHTML = ""

设置TR元素的内部HTML脚本

NO

OK

OK

NO

在IE中,table、tr的innerHTML是只读属性,不能够对其直接设置。可以通过insertRow/insertCell函数进行设置。

13

cells对象访问

访问tr的cells对象
前提:tr元素是被删除后的tr对象,或者是用cloneNode(true)复制的删除前的tr对象

NO

OK

OK

undefined

可以将其插入Table再访问,或者可以用getElementsByTagName函数 对td/th访问。
删除后的rows对象不存在这个问题。其它元素?

14

(index)

访问集合类对象
eg: document.
getElementsByTagName("TD")(0)

OK

NO

NO

OK

建议用正式的操作符"[]".

15

obj.toString()

取得对象的字符串"[object 对象类型的名称]".
eg: td == "[object HTMLTableCellElement]"

NO

OK

OK

NO

可以省略toString()函数,直接用对象来操作。
注:在IE中返回"[object]"。

16

obj.class

定义对象的css式样/风格。
eg: td.class="XPstyle";

NO

OK

NO

-

无法写测试代码,会有编译错误!可以自己用typeof(class) == null来测试一下,没有异常就在代码中可以使用。
在HTML脚本中用class,但是在Javascript中应该用classname(class是JS的保留关键字).
注意:用 setAttribute可以把class值设置到对象中去,但是不会被当作css式样来解析。

17

const

保留关键字,用于定义常量。
eg
:const HOURS = 24;

NO

OK

OK

-

暂时只能不使用const。

18

input.type

变更input元素的类型
eg: input.type="button";

NO

OK

OK

NO

IE可以初始input元素类型,但是不能变更类型。
如果必须变更,可以用更换input元素的方式。

19

obj.children

访问对象的子元素集合
eg: document.body.children.length;

OK

NO

NO

OK

可以用childNodes对象替代。

20

node.replaceNode

替换新的节点对象
eg: oldNode.replaceNode(newNode);

OK

NO

NO

OK

可以用replaceChild函数替换。

21

node.removeNode

删除已有节点对象
eg.oldNode.removeNode(true);

OK

NO

NO

OK

可以用oldNode.parentNode.removeChild(oldNode)方式实现。

22

node.insertBefore

在指定节点对象前面插入一个节点对象
document.body.insertBefore(newN, oldN);

OK

OK

OK

OK

 

23

obj.parentElement

访问对象的父元素
eg: document.body.parentElement.id;

OK

NO

NO

OK

可以用parentNode对象替代。

24

obj.childNodes.length

返回子节点的数量,和tag的数量相同。
eg:document.body.childNodes.length;

OK

NO

NO

OK

FF/Mozilla中,空白或者换行是文本节点,是childNodes的成员。
可以用node.getElementsByTagName()回避。

25

obj.
insertAdjacentElement

向指定的位置插入元素
eg: obj.insertAdjacentElement("beforeBegin",button);

OK

NO

NO

OK

insertAdjacentElement函数和insertAdjacentText函数也类似。
可以用insertBefore函数实现类似功能。

26

createElement()

创建指定类型元素。
前提:元素为HTML脚本
eg
:document.createElment("<input type='radio' value='test'>");

OK

NO

NO

OK

可以先创建出对象元素,再进行属性设置;或者直接以InnerHTML的形式加到对应位置。
 

27

nodeName

取对象(tag,attribute,textnode)节点名称
eg: name = obj.nodeName;

OK

OK

OK

OK

有人说存在差异,不知道是具体的前提条件,先记录备考。
替代方案:
如果节点是tag元素可以用"tagName"取值;如果节点是attribut对象可以用"name"取值;如果节点是textnode元素可以用nodeType==3判断。

28

window.event

取得当前的事件对象
eg: window.event;

OK

NO

NO

?

可以主动向事件的响应函数传入event参数。
eg:<a onclick="javascript:showHelp(event)">help</a>

29

event.target

取得事件的触发对象
eg: e.target;

NO

OK

OK

?

可以和srcElement共同使用;可以主动向事件的响应函数传入触发对象元素。
eg:<a onclick="javascript:showHelp(this, event)">help</a>

30

event.srcElement

取得事件的触发对象
eg: e.srcElement;

OK

NO

NO

?

可以和target共同使用;可以主动向事件的响应函数传入触发对象。
eg: var obj = (e.target) ? e.target : e.srcElemtn;

31

event对象属性

当前三个浏览器的共同拥有的属性:
altKey
button
cancelBubble
clientX
clientY
ctrlKey
screenX
screenY
shiftKey
type

 

altLeft
behaviorCookie
behaviorPart
bookmarks
boundElements
contentOverflow
ctrlLeft
dataFld
dataTransfer
fromElement
keyCode
nextPage
offsetX
offsetY
propertyName
qualifier
reason
recordset
repeat
returnValue
srcElement
shiftLeft
srcFilter
srcUrn
toElement
wheelDelta
x
y
 

bubbles
cancelable
currentTarget
detail
eventPhase
explicitOriginalTarget
isChar
isTrusted
layerX
layerY
metaKey
originalTarget
pageX
pageY
rangeOffset
rangeParent
relatedTarget
target
timeStamp
view
which

bubbles
cancelable
charCode
currentTarget
detail
eventPhase
explicitOriginalTarget
isChar
keyCode
layerX
layerY
metaKey
originalTarget
pageX
pageY
popupWindowURI
rangeOffset
rangeParent
relatedTarget
requestingWindowURI
target
timeStamp
view
which

?

event对象的不同点太多,在使用的时候需要一一检查才行。具体可以用页面下方的测试区域试验。

32

注册event

用attachEvent函数注册

OK

NO

NO

-

小心内存泄漏!!!
事件处理完后一定要调用detachEvent函数销毁事件,而且要注意避免重复注册。

33

注册event

addEventListener函数注册

NO

OK

OK

-

 

34

注册event

obj.onxxx = Function("响应函数名称或代码");方式注册
eg: btn.onclick = Function(doclick);
btn.onclick = Function("return 1+1;");

OK

OK

OK

-

 

35

销毁event

detachEvent函数销毁

OK

NO

NO

-

 

36

销毁event

removeEventListener函数销毁

NO

OK

OK

-

 

37

销毁event

obj.onxxx = null;方式注册
eg: btn.onclick = null;

OK

OK

OK

-

 

38

触发event

fireEvent函数
eg:btn.fireEvent("onclick");
FF:
var e = document.createEvent("Events");
e.initEvent("click", true, false);
element.dispatchEvent(event)

OK

NO

NO

-

 

39

触发event

dispatchEvent函数
eg:
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true);
btn.dispatchEvent(evt);

NO

OK

OK

-

 

JavaScript:跨浏览器编程的最佳选择 同时,及时更新浏览器版本也是用户和开发者共同的责任,以获得更好的JavaScript支持和更好的浏览体验。使用现代的JavaScript语法和特性:尽量使用ES6及以上版本的JavaScript语法和特性,这些新特性在大多数现代浏览器中得到了良好的支持。Safari对JavaScript的支持也相当不错,但某些最新的JavaScript特性可能需要较新的浏览器版本才能完全支持。浏览器特性检测:在编写代码时,可以使用条件语句检测浏览器的特性支持情况,从而根据不同的浏览器环境执行相应的代码逻辑。 阅读详情

相关推荐

内网(极空间)搭建gitlab跳板机转发端口及域名配置

然后,回头尝试用内网地址+15022 clone,成功,用公网的ip+15222 clone失败,那就是定位到时nginx转发的问题了。首先想到的就是 git clone是通过ssh的22端口进行下载的,那就需要打通22端口,则又配置22端口的nginx转发。然后,我通过ssh命令,做一个端口转发,以实现内网穿透,将服务端口链接到跳板机上。然后穿透到阿里云服务器跳板机的端口,只能内网访问,需要用nginx做个转发,才能用公网ip进行访问。然后,如上,我的80端口,映射15080,22端口映射15022。

God丶Davide的博客 6077

跨浏览器编程之JavaScript

         刚参加工作的时候,曾经被一位日本高级工程师所折服,他所写的JavaScript代码非常工整、清晰,浏览器差异都非常的清楚。一直都很佩服他,同时很 讨厌浏览器的差异。然而程序员就是这样,很多事情都必须面对,譬如说现在就必须做跨浏览器的应用。网络上没有直接的好咚咚,没办法,一点一滴从零开始积 累,为自己为他人提供便利。   &lt;script&gt; function fixW...

sunxboy的专栏 417

软考高级-系统架构设计师 论文范文参考(一)

系统架构设计师 论文参考

片言可决讼,半纸能缚龙 4347

编写跨浏览器的javascript代码必备[js多浏览器兼容写法]

编写跨浏览器的javascript代码必备[js多浏览器兼容写法] 作者: 下面比较了几种浏览器之间的差异,在写javascript代码时 要时刻注意这些差异 序号 undefined 操作 分类 IE (6.0) FireFox (2.0) Mozilla (1.5) 当前 浏览器

idwenwen的博客 1584

springcloud整合dubbo3使用nacos作为注册中心

springcloud整合dubbo3使用nacos作为注册中心

congge 7952

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

baidu_35680696的博客 973

如何编写跨浏览器兼容的JavaScript代码:idiomatic.js的终极规范指南

idiomatic.js是一个专注于编写一致、符合习惯的JavaScript代码的开源项目,提供了一套全面的代码规范,帮助开发者解决跨浏览器兼容性问题,提升代码质量和可维护性。 ## 为什么跨浏览器兼容性如此重要? 🤔 在当今多样化的浏览器生态中,从Chrome、Firefox到Safari、Edge,不同浏览器对JavaScript的支持存在差异。这些差异可能导致代码在某些浏览器中正常运行

gitblog_00152的博客 465

【智能车Code review】—曲率计算、最小二乘法拟合

【1】曲率计算函数 选三个点计算曲率 float process_curvity(byte x1, byte y1, byte x2, byte y2, byte x3, byte y3) { float K; int S_of_ABC = ((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2; //面积的符号表示方向 byte q1 = (byte)((x2 - x1) * (x2 - x1) + (y2 - y1) *

hanhan的博客 1万+

深入解析 CPython readline 模块:行编辑、历史记录与补全的完整指南

本文以 CPython 官方文档 [Doc/library/readline.rst](https://link.gitcode.com/i/e4cb3b7fdab0f31ff03a97477f1c051a) 为主体,结合 [Modules/readline.c](https://link.gitcode.com/i/9f73d42c7120c80fb29abc70e2467e91) 与 [Lib

gitblog_00498的博客 484

UG\NX二次开发 获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态

获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态。

王牌飞行员_里海的博客 1984

智元机器人开源具身仿真框架 Genie Sim 入门教程

GenieSim是AgiBot推出的具身智能仿真框架,提供完整闭环开发管道,包括轨迹生成、模型训练和基准测试。框架支持Docker容器化部署,要求Ubuntu 22.04和NVIDIA硬件环境。主要功能涵盖: 支持12种基准测试任务 提供ADER评估框架 集成UniVLA/RDT等基线模型 支持PICO/键盘遥操作 具备轨迹记录回放功能 提供完整API控制接口 开发者可通过Hugging Face获取场景资产,使用标准化ROS主题与仿真环境交互。框架特别优化了碰撞检测和抓取物理模拟,适用于从简单抓取到复杂操

2506_90492529的博客 2544

java 跨浏览器的javascript脚本编写_编写跨浏览器的javascript代码必备[js多浏览器兼容写法]...

序号操作分类IE(6.0)FireFox(2.0)Mozilla(1.5)当前浏览器备注1"."访问tag的固有属性OKOKOKOK2"."访问tag的用户定义属性eg: OKNONOOK可以用getAttribute函数替代3obj.getAttribute访问tag的固有属性OKOKOKOK4obj.getAttribute访问tag的用户定义属性eg: OKOKOKOK5document.a...

weixin_39622628的博客 168

MIPI CPHY学习笔记02:TX物理层一致性测试项解析(HS信令模式)第一部分

在手机、平板等移动设备中,MIPI C-PHY是连接相机、显示屏等高速外设的“数据高速公路”。高速(HS)信令模式就是这条公路的“快车道”,专门用于传输高清图像、视频等大容量数据,既要保证传输速率,又要维持信号稳定。物理层一致性测试是对这条“快车道”的全面质检,确保高速传输下数据不卡顿、不失真。今天我们聚焦MIPI C-PHY TX(发射端)的Group 2 HS信令测试,用通俗语言拆解22个核心测试项(含2个过时项),看懂高速信号的合格标准。

一只豌豆象的博客 293

【转】用探测技术编写跨浏览器的Javascript代码

作者:TonyRoss(ProgramManager) 原文:SameMarkup:WritingCross-BrowserCode 翻译:一回(csser.com) 基本原则 推荐 功能探测:使用某个功能前先检测浏览器是否支持它 行为探测:在应用之前对已知问题进行测试 不推荐 探测指定浏览器:根据浏览器的唯一性来改变页面行为 臆断不相关的...

weixin_30437481的博客 113

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

某些应用程序阻止了idm集成到浏览器中_跨浏览器兼容性和React.js Web应用程序

某些框架或库是否更适合创建跨浏览器兼容的Web应用程序?我们探讨这个问题的React方面。有时我觉得生活中的事件发生在一个序列中,所以你经常会遇到“畏缩”的时刻。就像你的嘴里有沙子,或者你听到指甲对着粉笔板的难以忍受的声音。对我个人来说,最糟糕的一个值得关注的时刻是我遇到一个非常糟糕的网络应用程序或网站。当我说坏的时候,我的意思是Internet Explorer不好(只是开玩笑,这是一个不错的浏...

weixin_39891317的博客 1440

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Prototype.js是个不错的东西

Prototype.js 是Javascript编写者的一把小军刀,提供了Ruby风格的简写语法和实效的函数,更难得的是完全跨浏览器,新版本支持ajax一些常用调用方法,让大家舒舒服服写出又精简又不用愁心兼容的的JS代码.目前最新版本为1.40下载:http://prototype.conio.net/中文文档:https://compdoc2cn.dev.java.net/prototype/h

suilam的专栏 1280

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

javascript教程_图表控件AnyChart使用教程:如何使用JavaScript创建维恩图-控件新闻...

AnyChart是基于JavaScript (HTML5) 的图表控件。使用AnyChart控件,可创建跨浏览器和跨平台的交互式图表和仪表。AnyChart 图表目前已被很多知名大公司所使用,可用于仪表盘、报表、数据分析、统计学、金融等领域。AnyChar HTML5图表高度可定制且高度兼容。拥有纯JavaScript API,AnyChart图表内置客户端数据实时更新,多层次向下钻区和具体参数更...

weixin_39517546的博客 567

scroll-js 项目常见问题解决方案

scroll-js 项目常见问题解决方案 项目基础介绍 scroll-js 是一个轻量级的跨浏览器滚动库,使用原生 JavaScript 编写。它旨在提供额外的滚动功能,并作为 scrollTo 和 scrollIntoView API 的填充库。该项目允许用户使用基于 DOM 规范的 scrollOptions 的动画进行滚动。它通过操作原生滚动属性,确保原生事件能够正确触发,并使用浏览器的动画...

gitblog_01148的博客 551

推荐一款超轻量级的JavaScript库——ki.js

推荐一款超轻量级的JavaScript库——ki.js 在JavaScript的世界里,我们经常寻找那个既能满足需求又小巧高效的工具。今天,我们要介绍的就是这样一款库——ki.js,一个只有480字节(压缩后仅145字节)的jQuery风格API库。 项目介绍 ki.js由dciccale开发,它在极小的体积下提供了类似于jQuery的基本功能,包括DOM操作、事件处理和链式调用等。这个轻量级的库...

gitblog_00085的博客 426

clientside-haml-js 项目推荐

clientside-haml-js 项目推荐 项目基础介绍和主要编程语言 clientside-haml-js 是一个客户端的 HAML 编译器,主要用于将 HAML 格式的模板编译成 JavaScript 函数,从而生成 HTML 内容。该项目主要使用 CoffeeScript 编写,但也支持 JavaScript 和 CoffeeScript 的混合使用。 项目核心功能 HAML 模板编译...

gitblog_01189的博客 393

JavaScript和jQuery的关系

jQuery 则是 JavaScript 的一个代码库(或习惯性叫类库),它将一些在 JavaScript 开发中经常用到的功能集合起来,以方便开发者直接使用,而不需要再用原生 JavaScript 语句写大量代码,同时可在不同浏览器间实现一致的效果。jquery基于JavaScript语言,封装JavaScript的原生方法,提供了简便的函数接口,简化了JS的操作。jquery封装JavaScript的原生方法,提供了简便的函数接口,简化了JS的操作。1、Js对象转化为Jquery对象。

weixin_69620038的博客 385

.JavaScript和jQuery的关系?

.JavaScript和jQuery的关系?

weixin_71812382的博客 163

JavaScript入门基础

JavaScript入门基础概述变量的声明变量的作用域基本数据类型Number类型String类型Boolean类型Undefined类型Null类型三大引用类型Object类型Array类型Function类型typeof 操作符js编写的位置js的三种输出方式 概述 JavaScript是世界上最流行的脚本语言,是一种运行在浏览器中的解释型的编程语言,能够实现跨平台、跨浏览器。虽然只是十多天时间的产物,并且有很多的缺陷和陷阱,但也造就了JavaScript的灵活和强大。随着Node.js的兴起,Jav

『愚』的博客 4133

js在不同浏览器中的差异

 js是web交换的利器语言,但是遇到不听话的浏览器也没辙啊,只有我们了解了这些差异才能写出更好的代码。  

随波主流 325

高效 JavaScript 单元测试(转)

http://www.ibm.com/developerworks/cn/opensource/os-jstesting/index.html 来源: IBM developerWorks发布时间: 2011-12-01 13:26 摘要:能 在一个浏览器上运行的 JavaScript 并不一定能在其他浏览器上运行。如果没有对代码进行单元测试,那么在决定升级或支持新浏览器的时...

111
上一篇: mysql性能log分析工具
下一篇: javascript编程的15个陷阱
zhsp1029
博客等级 码龄21年 115粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值