谷歌瀏覽器兼容性問題總結


提示:在做兼容性之前,首先要知道HTML頁面的加載順序,否則頁面初始化的時候很容易出錯

 

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對象為例:

復制代碼

if(window.ActiveXObject) { this.req=new ActiveXObject("Microsoft.XMLHTTP"); } else if(window.XMLHttpRequest) { this.req=new XMLHttpRequest(); }

復制代碼

  (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.getElementByIddocument.getElementsByNamedocument.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.insertAdjacentHTMLinsertAdjacentText

  【問題描述】: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:(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;ddddd</div>

  其它瀏覽器支持但IE不支持的透明樣式如下:

<div style="opacity:0.2;width:200px;height:200px;ddddd</div>

  【兼容法】:利用”!important”來設置元素的樣式。Safari,FireFox,Chrome對於”!important”會自動優先解析,然而IE則會忽略。如下

<div style="filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=20);width:200px;height:200px;!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.CSSfloat屬性

  【問題描述】: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


37.
showModalDialog兼容處理

//如果showModalDialog為為空就給它注冊一個window.open事件,juti win.open屬性可百度,有些屬性谷歌不支持
if (!window.showModalDialog) {
window.showModalDialog = function (url) {
return window.open(url, '', ' left=500,width = 355, height = 226 ;'+_winParam);
};
}
return win.showModalDialog(url, window, 'dialogtop=' + winobj.top + 'px;dialogleft=' + winobj.left + 'px;dialogWidth=' + winobj.width + 'px;dialogHeight='
+ winobj.height + 'px;' + _winParam);

 38. table.rows[i].cells[6].style.display is not find

// rows(1) 谷歌報錯  
正確:
for (var i = 0; i < table.rows.length; i++) { table.rows[i].cells[6].style.display = isdisplay== "Y" ? "block" : "none";; }
錯誤:
 table.rows(i).cells(6).style.display = isdisplay== "Y" ? "block" : "none";;
 
         

 39.window.frames['子框架ID'].location is not find

//谷歌獲取Frames元素失敗,谷歌設置frames的location.href失敗  
正確document.getElementById("frmCost").src = url; 谷歌IE都可以 錯誤:window.frames('frmCost').location = url; ie可以
window=當前整個框的一個全局對象 
documnet
=當前整個html文檔 可訪問里面的所有屬性
window.loction
=一個可讀字段
document.loction
=標識這個對象
2020年5月11日補充
1:需要考慮到HTML頁面的初始化與JS方法初始化是否順序沖突, 20200513補充:js代碼放在這里面執行 document.ready和window.onload
2:Document.getElementByID("").src 注意有些ifram頁面的坑寫的是Name,需要自己加ID上去
3:window.parent.frames 改為 parent.document.getElmentByID
 

 40.谷歌獲取HTML表單里面的自定義元素失敗

var types = $(objs[i]).attr("自定義元素名稱").split(",");$()使用jquery選擇器來選擇對象
//var types = obj.自定義的元素.split(","); IE正常,谷歌會出現underfind

 

 41.document.createElement is not find

谷歌,iE都兼容 
第一種
var $span = $('<span onmouseover="this.setCapture()" onmouseout="this.releaseCapture()" onfocus="this.blur()" onbeforeactivate="return false"></span>');//document.createElement obj.insertAdjacentElement("beforeBegin", $span[0]); $span[0].appendChild(obj);
第二種
var option = ("<option value='值'" >" +"值"+ "</option>");

$(sel).append(option);
只有IE兼容
錯誤  //var span = document.createElement('<span onmouseover="this.setCapture()" onmouseout="this.releaseCapture()" onfocus="this.blur()" onbeforeactivate="return false"></span>');
        //obj.insertAdjacentElement("beforeBegin", span);
        //span.appendChild(obj);

 42.谷歌瀏覽器獲取表格里面的<a>標簽文本會存在換行的情況 $(table).find("td:eq(1)").text() 

正確:$.trim((table).find("td:eq(1)").text())  
可能存在問題:$(table).find("td:eq(1)").text()
<a> <%# DataBinder.Eval("value")%> </a> 

1:如上IE,獲取$(row).find("td:eq(1)").text() <a>標簽的文本 是正常的
2:在谷歌獲取到的是換行的操作,會加很多空格 當插入到數據庫的時候將會報文本超長

  43. 頁面table表單 row行: insertRow,insertCell,innerHTML問題

 

正確:谷歌IE兼容
獲取表的行數:table.row[0] var row = table.insertRow(); var cell = row.insertCell(0); cell.innerHTML = row.cells[0].innerHTML;
IE兼容
//table.row(0) //var row = table.insertRow(); //var cell = row.insertCell[0]; //cell.innerHTML = oldRow.cells(0).innerHTML;

 44.在谷歌中,<a>標簽跳轉的頁面,是無法使用windos.close關閉的  只有用js打開的頁面才能使用js關閉 

45.IE下的函數window.showModalDialogwindow.dialogArguments在谷歌不兼容  2020年5月15日 發工資的時候補充此條數據

業務:父頁面有一個Table,然后點擊打開一個模態對話框 ,然后模態對話框插入table數據給父頁面的Table框架

父頁面.js:
//html頁面包含dom樹 有一個tableID

window.showModalDialog(url,window,'長寬高');打開A頁面 此時把window傳給 A頁面了

A頁面.js
window.dialogArguments.tableID 這里可以直接獲取到這個tableID的值
如:tableID.rows.lenght

兼容谷歌寫法:
父頁面.js
if(window.showModalDialog==undefined)
{//谷歌瀏覽器
window.opn(url,document,'height=100,width=100,top=100,left=100,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no')
}
子頁面.js
Var Table=null;
if(window.opener!=underfine) {//谷歌 //獲取子窗口對象 var win=window.opener //獲取子窗口table Table=window.opner.TableID } else {//IE Table=window.dialogArguments.TableID ]
//var TableLength=Table.rows.length
for(i=1;i<Table.rows.length;i++)
{//如果要進行table插入,注意table.row(i)不兼容谷歌 table.row[0]兼容谷歌
  var Table=Table
var cell=row.insertCell(0);
cell.align='center';
cell.innerHTML=Table.row[i].cells[0].innerHTML;
}

 

 46.IE使用 window.parent.showMenu(自定義函數打開的頁面or div) 谷歌如何關閉該頁面

funtion showMenu(div){

就是把傳進來的div框架 插入到div.innerHtml里面 並顯示
div.innerHtm=div
div.style.display="block";
}
要注意的是 因為 window.parent.showMenu 是從父窗口打開的一個div樣式
要在谷歌關閉
必須使用下面的寫法
parent.document.getElementByID("div的ID").style.display="none";
如果別的IE下面使用parent寫法,那么在谷歌兼容的時候 一定要考慮到parent加上 才能獲取到dom樹里面的元素

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM