FIREFOX/IE跨浏览器开发备忘

 在客户这边解决B2C项目的FIREFOX/IE跨浏览器问题已经一个多月了,感觉FIREFOX比IE严谨很多,书写的代码需完全遵循W3C标准。现整理一下开发笔记,并不定期进行更新。

1、判断浏览器

  1. if(document.implementation && document.implementation.createDocument){
  2.   //firefox code
  3. }else if(typeof window.ActiveXObject != 'undefined') {
  4.   //ie code
  5. }

2、input自定义属性的取值与赋值

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

 <input type="text" id="test" flag="" />

 取值:

 IE可以通过document.getElementById("test").flag或document.getElementById("test").getAttribute("flag")取值。

 FIREFOX必需通过document.getElementById("test").getAttribute("flag")才能取值。

 赋值:

 IE可以通过document.getElementById("test").flag="cool"或document.getElementById("test").setAttribute("flag","cool")

 FIREFOX必需通过document.getElementById("test").setAttribute("flag","cool")才能赋值。

3、XML的加载方式

 a)加载xml文件:

 IE:

  1. xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  2. xmlDoc.async="false";
  3. xmlDoc.load("books.xml");

 FIREFOX:

  1. xmlDoc=document.implementation.createDocument("","",null);
  2. xmlDoc.async="false";
  3. xmlDoc.load("books.xml");

 b)加载xml字符串:

 IE:

  1. xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  2. xmlDoc.async="false";
  3. xmlDoc.loadXML(txt);

 FIREFOX:

  1. parser=new DOMParser();
  2. xmlDoc=parser.parseFromString(txt,"text/xml"); 

4、目前正在用的一个公共js脚本,此脚本从网络收集,自己整理了一下。

功能包括:使FIREFOX支持selectNodes()、selectSingleNode()以及xmlDom.xml()方法。

  1. function loadConfigXml(urlXml)
  2. {
  3.     try{    
  4.         if(document.implementation && document.implementation.createDocument){
  5.             var Xmlhttp = new XMLHttpRequest();   
  6.             var dom = document.implementation.createDocument("","",null);
  7.             Xmlhttp.open("GET",urlXml,false);
  8.             Xmlhttp.setRequestHeader("Content-Type","text/xml");
  9.             Xmlhttp.send(null);
  10.             parser=new DOMParser(); 
  11.             dom = parser.parseFromString(Xmlhttp.responseText,"text/xml");
  12.             return dom;
  13.         }else if(typeof window.ActiveXObject != 'undefined') {      
  14.             var Xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  15.             var dom=new ActiveXObject("Msxml2.DOMDOCUMENT");
  16.             Xmlhttp.open("GET",urlXml,false);
  17.             Xmlhttp.setRequestHeader("Content-Type","text/xml");
  18.             Xmlhttp.send();     
  19.             dom.loadXML(Xmlhttp.responseText);
  20.             return dom;
  21.         }
  22.     } catch(e){
  23.         alert(e.description);
  24.     }
  25. }
  26. //使FIREFOX支持selectNodes()、selectSingleNode()
  27. //代码出处:http://km0ti0n.blunted.co.uk/mozXPath.xap
  28. // check for XPath implementation
  29. if( document.implementation.hasFeature("XPath""3.0") )
  30. {
  31.     // prototying the XMLDocument
  32.     XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
  33.     {
  34.         if( !xNode ) { xNode = this; } 
  35.         var oNSResolver = this.createNSResolver(this.documentElement)
  36.         var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
  37.         XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
  38.         var aResult = [];
  39.         forvar i = 0; i < aItems.snapshotLength; i++)
  40.         {
  41.             aResult[i] = aItems.snapshotItem(i);
  42.         }
  43.         return aResult;
  44.     }
  45.     // prototying the Element
  46.     Element.prototype.selectNodes = function(cXPathString){
  47.         if(this.ownerDocument.selectNodes){
  48.           return this.ownerDocument.selectNodes(cXPathString, this);
  49.         }else{
  50.             throw "For XML Elements Only";
  51.         }
  52.     }
  53. }
  54.     
  55.     // check for XPath implementation
  56. if( document.implementation.hasFeature("XPath""3.0")){
  57.     // prototying the XMLDocument
  58.     XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode){
  59.         if( !xNode ){
  60.             xNode = this;
  61.         } 
  62.         var xItems = this.selectNodes(cXPathString, xNode);
  63.         if( xItems.length > 0 ){
  64.             return xItems[0];
  65.         }else{
  66.             return null;
  67.         }
  68.     }
  69.     
  70.     // prototying the Element
  71.     Element.prototype.selectSingleNode = function(cXPathString){ 
  72.         if(this.ownerDocument.selectSingleNode){
  73.             return this.ownerDocument.selectSingleNode(cXPathString, this);
  74.         }else{
  75.             throw "For XML Elements Only";
  76.         }
  77.     }
  78. }
  79. //使fireFox也支持xmlDom.xml
  80. if(!document.all)
  81.     Node.prototype.__defineGetter__
  82.     (
  83.         "xml",
  84.         function()
  85.         {
  86.             return (new XMLSerializer).serializeToString(this);
  87.         }
  88.     );

以上方法在FIREFOX与IE环境下的使用方法相同,都是用 loadConfigXml("order.xml")加载一个xml文件,根据不同的浏览器返回一个xmlDom对象,然后就可以调用selectNodes()、selectSingleNode()、xml()方法。只是selectSingleNode()方法在使用时的写法不一样。

以下代码都是取ORDERNO节点的值:

IE:

  1. xmlDom.selectSingleNode("/ORDER/ORDERNO").text;

fireFox:

  1. xmlDom.selectSingleNode("/ORDER/ORDERNO/text()").nodeValue;

用getElementsByTagName()方法取ORDERNO节点的值:

IE:

  1. xmlDoc.getElementsByTagName("ORDERNO").item(0).text

fireFox:

  1. xmlDoc.getElementsByTagName("ORDERNO")[0].childNodes[0].nodeValue;

用getElementsByTagName()方法需要注意的是,如果ORDERNO节点为空节点即<ORDERNO/>时,以上IE的用法不会报错,而fireFox中会因为ORDERNO节点没有childNodes报错(报"undefined"错误);

5、判断XML节点是否为空节点并给空节点赋值

  1. xmlDoc = loadConfigXml("order.xml");
  2. if(document.implementation && document.implementation.createDocument){//FIREFOX
  3.     var c = xmlDoc.getElementsByTagName("ORDERNO")[0];
  4.     if((typeof c.childNodes[0])=='undefined'){
  5.         var newtext = xmlDoc.createTextNode("");
  6.         c.appendChild(newtext);
  7.     } 
  8.         alert(c.childNodes[0].nodeValue); //这里打印的值为空
  9.         c.childNodes[0].nodeValue = "8888"; //赋值
  10.         alert(c.childNodes[0].nodeValue); //这里打印的值为"8888"
  11. }else if(typeof window.ActiveXObject != 'undefined') {//IE
  12.  //selectSingleNode方式
  13.  /** 
  14.  var c = xmlDoc.selectSingleNode("/ORDER/ORDERNO").text;
  15.     alert(c);
  16.     if(c==''){
  17.         c="8888";
  18.     }
  19.     alert(c);
  20.  **/
  21.  //getElementsByTagName方式
  22.     var c = xmlDoc.getElementsByTagName("ORDERNO").item(0);
  23.     alert(c.text);
  24.     if(c.text==''){
  25.         c.text="8888";
  26.     }
  27.     alert(c.text);
  28. }

 

你可能感兴趣的:(xml,function,浏览器,IE,null,firefox)