首先是自己遇到問題:
一套系統,以前的開發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 ;
特別說明:假如這裡 編譯執行提示: jquery.support.cors=true jquery未定義,則上網下載 jquery-1.10.2.min.js 這個檔案庫.並把程式碼<script language="javascript" src="jquery-1.10.2.min.js"></script> 庫檔案引用放在檔案開頭,即可解決未定義問題.
在 功能程式 定義前 設定jQuery.Support.Cors = true
在 功能程式 執行完畢之前 讓其它button等觸發事件暫停等待,可以理解為 "執行緒阻塞" 這裡很重要,使程式正常執行 前提....
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月前終於解決。