web開發中,一行代碼解決各種IE兼容問題


首先是自己遇到問題:

一套系統,以前的開發asp舊+c#新后台管理擴展.完善后,在2013年前基本無問題,很是腸順.

其中.到升級了瀏覽器后.例如ie9以后,則問題出現了.

如圖:   這是一個js的計時器,平時正常顯示.但這里不行了....沒有顯示出來.經過測試,在chrome上是可以正常的顯示,ie9以上版本,360瀏覽器均不正常.

 

分析:

1\首先在chrome上是可以正常的顯示,可以判斷,邏輯上,應該是么有錯的了.所以.我之前費了一大周章去折騰,真不科學!汗.....

2\查看對應的js倒計時文件,搜索一大堆資料.發現思考:判斷瀏覽器是否支持跨域訪問。 alert(jQuery.Support.Cors),IE8以下不支持,IE8返回false,google返回true。

所以,為了支持,在對應js 文件頭中加入代碼: jQuery.support.cors=true ;     故障依然,沒有解決.郁悶..

3\於是,就查了資料,考慮   IE   瀏覽跨域問題?決定把系統站點"添加到安全站點"然后在ie安全性上開啟兩個:

跨域瀏覽窗口和框架,

通過域訪問數據源.

可惜,故障依舊沒有解決.

4\查看js的關鍵代碼function MM_findObj(n, d)函數:這是DW自動生成的用來顯示和隱藏層的方法。這一段也看得我頭大....

function MM_showHideLayers() { //v3.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
    obj.visibility=v; }
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

MM_findObj函數主要作用:取得要復制的對象,並返回 1. if(!d) d=document;: 首先MM_findObj(n, d),有兩個參數,而在兩處用時,一處傳了兩個參數MM_findObj(n,d.layers[i].document),一處傳了一個參數MM_findObj(ob)所以第一個if(!d) d=document;判斷是否傳了第二個參數d,如果沒傳第二個參數d,則!d為true,為d賦值文文件對象document 2. if((p=n.indexOf("?"))>0&&parent.frames.length) 用indexOf查找函數MM_findObj(n, d)的第一個參數n中?的位置(找不到?值為-1,找到?值為相應的位置),並賦給變量p,並判斷這個位置是否大於0, parent.frames.length:父框架個數是否大於0 3. if(!(x=d[n])&&d.all) x=d.all[n]; 為變量x賦值d[n],如果不存在d[n]對象,且d.all存在,則為x賦值d.all[n] 4. for (i=0;!x&&i<d.forms.length;i++) x= d.forms[i][n]; d.forms.length:所傳參數d對象的窗口個數,循環判斷為x賦的值不存在時!x為真,且i< d.forms.length時,重新為x賦值d.forms[i][n] 5. for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); d.layers.length: 所傳參數d對象的層個數,循環判斷為x賦的值不存在時!x為真,且i< d.forms.length時,重新為x賦值遞歸調用自身函數MM_findObj的返回值 6. if(!x && document.getElementById) x= document.getElementById(n); document.getElementById: 所傳參數d對象的對象id, 判斷為x賦的值不存在時!x為真且所傳參數d對象存在對象,則為x賦值document.getElementById(n)

5\好吧,問題來了.....MM_showHideLayers()  也就把這層顯示出來.,,我想,問題的所在就是:這個隱藏的層不能顯示出來.!!!!!!!!!!

6\找到一篇文章:"一行代碼解決各種IE兼容問題,IE6,IE7,IE8,IE9,IE10",我就借鑒了里面的方法: 

在源文件的<head>內加上這句

<meta http-equiv="X-UA-Compatible" content="IE=7">       //這句話的意思是強制使用IE7模式來解析網頁代碼以解決ie9以上的兼容性問題,ie9后,部分層的顯示和交互失效,特此解決

 

在這里送上幾種IE使用模式!

1、強制使用IE7模式來解析網頁代碼

<meta http-equiv=“X-UA-Compatible” content=“IE=8″>

2. Google Chrome Frame也可以讓IE用上Chrome的引擎:

<meta http-equiv=“X-UA-Compatible” content=“chrome=1″ />

3.強制IE8使用IE7模式來解析

<meta http-equiv=“X-UA-Compatible” content=“IE=EmulateIE7″><!– IE7 mode –>

     //或者 <meta http-equiv=“X-UA-Compatible” content=“IE=7″><!– IE7 mode –>

4.強制IE8使用IE6或IE5模式來解析

<meta http-equiv=“X-UA-Compatible” content=“IE=6″><!– IE6 mode –>

<meta http-equiv=“X-UA-Compatible” content=“IE=5″><!– IE5 mode –>

5.如果一個特定版本的IE支持所要求的兼容性模式多於一種,如:

<meta http-equiv=“X-UA-Compatible” content=“IE=5; IE=8″ />

好了。最后終於解決了。。。累了2年的時間,這個疑惑,2017--12月前終於解決。


免責聲明!

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



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