JavaScript中浏览器兼容性问题及解决方法

原文链接https://www.jb51.net/article/84596.htm

一、document.formName.item(”itemName”) 问题

问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document.formName.elements ["elementName"];Firefox 下,只能使用document.formName.elements["elementName"]。

解决方法:统一使用document.formName.elements["elementName"]。

二、集合类对象问题

问题说明:IE下,可以使用 () 或 [] 获取集合类对象;Firefox下,只能使用 [ ]获取集合类对象。

解决方法:统一使用 [] 获取集合类对象。

三、自定义属性问题

问题说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用 getAttribute() 获取自定义属性;Firefox下,只能使用 getAttribute() 获取自定义属性。

解决方法:统一通过 getAttribute() 获取自定义属性。

四、eval(”idName”)问题

问题说明:IE下,可以使用 eval(”idName”) 或 getElementById(”idName”) 来取得 id 为 idName 的HTML对象;Firefox下,只能使用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。

解决方法:统一用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。

五、变量名与某HTML对象ID相同的问题

问题说明:IE下,HTML对象的ID可以作为 document 的下属对象变量名直接使用,Firefox下则不能;Firefox下,可以使用与HTML对象ID相同的变量名,IE下则不能。

解决方法:使用 document.getElementById(”idName”) 代替 document.idName。最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var关键字,以避免歧义。

六、const问题

问题说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量。

解决方法:统一使用var关键字来定义常量。

七、input.type属性问题

问题说明:IE下 input.type 属性为只读;但是Firefox下 input.type 属性为读写。

解决办法:不修改 input.type 属性。如果必须要修改,可以先隐藏原来的input,然后在同样的位置再插入一个新的input元素。

八、window.event问题

问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用。

解决方法:在事件发生的函数上加上event参数,在函数体内(假设形参为evt)使用 var myEvent = evt?evt:(window.event?window.event:null)

示例:

<input type="button" οnclick="doSomething(event)"/>
<script language="javascript">
function doSomething(evt) {
var myEvent = evt?evt:(window.event?window.event:null)
...
}

九、event.x与event.y问题

问题说明:IE下,even对象有x、y属性,但是没有pageX、pageY属性;Firefox下,even对象有pageX、pageY属性,但是没有x、y属性。 
解决方法:var myX = event.x ? event.x : event.pageX;

var myY = event.y ? event.y:event.pageY;

如果考虑第8条问题,就改用myEvent代替event即可。

十、event.srcElement问题

问题说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性。

解决方法:使用srcObj = event.srcElement ? event.srcElement : event.target;

如果考虑第8条问题,就改用myEvent代替event即可。

十一、window.location.href问题

问题说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location。

解决方法:使用 window.location 来代替 window.location.href。当然也可以考虑使用 location.replace()方法。

十二、模态和非模态窗口问题

问题说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能。

解决方法:直接使用 window.open(pageURL,name,parameters) 方式打开新窗口。

如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口。如果需要父窗口控制子窗口的话,使用 var subWindow = window.open(pageURL,name,parameters); 来获得新开的窗口对象。

十三、frame和iframe问题

以下面的frame为例:

(1)访问frame对象

IE:使用window.frameId或者window.frameName来访问这个frame对象;

Firefox:使用window.frameName来访问这个frame对象;

解决方法:统一使用 window.document.getElementById(”frameId”) 来访问这个frame对象;

(2)切换frame内容

在IE和Firefox中都可以使用 window.document.getElementById(”frameId”).src = “webjx.com.html”或 window.frameName.location = “webjx.com.html”来切换frame的内容;

如果需要将frame中的参数传回父窗口,可以在frame中使用parent关键字来访问父窗口。

十四、body载入问题

问题说明:Firefox的body对象在body标签没有被浏览器完全读入之前就存在;

而IE的body对象则必须在body标签被浏览器完全读入之后才存在。

[注] 这个问题尚未实际验证,待验证后再来修改。

[注] 经验证,IE6、Opera9以及FireFox2中不存在上述问题,单纯的JS脚本可以访问在脚本之前已经载入的所有对象和元素,即使这个元素还没有载入完成。

十五、事件委托方法

问题说明:IE下,使用 document.body.onload = inject; 其中function inject()在这之前已被实现;

在Firefox下,使用 document.body.onload = inject();

解决方法:统一使用 document.body.οnlοad=new Function('inject()'); 或者 document.body.onload = function(){/* 这里是代码 */}

[注意] Function和function的区别

十六、访问的父元素的区别

问题说明:在IE下,使用 obj.parentElement 或 obj.parentNode 访问obj的父结点;在firefox下,使用 obj.parentNode 访问obj的父结点。

解决方法:因为firefox与IE都支持DOM,因此统一使用obj.parentNode 来访问obj的父结点。

十七、innerText的问题.

问题说明:innerText在IE中能正常工作,但是innerText在FireFox中却不行。

解决方法:在非IE浏览器中使用textContent代替innerText。

示例:

if(navigator.appName.indexOf("Explorer") >-1){
document.getElementById('element').innerText = "my text";
} else{
document.getElementById('element').textContent = ";my text";
}

