1.eval(idName)
【问题描述】: IE 、 safari 、 Chrome 浏览器下都可以使用 eval(idName) 或 getElementById(idName) 来取得 id 为 idName 的 HTML 对象; firefox 下只能使用 getElementById(idName) 来取得 id 为 idName 的 HTML 对象 .
【兼容办法】: 统一用 getElementById("idName") 来取得 id 为 idName 的 HTML 对象。
2.ActiveXObject
【问题描述】: IE 下支持用 var obj = new ActiveXObject() 的方式创建对象,但其它浏览器都会提示 ActiveXObject 对象未定义。
【兼容办法】:
(1) 在使用 new ActiveXObject() 之前先判断浏览器是否支持 ActiveXObject 对象,以创建 AJAX 对象为例:
      
        1
      
      
        if
      
      
        (window.ActiveXObject)
      
      
        2
      
      
        {
      
      
        3
      
      
        this
      
      .req=
      
        new
      
       ActiveXObject("Microsoft.XMLHTTP"
      
        );
      
      
        4
      
      
        }
      
      
        5
      
      
        else
      
      
        if
      
      
        (window.XMLHttpRequest)
      
      
        6
      
      
        {
      
      
        7
      
      
        this
      
      .req=
      
        new
      
      
         XMLHttpRequest();
      
      
        8
      
       }
    
    
  (2) 使用 jQuery 封装的 ajax 方法来创建对象,以创建 AJAX 对象为例 (推荐) :
      
         1
      
      
        var
      
       strResponse = ""
      
        ;
      
      
         2
      
       jQuery.ajax({ url: sAspFile, data: "<root>" + sSend + "</root>", processData: 
      
        false
      
      , async: 
      
        false
      
      , type: "POST"
      
        ,
      
      
         3
      
           error: 
      
        function
      
      
        (XMLHttpRequest, textStatus, errorThrown) 
      
      
         4
      
      
            {
      
      
         5
      
                   strResponse =
      
         textStatus;
      
      
         6
      
      
            },
      
      
         7
      
            success: 
      
        function
      
      
        (data, textStatus)
      
      
         8
      
      
             {
      
      
         9
      
                   strResponse =
      
         data;
      
      
        10
      
      
            } 
      
      
        11
      
       });    
    
    
  3.XML 操作
