js中有關(guān)IE版本檢測(cè)
更新時(shí)間:2012年01月04日 16:54:04 作者:
javascript中經(jīng)常用到IE版本的判定,實(shí)現(xiàn)特定需求的代碼。檢測(cè)瀏覽器雖然不是一個(gè)什么好的做法,但是有時(shí)候還是很必要的
見得最多的就是檢測(cè)navigator.userAgent(這個(gè)可以面向所有瀏覽器,略過)。
另外一種就是IE的條件注釋,這篇有個(gè)比較詳細(xì)的說明 http://www.dbjr.com.cn/article/29336.htm
<!--[if !IE]><!-->
<script type="text/javascript">
alert('非IE')
</ script>
<!--<![endif]-->
我測(cè)試的結(jié)果是這種形式是可用的。唯一需要注意的是<!-- [if IE 8]> 中'IE'和'8'中間的這個(gè)空白符是必須的,掉了就悲劇了。
基于IE的條件注釋,變種版本就有幾種,
第一、類似下面的形式:
<!--[if IE 6]>
<input type="hidden" id="ieVersion" value="6" />
<![endif]-->
<!--[if IE 7]>
<input type="hidden" id="ieVersion" value="7" />
<![endif]-->
var ieVersion = (function(){ return document.getElementById('ieVersion')})();
以此類推,可以獲得各個(gè)版本的信息,甚至可以添加gt,gte等,從而一次判定一類版本。
關(guān)于這種寫法,有個(gè)例子就是:
<!--[if IE 6]>
<html class="ie6">
<![endif]-->
<!--[if IE 7]>
<html class="ie7">
<![endif]-->
<!--[if !IE]><!-->
<html><!--<![endif]-->
于是在CSS里面就可以不用別的hack了,從而避免在IE里面多加載一次CSS,
直接
.ie6 xx{}
.ie7 xx{}
.ie8 xx{}
xx{}
第二、既然可以寫在頁(yè)面內(nèi),當(dāng)然也可以JS來(lái)動(dòng)態(tài)生成。我google了一把,發(fā)現(xiàn)還真有人這么做的。
文章地址如下:http://www.dbjr.com.cn/article/29337.htm,寫得還比較詳細(xì),原理也很簡(jiǎn)單。
不過這樣的缺憾就是把條件注釋限定到JS上了,于CSS就是雞肋了。
繼續(xù),既然可以動(dòng)態(tài)生成條件注釋來(lái)辨明IE版本,基于IE的CSS hack,應(yīng)該也可以動(dòng)態(tài)生成一段html片段,用樣式值來(lái)判定版本。
下面是最容易想到的形式,我測(cè)試發(fā)現(xiàn)這么確實(shí)可以,不過也發(fā)現(xiàn)了一個(gè)問題,看下面的一段代碼:
<div id="test_1"><span style="color: red; color: #ff6600\0; color: yellow\9\0; *color:green; _color:blue;">測(cè)試</span></div>
<script type="text/javascript">
var test_1 = document.getElementById('test_1');
var test_2 = document.createElement('div');
test_2.innerHTML = '<span style="color: red; color: #ff6600\\0; color: yellow\\9\\0; *color:green; _color:blue;">測(cè)試</span>';
console.log('test_1:' + test_1.firstChild.style.color + '----' + 'test_2:' + test_2.firstChild.style.color);
</script>
在IE9下結(jié)果:LOG: test_1:yellow----test_2:yellow
在IE8下結(jié)果:LOG: test_1:#ff6600----test_2:#ff6600
在IE7下結(jié)果:LOG: test_1:green----test_2:blue
在IE6下結(jié)果:test_1:blue ----test_2:blue (IE6沒有console.log,所以上面的console.log需要換成alert)
上面的問題大家應(yīng)該看出來(lái)了,IE7下兩種情況不一致,不知道是我的IE7兼容模式的問題還是別的什么原因,知道的請(qǐng)指教。
確認(rèn)代碼:
<div><span style="*color:red; _color:blue;">原始</span></div>
<script>
var test = document.createElement('div');
test.innerHTML = '<span style="*color:red; _color:blue;">動(dòng)態(tài)生成</span>';
document.body.appendChild(test);
</script>
<div id="test_1"><span style="color: red; color: #ff6600\0; color: yellow\9\0; *color:green; _color:blue;">測(cè)試</span></div>
<script type="text/javascript">
var test_1 = document.getElementById('test_1');
//var test_2 = document.createElement('div');
//test_2.innerHTML = '<span style="color: red; color: #ff6600\\0; color: yellow\\9\\0; *color:green; _color:blue;">測(cè)試</span>';
var c = test_1.firstChild.style.color;
alert(c=='red'?'other':c=='yellow'?'IE9':c=='#ff6600'?'IE8':c=='green'?'IE7':'IE6');
</script>
在IE9下結(jié)果:IE9
在IE8下結(jié)果:IE8
在IE7下結(jié)果:IE7
在IE6下結(jié)果:IE6
按理來(lái)說,對(duì)于FF,Chrome/Safari、opera都可以利用-moz、-webkit、-o等私有前綴來(lái)辨別,不過對(duì)于屬性的選取要斟酌,類似color是不行的。
這個(gè)檢測(cè)方法旁門左道而已,未來(lái)版本或者其他瀏覽器是不是有這個(gè)bug也不確定,而且IE7的那個(gè)bug我還沒有弄清楚,所以也就暫時(shí)知道可以這么做就可以了。
另外一種就是IE的條件注釋,這篇有個(gè)比較詳細(xì)的說明 http://www.dbjr.com.cn/article/29336.htm
復(fù)制代碼 代碼如下:
<!--[if !IE]><!-->
<script type="text/javascript">
alert('非IE')
</ script>
<!--<![endif]-->
我測(cè)試的結(jié)果是這種形式是可用的。唯一需要注意的是<!-- [if IE 8]> 中'IE'和'8'中間的這個(gè)空白符是必須的,掉了就悲劇了。
基于IE的條件注釋,變種版本就有幾種,
第一、類似下面的形式:
復(fù)制代碼 代碼如下:
<!--[if IE 6]>
<input type="hidden" id="ieVersion" value="6" />
<![endif]-->
<!--[if IE 7]>
<input type="hidden" id="ieVersion" value="7" />
<![endif]-->
復(fù)制代碼 代碼如下:
var ieVersion = (function(){ return document.getElementById('ieVersion')})();
以此類推,可以獲得各個(gè)版本的信息,甚至可以添加gt,gte等,從而一次判定一類版本。
關(guān)于這種寫法,有個(gè)例子就是:
復(fù)制代碼 代碼如下:
<!--[if IE 6]>
<html class="ie6">
<![endif]-->
<!--[if IE 7]>
<html class="ie7">
<![endif]-->
<!--[if !IE]><!-->
<html><!--<![endif]-->
于是在CSS里面就可以不用別的hack了,從而避免在IE里面多加載一次CSS,
直接
復(fù)制代碼 代碼如下:
.ie6 xx{}
.ie7 xx{}
.ie8 xx{}
xx{}
第二、既然可以寫在頁(yè)面內(nèi),當(dāng)然也可以JS來(lái)動(dòng)態(tài)生成。我google了一把,發(fā)現(xiàn)還真有人這么做的。
文章地址如下:http://www.dbjr.com.cn/article/29337.htm,寫得還比較詳細(xì),原理也很簡(jiǎn)單。
不過這樣的缺憾就是把條件注釋限定到JS上了,于CSS就是雞肋了。
繼續(xù),既然可以動(dòng)態(tài)生成條件注釋來(lái)辨明IE版本,基于IE的CSS hack,應(yīng)該也可以動(dòng)態(tài)生成一段html片段,用樣式值來(lái)判定版本。
下面是最容易想到的形式,我測(cè)試發(fā)現(xiàn)這么確實(shí)可以,不過也發(fā)現(xiàn)了一個(gè)問題,看下面的一段代碼:
復(fù)制代碼 代碼如下:
<div id="test_1"><span style="color: red; color: #ff6600\0; color: yellow\9\0; *color:green; _color:blue;">測(cè)試</span></div>
<script type="text/javascript">
var test_1 = document.getElementById('test_1');
var test_2 = document.createElement('div');
test_2.innerHTML = '<span style="color: red; color: #ff6600\\0; color: yellow\\9\\0; *color:green; _color:blue;">測(cè)試</span>';
console.log('test_1:' + test_1.firstChild.style.color + '----' + 'test_2:' + test_2.firstChild.style.color);
</script>
在IE9下結(jié)果:LOG: test_1:yellow----test_2:yellow
在IE8下結(jié)果:LOG: test_1:#ff6600----test_2:#ff6600
在IE7下結(jié)果:LOG: test_1:green----test_2:blue
在IE6下結(jié)果:test_1:blue ----test_2:blue (IE6沒有console.log,所以上面的console.log需要換成alert)
上面的問題大家應(yīng)該看出來(lái)了,IE7下兩種情況不一致,不知道是我的IE7兼容模式的問題還是別的什么原因,知道的請(qǐng)指教。
確認(rèn)代碼:
復(fù)制代碼 代碼如下:
<div><span style="*color:red; _color:blue;">原始</span></div>
<script>
var test = document.createElement('div');
test.innerHTML = '<span style="*color:red; _color:blue;">動(dòng)態(tài)生成</span>';
document.body.appendChild(test);
</script>
IE7結(jié)果:
IE6結(jié)果:
復(fù)制代碼 代碼如下:
<div id="test_1"><span style="color: red; color: #ff6600\0; color: yellow\9\0; *color:green; _color:blue;">測(cè)試</span></div>
<script type="text/javascript">
var test_1 = document.getElementById('test_1');
//var test_2 = document.createElement('div');
//test_2.innerHTML = '<span style="color: red; color: #ff6600\\0; color: yellow\\9\\0; *color:green; _color:blue;">測(cè)試</span>';
var c = test_1.firstChild.style.color;
alert(c=='red'?'other':c=='yellow'?'IE9':c=='#ff6600'?'IE8':c=='green'?'IE7':'IE6');
</script>
在IE9下結(jié)果:IE9
在IE8下結(jié)果:IE8
在IE7下結(jié)果:IE7
在IE6下結(jié)果:IE6
按理來(lái)說,對(duì)于FF,Chrome/Safari、opera都可以利用-moz、-webkit、-o等私有前綴來(lái)辨別,不過對(duì)于屬性的選取要斟酌,類似color是不行的。
這個(gè)檢測(cè)方法旁門左道而已,未來(lái)版本或者其他瀏覽器是不是有這個(gè)bug也不確定,而且IE7的那個(gè)bug我還沒有弄清楚,所以也就暫時(shí)知道可以這么做就可以了。
您可能感興趣的文章:
- js:日期正則表達(dá)式及檢測(cè)
- 檢測(cè)jQuery.js是否已加載的判斷代碼
- Js檢測(cè)判斷URL網(wǎng)址輸入是否正確
- JavaScript檢測(cè)上傳文件大小的方法
- javascript 檢測(cè)瀏覽器類型和版本的代碼
- javascript檢測(cè)瀏覽器的縮放狀態(tài)實(shí)現(xiàn)代碼
- javascript檢測(cè)對(duì)象中是否存在某個(gè)屬性判斷方法小結(jié)
- JavaScript快速檢測(cè)瀏覽器對(duì)CSS3特性的支持情況
- 使用js檢測(cè)瀏覽器是否支持html5中的video標(biāo)簽的方法
- Javascript中常用的檢測(cè)方法小結(jié)
相關(guān)文章
javawscript 三級(jí)菜單的實(shí)現(xiàn)原理
javawscript 三級(jí)菜單的實(shí)現(xiàn)代碼。2009-07-07JavaScript架構(gòu)前端不能沒有監(jiān)控系統(tǒng)原因
這篇文章主要為大家介紹了為什么前端不能沒有監(jiān)控系統(tǒng)的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06js獲取select標(biāo)簽的值且兼容IE與firefox
本篇文章主要介紹了js獲取select標(biāo)簽的值且兼容IE與firefox。需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2013-12-12詳解js對(duì)象中屬性的兩種類型之?dāng)?shù)據(jù)屬性和訪問器屬性
在理解vue底層響應(yīng)式原理時(shí),了解到,原來(lái)對(duì)象中的屬性,不單單從表面看起來(lái)那么簡(jiǎn)單是key:value形式,而是還有隱藏的內(nèi)部特性,其中對(duì)象內(nèi)的屬性分為兩種類型的屬性:數(shù)據(jù)屬性和訪問器屬性,本文將給大家詳細(xì)介紹一下數(shù)據(jù)屬性和訪問器屬性,需要的朋友可以參考下2023-05-05怎樣用Javascript實(shí)現(xiàn)策略模式
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之策略模式,想學(xué)習(xí)設(shè)計(jì)模式的同學(xué),一定要看一下2021-04-04詳解JavaScript權(quán)威指南之對(duì)象
JavaScript對(duì)象除了可以保持自有的屬性外,還可以從一個(gè)稱為原型的對(duì)象繼承屬性。這篇文章主要介紹了詳解JavaScript權(quán)威指南 之對(duì)象的相關(guān)資料,需要的朋友可以參考下2016-09-09js復(fù)制網(wǎng)頁(yè)內(nèi)容并兼容各主流瀏覽器的代碼
js 復(fù)制網(wǎng)頁(yè)內(nèi)容的方法代碼有很多不過要兼容各瀏覽器就不多了,下面有個(gè)不錯(cuò)的方法,大家可以嘗試操作下2013-12-12在IE下:float屬性會(huì)影響offsetTop的取值
在IE下:float屬性會(huì)影響offsetTop的取值...2006-12-12