[注] innerHTML 同时被ie、firefox等浏览器支持,其他的,如outerHTML等只被ie支持,最好不用。

十八、Table操作问题

问题说明:ie、firefox以及其它浏览器对于 table 标签的操作都各不相同,在ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChild方法也不管用。document.appendChild在往表里插入行时FIREFOX支持,IE不支持

解决办法:把行插入到TBODY中,不要直接插入到表

解决方法:

//向table追加一个空行:
var row = otable.insertRow(-1);
var cell = document.createElement("td");
cell.innerHTML = "";
cell.className = "XXXX";
row.appendChild(cell);

[注] 建议使用JS框架集来操作table,如JQuery。

• 获取table的行数和列数

在IE中,获取行列数可以使用下面的代码:

var detailT= grid.gettable("11"); //获取行的长度var r=detailT.rows.length; //获取列的长度var l=detailT.cells.length;

而在火狐或谷歌中获取列的长度就是无效的。

解决方案:

var detailT= grid.gettable("11");
//获取行的长度
var r=detailT.rows.length;
//获取列的长度
var l=detailT.rows[0].cells.length;

十九、对象宽高赋值问题

问题说明:FireFox中类似 obj.style.height = imgObj.height 的语句无效。

解决方法:统一使用 obj.style.height = imgObj.height + ‘px';

二十、setAttribute('style','color:red;')

FIREFOX支持(除了IE,现在所有浏览器都支持),IE不支持

解决办法:不用setAttribute('style','color:red')

而用object.style.cssText = ‘color:red;'(这写法也有例外)

最好的办法是上面种方法都用上,万无一失

二十一、类名设置

setAttribute('class','styleClass')

FIREFOX支持,IE不支持(指定属性名为class,IE不会设置元素的class属性,相反只使用setAttribute时IE自动识CLASSNAME属性)

解决办法:

setAttribute('class','styleClass') setAttribute('className','styleClass') 或者直接 object.className='styleClass';

IE和FF都支持object.className。

二十二、用setAttribute设置事件

var obj = document.getElementById('objId'); 
obj.setAttribute('onclick','funcitonname();');

FIREFOX支持,IE不支持

解决办法:

IE中必须用点记法来引用所需的事件处理程序,并且要用赋予匿名函数

如下:

var obj = document.getElementById('objId');
obj.οnclick=function(){fucntionname();}; //这种方法所有浏览器都支持

二十三、建立单选钮

IE以外的浏览器

var rdo = document.createElement('input');
rdo.setAttribute('type','radio');
rdo.setAttribute('name','radiobtn');
rdo.setAttribute('value','checked'); 

IE:

var rdo =document.createElement(”<input name=”radiobtn” type=”radio” value=”checked” />”); 

解决办法: 

这一点区别和前面的都不一样。这次完全不同,所以找不到共同的办法来解决,那么只有IF-ELSE了 
万幸的是,IE可以识别出document的uniqueID属性,别的浏览器都不可以识别出这一属性。

二十四 createElement

W3C DOM Level2 Core规定,Document 接口下的 createElement 方法可以创建一个元素节点对象实例。它可以传入一个字符串参数 tagName,在 HTML 中,这个参数可以是任何形式,但tagName 应为一个合法的标签名。

例如:document.createElement("td");//创建一个td

若 tagName 中出现不合法的字符,则应抛出 INVALID_CHARACTER_ERR 异常。

由于微软的强大,其产品IE使用了一些规范以外的规则,其中之一就与createElement方法有关。即:在 IE 中,createElement 方法不仅可以通过合法的标签名创建节点对象,还可以通过传入一段合法的 HTML 代码字符串作为参数创建节点对象。

例如:document.createElement("<input type='text' name='txtName'>");//创建一个name属性为"txtName"的input

若使用了 IE 特有的通过为 createElement 传入一段合法的 HTML 代码字符串作为参数创建节点对象的方法,则在其他浏览器中将会抛出异常,并导致后续代码无法执行。这就造成了浏览器的兼容性问题。

也许有的读者会说,用 createElement 方法时,使用传入标签名的做法不就解决了兼容性问题吗?

例如:

var txt = document.createElement("input");

txt.type = "text";

txt.name = "txtName";

......

但在 IE6 , IE7 中,如果动态生成 input 元素,是无法为其设置 name 属性的,这是IE自身的问题。这个时候,IE 特有的通过为 createElement 传入一段合法的 HTML 代码字符串作为参数创建节点对象的方法,就有了大显身手的机会。不过,IE 中无法为 input 设置 name 属性的 bug 已经在 IE8 中被修复。在其他浏览器中,不存在上述问题。

所以,要最终解决 createElement 方法的兼容性问题,还是要注意判断浏览器,针对 IE 可以使用其特有的通过为createElement 传入一段合法的 HTML 代码字符串作为参数的方法,非 IE 浏览器仍然使用 W3C 规范的标准方法。

例如:

if($.browser.msie) {

var txt = document.createElement("<input type='text' name='txtName'>")

} else {

var txt = document.createElement("input");

txt.type = "text";

txt.name = "txtName";

}

