编写Javascript脚本,不要忽视了对Firefox的兼容性

本篇内容,主要是个人根据工作中遇到的情况,做个小结。 

1、Select列表控件

删除列表项。在IE下工作正常的代码:

obj.options.remove(i);

需要修改为:

obj.remove(i);

添加列表项。在IE下工作正常的代码:

var  oOption  =  document.createElement( ' option ' ); 
oOption.text 
=  text; 
oOption.value 
=  value; 
targetArea.options.add(oOption); 

为了提供更好的浏览器兼容性,更符合W3C DOM Level 2 HTML标准,建议改为如下代码:

var  oOption  =  document.createElement( ' option ' ); 
oOption.text 
=  text; 
oOption.value 
=  value; 
targetArea.options[targetArea.options.length]
= new  Option(text,value);

另外,selectObj.options(i),需要改为selectObj.options[i]。

 2、XmlDom对象

IE下一般这样做:

var  xmlDom  =   new  ActiveXObject( " Microsoft.XMLDOM " ); 

为了兼容Firefox,需要修改为:

if  (window.ActiveXObject){ 
    
var  xmlDom  =   new  ActiveXObject( " Microsoft.XMLDOM " ); 

else {
    
if  (document.implementation  &&  document.implementation.createDocument){
        
var  xmlDom  =  document.implementation.createDocument( "" , "" , null ); 
    } 
}
 3、对于childNodes的循环处理
var  nodes = xmlDom.documentElement; 
    
var  sName;   // 标签文本
     var  sValue;  // 标签值
    
    
if  (nodes.childNodes.length  !=   0 ) {
        
for  ( var  i = 0 ;i < nodes.childNodes.length; ++ i) {
            oItem 
=  nodes.childNodes.item(i); 
            sName 
=  oItem.text; 
            sValue 
=  oItem.getAttribute( " id " );  // 这里会报错
            addOption(targetArea,sName,sValue); 
        } 
    }

上面这段代码,在IE下完全没有问题,但是在Firefox下就毫无反应,Firefox下的错误控制台报告:oItem没有getAttribute方法,百思不得其解,经调试,发现oItem的节点类型竟然是3,也就是文本,进一步调试得知,oItem的节点类型分别是3、1、3、1....(1是节点对象),使用Firefox的Dom查看器一看,恍然大悟!其中,Xml数据字符串为:

< types >
< type  id ="215" > 验房服务 </ type >
< type  id ="216" > 家装设计 </ type >
< type  id ="217" > 建筑工程 </ type >
< type  id ="218" > 家装监理 </ type >
< type  id ="219" > 检测(环境质量) </ type >
< type  id ="220" > 风水 </ type >
</ types >

在Dom查看器中看到:

可以看到,#text节点和节点对象交替排列(id列有数据的为正常节点,例如“验房服务”、“家装设计”等等),造成当oItem为#text类型的时候调用getAttribute()方法失败,因为文本节点没有此方法。

那么,修改后的代码是:

var  nodes = xmlDom.documentElement; 
    
var  sName;   // 标签文本
     var  sValue;  // 标签值
     var  oItem,sName,sValue,oOption;
    
if  (nodes.childNodes.length  !=   0 ) { 
        
for  ( var  i = 0 ;i < nodes.childNodes.length; ++ i) {
    
var  oItem  =  nodes.childNodes[i]; 
    
if (oItem.nodeType  ==   1 ){  // 判断是否是Element类型
        sName  =  oItem.childNodes[ 0 ].nodeValue;   // 这里需要注意下
        sValue  =  oItem.getAttribute( " id " );
        
var  oOption  =  document.createElement( ' option ' ); 
        oOption.text 
=  sName; 
        oOption.value 
=  sValue; 
        objType.options.add(oOption);
    }
        } 
    }

 

还有一点需要注意的是oItem.text无法在Firefox中取得节点的值,取而代之的是:

oItem.childNodes[0].nodeValue;

至此,真相大白!

附录1:帮助我解决问题的两篇关键文章:

1、http://www.sitepoint.com/forums/showthread.php?t=307056&goto=nextnewest

2、http://www.thescripts.com/forum/thread471907.html

附录2:Node的类型

nodeTypeNamed ConstantnodeTypeStringnodeNamenodeValue
1ELEMENT_NODEelementtagNamenull
2ATTRIBUTE_NODEattributenamevalue
3TEXT_NODEtext#textcontent of node
4CDATA_SECTION_NODEcdatasection#cdata-sectioncontent of node
5ENTITY_REFERENCE_NODEentityreferenceentity reference namenull
6ENTITY_NODEentityentity namenull
7PROCESSING_INSTRUCTION_NODEprocessinginstructiontargetcontent of node
8COMMENT_NODEcomment#commentcomment text
9DOCUMENT_NODEdocument#documentnull
10DOCUMENT_TYPE_NODEdocumenttypedoctype namenull
11DOCUMENT_FRAGMENT_NODEdocumentfragment#document fragmentnull
12NOTATION_NODEnotationnotation namenull

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值