【问题描述】: 通常装载 xml 文档使用 ActiveXObject 对象,但除非 IE 外,其它浏览器都不支持此方法。 XML 文档操作, IE 和其它浏览器也存在不同,通常取 XML 对象的 XML 文本的方法是 xml.documentElement.xml ,但 xml 属性只有 IE 支持,其它浏览器均不支持。查找节点是常用的方法有 selectNodes 和 selectSingleNode ,这两个方法也只有 IE 支持,其它浏览器需要自己扩展。
【兼容办法】
(1) 装载 XML 文档:用 $.ajax() ,参考 jquery 帮助文档
(2)xml 对象转字符串, 如:
      
         1
      
      
        var
      
       stringtoxml = 
      
        function
      
      (str) { 
      
        //
      
      
        字符串转xml对象
      
      
         2
      
      
        var
      
       s = "<?xml version='1.0' encoding='utf-8' ?>" +
      
         str;
      
      
         3
      
      
        var
      
       objxml = 
      
        null
      
      
        ;
      
      
         4
      
      
        if
      
      
         (window.ActiveXObject) {
      
      
         5
      
               objxml = 
      
        new
      
       ActiveXObject("Microsoft.XMLDOM"
      
        );
      
      
         6
      
               objxml.async = 
      
        false
      
      
        ;
      
      
         7
      
      
                objxml.loadXML(s);
      
      
         8
      
      
            }
      
      
         9
      
      
        else
      
      
         {
      
      
        10
      
               objxml = (
      
        new
      
       DOMParser()).parseFromString(s, "text/xml"
      
        );
      
      
        11
      
      
            }
      
      
        12
      
      
        return
      
      
         objxml;
      
      
        13
      
      
        }
      
      
        14
      
      
        15
      
      
        var
      
       xmltostring = 
      
        function
      
      (dom) {  
      
        //
      
      
        xml对象转字符串
      
      
        16
      
      
        if
      
       (dom 
      
        instanceof
      
      
         jQuery) {
      
      
        17
      
               dom = dom[0
      
        ];
      
      
        18
      
      
            }
      
      
        19
      
      
        var
      
       str = 
      
        null
      
      
        ;
      
      
        20
      
      
        if
      
      
         (window.ActiveXObject) {
      
      
        21
      
               str =
      
         dom.xml;
      
      
        22
      
      
            }
      
      
        23
      
      
        else
      
      
         {
      
      
        24
      
               str = (
      
        new
      
      
         XMLSerializer()).serializeToString(dom);
      
      
        25
      
      
            }
      
      
        26
      
      
        return
      
      
         str;
      
      
        27
      
      
        }
      
      
        28
      
      
        29
      
      
        var
      
       oXMLO = stringtoxml("<root>"+ xml +"</root>"
      
        );
      
      
        30
      
      
        var
      
       root =
      
         oXMLO.documentElement;
      
      
        31
      
      
        var
      
       strXml = xmltostring(root).replace("<root>","");
    
    
  (3) 字符串转 xml 对象, 如:
      
        1
      
      
        var
      
       oXML = stringtoxml("<root>" + document.getElementById("hidTaskXml").value + "</root>");
    
  (4) 查找结点:可以用 JQUERY 同的 find 方法来查找结点,如:
      
        1
      
      
        var
      
       item = $(oXML).find("record");
    
  或者用原型扩展方法为 XML 对象添加 selectNodes 和 selectSingleNode 方法,扩展方法如下:
      
        if
      
      ( document.implementation.hasFeature("XPath", "3.0"
      
        ) ) 
{
    XMLDocument.prototype.selectNodes 
      
      =
      
        function
      
      
        (cXPathString, xNode) 
    {
        
      
      
        if
      
      ( !
      
        xNode ) 
        { 
            xNode 
      
      = 
      
        this
      
      
        ; 
        } 
        
      
      
        var
      
       oNSResolver = 
      
        this
      
      .createNSResolver(
      
        this
      
      
        .documentElement); 
        
      
      
        var
      
       aItems = 
      
        this
      
      
        .evaluate(cXPathString, xNode, oNSResolver,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
      
      
        null
      
      
        ) ;
        
      
      
        var
      
       aResult =
      
         []; 
        
      
      
        for
      
      ( 
      
        var
      
       i = 0; i < aItems.snapshotLength; i++
      
        )
        {     
            aResult[i] 
      
      =
      
         aItems.snapshotItem(i); 
        } 
    
        
      
      
        return
      
      
         aResult; 
     } 
    Element.prototype.selectNodes 
      
      = 
      
        function
      
      
        (cXPathString)
     {     
        
      
      
        if
      
      (
      
        this
      
      
        .ownerDocument.selectNodes)
        {          
            
      
      
        return
      
      
        this
      
      .ownerDocument.selectNodes(cXPathString, 
      
        this
      
      
        );     
        } 
        
      
      
        else
      
      
        
        {     
            
      
      
        throw
      
       "For XML Elements Only"
      
        ;    
        }  
     }
    XMLDocument.prototype.selectSingleNode 
      
      = 
      
        function
      
      
        (cXPathString, xNode) 
    {
        
      
      
        if
      
      ( !
      
        xNode ) 
        {  
           xNode 
      
      = 
      
        this
      
      
        ; 
        } 
        
      
      
        var
      
       xItems = 
      
        this
      
      
        .selectNodes(cXPathString, xNode);   
        
      
      
        if
      
      ( xItems.length > 0
      
         )
        {     
             
      
      
        return
      
       xItems[0
      
        ];   
        } 
        
      
      
        else
      
      
         
        {   
            
      
      
        return
      
      
        null
      
      
        ;   
        } 
    } 
    Element.prototype.selectSingleNode 
      
      = 
      
        function
      
      
        (cXPathString) 
    {    
        
      
      
        if
      
      (
      
        this
      
      
        .ownerDocument.selectSingleNode) 
        {       
            
      
      
        return
      
      
        this
      
      .ownerDocument.selectSingleNode(cXPathString, 
      
        this
      
      
        );   
        } 
        
      
      
        else
      
      
        
        {      
            
      
      
        throw
      
       "For XML Elements Only"
      
        ;
        }    
     }  
}            
      
    
    
  4.window.execScript()
【问题描述】: 只有 IE 浏览器支持 execScript 方法,其它的都不支持。但所有浏览器都支持 window.eval() 方法。
【兼容办法】: 用 window.eval() 方法代替 window.execScript() 。如
      
        1
      
      
        //
      
      
        window.execScript(“alert(123)”);
      
      
        2
      
      
        3
      
       window.eval(“alert(123)”);
    
  5.window.createPopup()