未完持续添加中。。。。。。。-_-

JavaScript中浏览器兼容性解决办法相关推荐

  1. 1920像素的屏幕在部分浏览器(chrome,IE等)中只有1536px解决办法

    1920像素的屏幕在部分浏览器(chrome,IE等)中只有1536px解决办法 在桌面右键->显示设置,将缩放改为100%. PC端多屏适配方案请查看这篇文章:https://blog.csd ...

  2. ajax请求或者计算造成浏览器崩溃解决办法

    现象: ajax请求或者计算造成浏览器崩溃解决办法 1) ajax请求造成浏览器崩溃其实不是别的原因,是因为我们的代码的原因,这儿提醒众位同行初学者,使用尽量不要使用$.ajaxSettings.as ...

  3. dw读取access中的图片_怎样从Access数据库中读取图片?解决办法

    当前位置:我的异常网» C# » 怎样从Access数据库中读取图片?解决办法 怎样从Access数据库中读取图片?解决办法 www.myexceptions.net  网友分享于:2013-03-0 ...

  4. Java11.0.2怎么生成JRE_java环境变量配置,jdk13.0.1中没有jre解决办法

    标签:完成后   回车   手动   完成   cmd   没有   alt   span   环境变量配置 java.Oracle中下载了最新的jdk13.0.1,安装之后发现没自动生成jre,导致 ...

  5. 当子元素用position:relative;时,父元素的overflow:hidden;在ie中失效的解决办法

    当子元素用position:relative;时,父元素的overflow:hidden;在ie中失效的解决办法: 给父元素也加上position:relative; 到现在也不知道为什么会出现这样的 ...

  6. ng-bind-html在ng-repeat中问题的解决办法

    ng-bind-html在ng-repeat中问题的解决办法 参考文章: (1)ng-bind-html在ng-repeat中问题的解决办法 (2)https://www.cnblogs.com/le ...

  7. error:LNK2005 已经在*.obj文件中定义的解决办法

    有B和A两个代码,在文件B.obj中报错"已经在A.obj文件中定义的解决办法XXX" 报错原因是重复定义 把A或者B 里面任意一方的XXX注释掉即可解决.

  8. 主机ping不通虚拟机 TTL传输中过期的解决办法

    主机ping不通虚拟机 TTL传输中过期的解决办法 Linux 虚拟机设置的自动获取ip地址. 虚拟机ip地址改变之后,虚拟机可以ping通主机,主机ping虚拟机显示TTL传输中过期,CRT连接不上 ...

  9. Office word文档中的乱码解决办法

    Office word文档中的乱码解决办法 1.打开被损坏的文档单击"文件/另存为"菜单,在 "保存类型"列表中,选择"RTF格式",然后单 ...

  10. 远程连接不上docker中的mysql解决办法

    远程连接不上docker中的mysql解决办法 查看docker中线程,发现mysql中行动状态 我首先删除docker中的映射(先停止,再删除): //停止运行mysql01 dcoerk stop ...

最新文章

  1. mysql thread safe_Windows环境下完全手工配置Apache、MySQL和PHP(Thread Safe)
  2. 带进度条的ASP无组件断点续传下载代码
  3. 张一鸣:做CEO要避免理性的自负!
  4. ICCV 2021 | 最新开源!多视角几何和注意力机制实现新视角合成
  5. OpenStack的部署T版(四)——Placement组件
  6. 动态规划之力扣股票类问题
  7. linux获取windows的主机名,获取网络许可主机名和主机 ID 的步骤
  8. 苹果侧边滑动返回_后置指纹、侧边指纹、屏幕指纹到底哪个更好用? 来讨论一下!...
  9. php7 curl开源库,7个适用于PHP的最佳Curl包装器库
  10. SpringCloud(3)---最简单的 SpringCloud 教程
  11. cssz中a标签鼠标选中去除选中边框
  12. LeetCode12 整数转罗马数字
  13. PDF转JPG的工具
  14. 医咖会免费SPSS教程学习笔记—组内相关系数ICC
  15. DS18B20 引脚 定义 单总线 多点温度检测 STM32 单片机
  16. 微信小程序抽奖转盘实现案例
  17. 使用JMeter代理在谷歌浏览器中录制脚本
  18. JAVA串口通信开发
  19. 如何科学增长邮件订阅用户?
  20. 计算机辅助设计技术领域的应用,关于计算机辅助设计技术在规划设计中的应用...

热门文章

  1. 前嗅教你大数据——史上最全代理IP服务商对比
  2. 腾讯云:开发者实验室
  3. 自己写了个磁力链搜索引擎
  4. Steam 界面布局出错的问题
  5. C语言定义结构体的几种方法
  6. xheditor漏洞 php,xheditor默认upload.php畸形文件上传漏洞
  7. 2020年报表工具报表软件bi工具常见问题汇总报表解决方案
  8. m1电脑推荐使用Google Chrome浏览器
  9. python压缩图片 指定大小
  10. 推荐一款待办事项和日程管理的微信小程序——腾讯待办