【问题描述】: 创建一个弹出窗口的方法, IE 支持此方法, Safari 、 FireFox 、 Chrome 都不支持,使用时会提示 createPopup 方法未定义。
【兼容办法】: 可用如下方法为 window 对象添加 createPopup 方法。
      
        if
      
       (!
      
        window.createPopup) {   
    
      
      
        var
      
       __createPopup = 
      
        function
      
      
        () {   
        
      
      
        var
      
       SetElementStyles = 
      
        function
      
      
        ( element, styleDict ) {   
            
      
      
        var
      
       style =
      
         element.style ;   
            
      
      
        for
      
       ( 
      
        var
      
       styleName 
      
        in
      
       styleDict )style[ styleName ] =
      
         styleDict[ styleName ] ;    
        }   
        
      
      
        var
      
       eDiv = document.createElement( 'div'
      
         );    
        SetElementStyles( eDiv, { 
      
      'position': 'absolute', 'top': 0 + 'px', 'left': 0 + 'px', 'width': 0 + 'px', 'height': 0 + 'px', 'zIndex': 1000, 'display' : 'none', 'overflow' : 'hidden'
      
         } ) ;   
        eDiv.body 
      
      =
      
         eDiv ;   
        
      
      
        var
      
       opened = 
      
        false
      
      
         ;   
        
      
      
        var
      
       setOpened = 
      
        function
      
      
        ( b ) {   
            opened 
      
      =
      
         b;    
        }   
        
      
      
        var
      
       getOpened = 
      
        function
      
      
        () {   
            
      
      
        return
      
      
         opened ;    
        }   
        
      
      
        var
      
       getCoordinates = 
      
        function
      
      
        ( oElement ) {   
            
      
      
        var
      
       coordinates = {x:0,y:0
      
        } ;    
            
      
      
        while
      
      
        ( oElement ) {   
                coordinates.x 
      
      +=
      
         oElement.offsetLeft ;   
                coordinates.y 
      
      +=
      
         oElement.offsetTop ;   
                oElement 
      
      =
      
         oElement.offsetParent ;   
            }   
            
      
      
        return
      
      
         coordinates ;   
        }   
        
      
      
        return
      
      
         {
            htmlTxt : 
      
      ''
      
        , 
      document : eDiv, 
      isOpen : getOpened(), 
      isShow : 
      
      
        false
      
      
        , 
      hide : 
      
      
        function
      
      
        () { 
       SetElementStyles( eDiv, { 
      
      'top': 0 + 'px', 'left': 0 + 'px', 'width': 0 + 'px', 'height': 0 + 'px', 'display' : 'none'
      
         } ) ; 
       eDiv.innerHTML 
      
      = ''
      
         ; 
       
      
      
        this
      
      .isShow = 
      
        false
      
      
         ; 
      }, 
      show : 
      
      
        function
      
      
        ( iX, iY, iWidth, iHeight, oElement ) { 
       
      
      
        if
      
       (!
      
        getOpened()) { 
        document.body.appendChild( eDiv ) ; setOpened( 
      
      
        true
      
      
         ) ; 
       } ; 
       
      
      
        this
      
      .htmlTxt =
      
         eDiv.innerHTML ; 
       
      
      
        if
      
       (
      
        this
      
      
        .isShow) { 
           
      
      
        this
      
      
        .hide() ; 
       } ; 
       eDiv.innerHTML 
      
      = 
      
        this
      
      
        .htmlTxt ; 
       
      
      
        var
      
       coordinates =
      
         getCoordinates ( oElement ) ; 
       eDiv.style.top 
      
      = ( iX + coordinates.x ) + 'px'
      
         ; 
       eDiv.style.left 
      
      = ( iY + coordinates.y ) + 'px'
      
         ; 
       eDiv.style.width 
      
      = iWidth + 'px'
      
         ; 
       eDiv.style.height 
      
      = iHeight + 'px'
      
         ; 
       eDiv.style.display 
      
      = 'block'
      
         ; 
       
      
      
        this
      
      .isShow = 
      
        true
      
      
         ; 
      } 
  }   
    }   
    window.createPopup 
      
      = 
      
        function
      
      
        () {   
        
      
      
        return
      
      
         __createPopup();    
    }   
}
      
    
    
  6.getYear() 方法
【问题描述】: 如下代码:
      
        1
      
      
        var
      
       year= 
      
        new
      
      
         Date().getYear();
      
      
        2
      
      
        3
      
       document.write(year);
    
  在 IE 中得到的日期是 "2011" ,在 Firefox 中看到的日期是 "111" ,主要是因为在 Firefox 里面 getYear 返回的是 " 当前年份 -1900" 的值。
【兼容办法】: 解决办法是加上对年份的判断,如 :
      
        1
      
      
        var
      
       year= 
      
        new
      
      
         Date().getYear();
      
      
        2
      
       year = (year<1900?(1900+
      
        year):year);
      
      
        3
      
       document.write(year);
    
  也可以通过 getFullYear getUTCFullYear 去调用 :
      
        1
      
      
        var
      
       year = 
      
        new
      
      
         Date().getFullYear();
      
      
        2
      
      
        3
      
       document.write(year);
    
  7.document.all
【问题描述】: document.all 在 IE 、 Safari 下都可以使用, firefox 、 Chrome 下不能使用
【兼容办法】: 所有以 document.all.* 方法获取对象的地方都改为 document.getElementById 或 document.getElementsByName 或 document.getElementsByTagName 。
8. 变量名与对象 ID 相同的问题
【问题描述】 :IE 下 ,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用,如下面的写法:
      objid.value = “123”;
      
        //
      
      
        objid为控件ID
      
    
  其它浏览器下则不能这样写。原因是其它浏览器下 , 可以使用与 HTML 对象 ID 相同的变量名, IE 下则不能。
【兼容办法】: 使用 document.getElementById(idName) 等通用方法先获取对象,再操行其它操作。如 :
      document.getElementById(objid).value = “123”; 
      
        //
      
      
        objid为控件ID
      
    
  注: 最好不要取 HTML 对象 ID 相同的变量名 , 以减少错误 ; 在声明变量时 , 一律加上 var, 以避免歧义。
9.select 元素的 add 方法
【问题描述】: 在 IE , Safari , Chrome 下, select 控件添加项时使用如下的方法:
      document.getElementById(“select1”).add(
      
        new
      
       Options(“aa”,”aa”));
    
  但在 FireFox 下这样操作会报错。
【兼容办法】: 统一使用兼容方法,加 options 属性,如下:
      document.getElementById(“select1”).options.add(
      
        new
      
       Options(“aa”,”aa”));
    
  10.html 元素的自定义属性
【问题描述】: IE 下元素属性访问方法如 document.getElementById(id). 属性名,而且对于自定义属性和非自定义属性均有效。但在其它浏览器下该方法只适应于元素的公共属性,自定义属性则取不到。
【兼容办法】: 用 jQuery 的方法来取,如 $(“#id”).attr(“ 属性 ”) 或用 document.getElementById(id).getAttribute(“ 属性 ”), 两种方法都可以适用所有浏览器。
11.html 元素 innerText 属性
【问题描述】: 取元素文本的属性 innerText 在 IE 中能正常工作,但此属性不是 DHTML 标准,其它浏览器不支持,其它浏览器中使用 textContent 属性获取。
【兼容办法】:
(1) 通用方法是用 jQuery 方法 $(“#id”).text() ,如:
      
        //
      
      
        document.getElementById(id).innerText;
      
      
        
$(“#id”).text();
      
    
  (2) 取值前判断浏览器,根据具体情况取值,如:
      
        var
      
       obj =
      
         document.getElementById(id);
      
      
        var
      
       str = (obj.innerText)?obj.innerText:obj.textContent;
    
  (3) 也可以通过原型扩展方法来为元素添加 innerText ,扩展方法如下:
      
        if
      
      (
      
        typeof
      
      (HTMLElement)!="undefined" && !
      
        window.opera) 
{ 
    
      
      
        var
      
       pro =
      
         window.HTMLElement.prototype;     
    pro.__defineGetter__(
      
      "innerText",
      
        function
      
      
         (){ 
        
      
      
        var
      
       anyString = ""
      
        ; 
        
      
      
        var
      
       childS = 
      
        this
      
      
        .childNodes; 
        
      
      
        for
      
      (
      
        var
      
       i=0; i<childS.length; i++
      
        ) 
        { 
            
      
      
        if
      
      (childS[i].nodeType==1
      
        )
            { 
                anyString 
      
      += childS[i].tagName=="BR" ? '\n'
      
         : childS[i].innerText; 
            }
            
      
      
        else
      
      
        if
      
      (childS[i].nodeType==3
      
        ) 
            {
                anyString 
      
      +=
      
         childS[i].nodeValue; 
            }
        } 
        
      
      
        return
      
      
         anyString; 
     }); 
     pro.__defineSetter__(
      
      "innerText",
      
        function
      
      
        (sText){
        
      
      
        this
      
      .textContent=
      
        sText; 
     });   
}
      
    
    
  12.html 元素 innerHTML 、 outerHTML 属性
【问题描述】: innerHTML 是所有浏览器都支持的属性。 outerHTML 属性不是 DHTML 标准, IE 外的其它浏览器不支持。
【兼容办法】: 在非 IE 浏览器下必须使用扩展方法才能获取,扩展方法如下:
      
        if
      
      (
      
        typeof
      
      (HTMLElement)!="undefined" && !
      
        window.opera) 
{ 
     
      
      
        var
      
       pro =
      
         window.HTMLElement.prototype;     
     pro.__defineGetter__(
      
      "outerHTML", 
      
        function
      
      
        (){     
          
      
      
        var
      
       str = "<" + 
      
        this
      
      
        .tagName;     
          
      
      
        var
      
       a = 
      
        this
      
      
        .attributes;     
          
      
      
        for
      
      (
      
        var
      
       i = 0, len = a.length; i < len; i++
      
        )
          {     
               
      
      
        if
      
      
        (a[i].specified)
               {     
                    str 
      
      += " " + a[i].name + '="' + a[i].value + '"'
      
        ;     
               }     
          }     
          
      
      
        if
      
      (!
      
        this
      
      
        .canHaveChildren)
          {     
               
      
      
        return
      
       str + " />"
      
        ;     
          }     
          
      
      
        return
      
       str + ">" + 
      
        this
      
      .innerHTML + "</" + 
      
        this
      
      .tagName + ">"
      
        ;     
     });     
      pro.__defineSetter__(
      
      "outerHTML", 
      
        function
      
      
        (s){     
          
      
      
        var
      
       r = 
      
        this
      
      
        .ownerDocument.createRange();     
          r.setStartBefore(
      
      
        this
      
      
        );     
          
      
      
        var
      
       df =
      
         r.createContextualFragment(s);     
          
      
      
        this
      
      .parentNode.replaceChild(df, 
      
        this
      
      
        );     
          
      
      
        return
      
      
         s;     
     });     
}
      
    
    
  13.html 元素 parentElement 属性
【问题描述】: parentElement 是取元素父结点的属性,此属性只有 IE 支持,其它浏览器均不支持。
【兼容办法】: 用 parentNode 属性来获取父结点,如:
      
        //
      
      
        document.getElementById(id).parentElement;
      
      
        
document.getElementById(id).parentNode;
      
    
  14. 集合类对象问题
【问题描述】: IE 下对于集合类对象,如 forms,frames 等 , 可以使用 () 或 [] 获取集合类对象, Safari , Chrome 也都支持,如
document.forms(“formid”) 或 document.forms[“formid”]。 但 Firefox 下 , 只能使用 [] 获取集合类对象。
【兼容办法】: 统一使用 [] 获取集合类对象,如:
      document.forms[0
      
        ];
document.forms[“formid”];
      
    
  【注】: 所有以数组方式存储的对象都在访问子成员时,都必须以 [] 方式索引得到,如常见的 XML 文档遍历,也需要改,如下:
      
        //
      
      
         xmldoc.documentElement.childNodes(1) 
      
      
        
xmldoc.documentElement.childNodes[
      
      1]
    
  15.frame 操作
【问题描述】: 在 IE、 Safari 、 Chrome 下,用 window 对象访问 frame 对象时,可以用 id 和 name 属性来获取,如
      
        window.frameId;
window.frameName;
      
    
  但在 firefox 下,必须使用 frame 对象的 name 属性才能获取到。
【兼容办法】:
(1) 访问 frame 对象: 统一使用 window.document.getElementById(frameId) 来访问这个 frame 对象。
(2) 切换 frame 内容: 统一使用 window.document.getElementById(testFrame).src=xxx.htm 切换。
如果需要将 frame 中的参数传回父窗口,可以在 frame 中使用 parent 来访问父窗口。例如: parent.document.form1.filename.value=Aqing;
(3)iframe 页中的对象 : $("#frameid").contents().find("#html 控件 id")
(4)iframe 页中的 iframe: $("#frameid").contents().find("#frameid1").contents();
(5)iframe 中的方法或变量: $("#frameid")[0] .contentWindow.SaveFile("false", strRet, a);
16.insertAdjacentHTML 和 insertAdjacentText
【问题描述】: insertAdjacentHTML 方法是比 innerHTML 、 outerHTML 属性更灵活的插入 HTML 代码的方法。它可以实现在一个 DOM 元素的前面、后面、第一个子元素前面、最后一个子元素后面四个位置,插入指定的 HTML 代码。不是 W3C 标准的 DOM 方法, W3C 近期在 HTML5 草案中扩展了这个方法。
insertAdjacentText 是比 innerText 、 outerText 属性更灵活的插入文本的方法。它可以实现在一个 DOM 元素的前面、后面、第一个子元素前面、最后一个子元素后面四个位置,插入指定的文本。不是 W3C 标准的 DOM 方法,至今为止 W3C 的 HTML5 还未涉及此方法。
insertAdjacentHTML 和 insertAdjacentText 可以 IE 、 Safari 、 Chrome 上执行,只有 FireFox 不支持,
【兼容办法】: 可用以下方法进行扩展:
      
        if
      
       (
      
        typeof
      
      (HTMLElement) != "undefined"
      
        ) 
{
    HTMLElement.prototype.insertAdjacentElement 
      
      = 
      
        function
      
      
        (where, parsedNode) 
    {
        
      
      
        switch
      
      
         (where) 
        {
            
      
      
        case
      
       "beforeBegin"
      
        :
                
      
      
        this
      
      .parentNode.insertBefore(parsedNode, 
      
        this
      
      
        );
                
      
      
        break
      
      
        ;
            
      
      
        case
      
       "afterBegin"
      
        :
                
      
      
        this
      
      .insertBefore(parsedNode, 
      
        this
      
      
        .firstChild);
                
      
      
        break
      
      
        ;
            
      
      
        case
      
       "beforeEnd"
      
        :
                
      
      
        this
      
      
        .appendChild(parsedNode);
                
      
      
        break
      
      
        ;
            
      
      
        case
      
       "afterEnd"
      
        :
                
      
      
        if
      
       (
      
        this
      
      
        .nextSibling)
                    
      
      
        this
      
      .parentNode.insertBefore(parsedNode, 
      
        this
      
      
        .nextSibling);
                
      
      
        else
      
      
        this
      
      
        .parentNode.appendChild(parsedNode);
                
      
      
        break
      
      
        ;
        }
    }
    HTMLElement.prototype.insertAdjacentHTML 
      
      = 
      
        function
      
      
        (where, htmlStr) 
    {
        
      
      
        var
      
       r = 
      
        this
      
      
        .ownerDocument.createRange();
        r.setStartBefore(
      
      
        this
      
      
        );
        
      
      
        var
      
       parsedHTML =
      
         r.createContextualFragment(htmlStr);
        
      
      
        this
      
      
        .insertAdjacentElement(where, parsedHTML);
    }
    HTMLElement.prototype.insertAdjacentText 
      
      = 
      
        function
      
      
        (where, txtStr) 
    {
        
      
      
        var
      
       parsedText =
      
         document.createTextNode(txtStr);
        
      
      
        this
      
      
        .insertAdjacentElement(where, parsedText);
    }
}        
      
    
    
  17.Html 元素的 children 属性
【问题描述】: children 是取 HTML 元素子结点的属性,只有 IE 下支持,其它浏览器下用 childNodes 。
【兼容办法】: 统一改为用 childNodes 属性取子结点。或用以下方法扩展 HTML 元素的属性:
      
        if
      
       (
      
        typeof
      
      (HTMLElement) != "undefined"
      
        ) 
{
    HTMLElement.prototype.__defineGetter__(
      
      "children",
      
        function
      
      
        (){ 
         
      
      
        var
      
       returnValue = 
      
        new
      
      
         Object(); 
         
      
      
        var
      
       number = 0
      
        ; 
         
      
      
        for
      
      (
      
        var
      
       i=0; i<
      
        this
      
      .childNodes.length; i++
      
        )
         { 
             
      
      
        if
      
      (
      
        this
      
      .childNodes[i].nodeType == 1
      
        )
             { 
                 returnValue[number] 
      
      = 
      
        this
      
      
        .childNodes[i]; 
                 number
      
      ++
      
        ; 
             } 
         } 
         returnValue.length 
      
      =
      
         number; 
         
      
      
        return
      
      
         returnValue; 
    })
}
      
    
    
  18.insertRow \ inserCell
【问题描述】: insertRow 和 insertCell 是在表格中插入行或插入列的方法,在 IE 中使用方法如下
      
        var
      
       nowTB = document.getElementById("tb1"
      
        );
nowTR 
      
      =
      
         nowTB.insertRow();
nowTD 
      
      = nowTR.insertCell(); 
    
  Safari 、 Chrome 下也可以正常执行,但插入行的位置不一样 IE 下默认在表尾插入行, Safari 、 Chrome 默认在表头插入行;但在 FireFox 下调用会报错。
【兼容办法】: 下面的方法可以在所有浏览器上调用,而且插入行的位置都是表尾,不同之处就是执行前传递一个默认值。推荐使用。
      
        var
      
       nowTB = document.getElementById("tb1"
      
        );
nowTR 
      
      = nowTB.insertRow(-1
      
        );
nowTD 
      
      = nowTR.insertCell(-1);
    
  19.document.createElement
【问题描述】: IE 有 3 种方式都可以创建一个元素 :
      1 document.createElement("<input type=text>"
      
        )
      
      2 document.createElement("<input>"
      
        )
      
      3 document.createElement("input")
    
  Safari 、 FireFox 、 Chrome 只支持一种方式 :
      document.createElement("input"
      
        );
document.setAttribute(name,value);
      
    
  【兼容办法】: 统一使用所有浏览器都支持的方法,如下:
      document.createElement("input"
      
        );
document.setAttribute(name,value);
      
    
  20. 浏览器处理 childNodes 的异同
【问题描述】: 如下 HTML 代码:
      <ul id="main">
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<input type=button value="click me!" onclick=
"alert(document.getElementById('main').childNodes.length)">
    
    
  分别用 IE 和其它浏览器运行, IE 的结果是 3 ,而其它则是 7 。
IE 是将一个完整标签作为一个节点,而 Safari 、 FireFox 、 Chrome 除了上述的的情况外,也把一个标签的结束符 “>” 到下一个标签的起始符 “<” 之间的内容(除注释外,包括任何的文字、空格、回车、制表符)也算是一个节点了,而且这种节点也有它们自己独特的属性和值 nodeName="#text" 。
【兼容办法】: 在实际运用中, Safari 、 FireFox 、 Chrome 在遍历子节点时,在 for 循环里加上
if(childNode.nodeName=="#text") continue; 或者 nodeType == 1 这样,便跳过不需要的操作,使程序运行的更有效率。也可以用 node.getElementsByTagName() 回避。
21.document.getElementsByName
【问题描述】: 在元素只有 name 属性,没有 id 属性的情况下,在 IE 中获取不到 DIV 元素,其它浏览器可以获取。当前 name 和 id 属性都存在时,所有浏览器都可以获取到 DIV 元素。
【兼容办法】: 尽量用 ID 来获取。
22.tr 操作
【问题描述】: IE 下 table 中无论是用 innerHTML 还是 appendChild 插入 <tr> 都没有效果,因为在 IE 浏览器下 tr 是只读的。而其他浏览器下可以这样操作。
【兼容办法】: 将 <tr> 加到 table 的 <tbody> 元素中,如下面所示:
      
        var
      
       row = document.createElement("tr"
      
        );
      
      
        var
      
       cell = document.createElement("td"
      
        );
      
      
        var
      
       cell_text = document.createTextNode("插入的内容"
      
        );
cell.appendChild(cell_text);
row.appendChild(cell);
document.getElementsByTagName(
      
      "tbody")[0].appendChild(row);
    
    
  23. 移除节点 removeNode()
【问题描述】: appendNode 在 IE 和其它浏览器下都能正常使用,但是 removeNode 只能在 IE 下用。 removeNode 方法的功能是删除一个节点,语法为 node.removeNode ( false )或者 node.removeNode ( true ),返回值是被删除的节点。
removeNode ( false )表示仅仅删除指定节点,然后这个节点的原孩子节点提升为原双亲节点的孩子节点。
removeNode ( true )表示删除指定节点及其所有下属节点。被删除的节点成为了孤立节点,不再具有有孩子节点和双亲节点。
【兼容办法】: 兼容 IE 和其它浏览器的方法是 removeChild ,先回到父节点,在从父节点上移除要移除的节点。
      
        //
      
      
         为了在IE和其它浏览器下都能正常使用,取上一层的父结点,然后remove。
      
      
node.parentNode.removeChild(node);
    
  24.expression
【问题描述】: IE 下样式支持计算表达式 expression ,但其它浏览器不支持,而且 IE 以后高版本也可能不再支持这种样式,所以不允许使用。下面是通常使用的情况:
      <div id=
      
        ”content”
 style
      
      =’height:expression(document.body.offsetHeight-80)”></div>
    
  【兼容办法】: 去掉样式设置,将其写到函数中,分别在页面加载完毕和页面尺寸发生变化时执行。如下:
      $(
      
        function
      
      
        (){
  $(“#content”).height($(document.body).height()
      
      -80
      
        );
})
$(window).resize(
      
      
        function
      
      
        (){
  $(“#content”).height($(document.body).height()
      
      -80
      
        );
});
      
    
    
  25.Cursor
【问题描述】: Cursor 的 hand 属性只有 IE 支持,其它浏览器没有效果,如:
      <div style=”cursor:hand”></div>
    
  【兼容办法】: 统一用 pointer 值,如:
      <div style=”cursor: pointer”></div>
    
  26.CSS 透明问题
【问题描述】: IE 支持但其它浏览器不支持的透明样式如下:
      <div style="filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=20);width:200px;height:200px;background-color:Blue">ddddd</div>
    
  其它浏览器支持但 IE 不支持的透明样式如下:
      <div style="opacity:0.2;width:200px;height:200px;background-color:Blue">ddddd</div>
    
  【兼容办法】: 利用 ”!important” 来设置元素的样式。 Safari , FireFox , Chrome 对于 ”!important” 会自动优先解析,然而 IE 则会忽略。如下
      <div style="filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=20);width:200px;height:200px;background-color:Blue;!important; opacity:0.2">ddddd</div>
    
  27.pixelHeight \ pixelWidth
【问题描述】: pixelHeight \ pixelWidth 是元素的高度和宽度样式,通常获取方法是:
      
        obj.style.pixelWidth;
obj.style.pixelHeight;
      
    
  IE , Safari , Chrome 都支持此样式,返回的值是整数, FireFox 不支持
【兼容办法】: 所有浏览器都支持 obj.style.height ,但返回的值是带单位的,如“ 100px ”。可以用如下方法来获取:
      parseInt(obj.style.height)
    
  28.noWrap
【问题描述】: nowrap 属性是被废弃的属性。
【兼容办法】: 使用 CSS 规则 white-space:nowrap 代替这个属性。
29.CSS 的 float 属性
【问题描述】: Javascript 访问一个给定 CSS 值的最基本句法是: object.style.property ,但部分 CSS 属性跟 Javascript 中的保留字命名相同,如 "float" , "for" , "class" 等,不同浏览器写法不同。
在 IE 中这样写:
      document.getElementById("header").style.styleFloat = "left";
    
  在其它浏览器中这样写:
      document.getElementById("header").style.cssFloat = "left";
    
  【兼容办法】: 兼容方法是在写之前加一个判断,判断浏览器是否是 IE :
      
        if
      
      
        (jQuery.browser.msie){
    document.getElementById(
      
      "header").style.styleFloat = "left"
      
        ;
}
      
      
        else
      
      
        {
    document.getElementById(
      
      "header").style.cssFloat = "left"
      
        ;
}
      
    
  30. 访问 label 标签中的 for
【问题描述】: for 属性规定 label 与哪个表单元素绑定。 在 IE 中这样写:
      
        var
      
       myObject = document.getElementById("myLabel"
      
        );
      
      
        var
      
       myAttribute = myObject.getAttribute("htmlFor");
    
  在 Firefox 中这样写:
      
        var
      
       myObject = document.getElementById("myLabel"
      
        );
      
      
        var
      
       myAttribute = myObject.getAttribute("for");
    
  【兼容办法】: 判断浏览器是否是 IE :
      
        var
      
       myObject = document.getElementById("myLabel"
      
        );
      
      
        if
      
      
        (jQuery.browser.msie){
    
      
      
        var
      
       myAttribute = myObject.getAttribute("htmlFor"
      
        );
}
      
      
        else
      
      
        {
    
      
      
        var
      
       myAttribute = myObject.getAttribute("for"
      
        );
}
      
    
    
  31. 访问和设置 class 属性
【问题描述】: 同样由于 class 是 Javascript 保留字的原因,这两种浏览器使用不同的 JavaScript 方法来获取这个属性。
IE8.0 之前的所有 IE 版本的写法:
      
        var
      
       myObject = document.getElementById("header"
      
        );
      
      
        var
      
       myAttribute = myObject.getAttribute("className");
    
  适用于 IE8.0 以及 firefox 的写法:
      
        var
      
       myObject = document.getElementById("header"
      
        );
      
      
        var
      
       myAttribute = myObject.getAttribute("class");
    
  另外,在使用 setAttribute() 设置 Class 属性的时候,两种浏览器也存在同样的差异。
setAttribute("className",value); 这种写法适用于 IE8.0 之前的所有 IE 版本,注意: IE8.0 也不支持 "className" 属性了。 setAttribute("class",value); 适用于 IE8.0 以及 firefox 。
【兼容办法】:
1.两种都写上:
      
        1
      
      
        //
      
      
        设置header的class为classValue
      
      
        2
      
      
        var
      
       myObject = document.getElementById("header"
      
        );
      
      
        3
      
      
        4
      
       myObject.setAttribute("class","classValue"
      
        );
      
      
        5
      
      
        6
      
       myObject.setAttribute("className","classValue");
    
    
  2. IE 和 FF 都支持 object.className ,所以可以这样写:
      
        var
      
       myObject = document.getElementById("header"
      
        );
myObject.className
      
      ="classValue";
      
        //
      
      
        设置header的class为classValue
      
    
  3.先判断浏览器类型,再根据浏览器类型采用对应的写法。
32. 对象宽高赋值问题
【问题描述】: 非 IE 浏览器中中类似 obj.style.height = imgObj.height 的语句无效 , 必须加上 ’px’ 。
【兼容办法】: 给元素高度宽度附值是,统一都加上 ’px’ ,如:
      obj.style.height = imgObj.height + ‘px’;
    
  33.鼠标位置
【问题描述】: IE 下, even 对象有 x 、 y 属性,但是没有 pageX 、 pageY 属性; Firefox 下, even 对象有 pageX 、 pageY 属性,但是没有 x 、 y 属性; Safari 、 Chrome中x 、 y 属性和 pageX 、 pageY 都有。
【兼容办法】: 使用 mX = event.x ? event.x : event.pageX; 来代替。复杂点还要考虑绝对位置。
      
        function
      
      
         getAbsPoint(e){
    
      
      
        var
      
       x = e.offsetLeft, y =
      
         e.offsetTop;
    
      
      
        while
      
       (e =
      
         e.offsetParent) {
        x 
      
      +=
      
         e.offsetLeft;
        y 
      
      +=
      
         e.offsetTop;
    }
    alert(
      
      "x:" + x + "," + "y:" +
      
         y);
}    
      
    
    
  34.event.srcElement
【问题描述】: IE 下, event 对象有 srcElement 属性,但是没有 target 属性;其它浏览器下, even 对象有 target 属性,但是没有 srcElement 属性。
【兼容办法】:
      
        var
      
       obj = event.srcElement?event.srcElement:event.target;
    
  35. 关于 <input type="file">
(1) 在 safari 浏览器下的此控件没有文本框,只有一个“选取文件”的按钮,所有也没有 onblur 事件,如果在 <input type="file" onblur="alert(0);"> 中用到了需要做特殊处理。
(2) 在 FF 浏览器下用 <input type="file" name="file"> 上传文件后取 file.value 时只能去掉文件名而没有文件路径,不能实现预览的效果,可以用 document.getElementById("pic").files[0].getAsDataURL(); 取到 加密后的路径,此路径只有在 FF 下才可以解析。
(3) 在 safari 浏览器下用 <input type="file" name="file"> 上传文件后取 file.value 时只能去掉文件名而没有文件路径,不能实现预览的效果。建议使用上传后的路径预览。
36.jquery对象是否为空
jquery 对象是否为空判断,用 length 判断一下
      $("#hidTitle").length>0
    
  


 
         
					 
					