判斷對象是否Window的實(shí)現(xiàn)代碼
更新時(shí)間:2012年01月10日 01:20:16 作者:
判斷對象是否Window的實(shí)現(xiàn)代碼,需要的朋友可以參考下。
直入正題吧.
先看jQuery的$.isWindow函數(shù):
function isWin(obj){
return obj && typeof obj === 'object' && 'setInterval' in obj;
}
這個(gè)函數(shù)本身是很科學(xué)的, 它主要是通過檢查目標(biāo)對象是否擁有setInterval屬性來判斷.
然而問題在于, 在缺少約定的情況下, 它也許并不太可靠, 比如:
var o={xx:'oo'};
o['setInterval']=true;
console.log( isWin(o) ); // true
上例通過給對象字面量添加setInterval屬性, 欺詐成功.
而事實(shí)上, 任何一個(gè)非null的Object都可以如此偽裝, 比如數(shù)組:
var arr=[1,2,3];
arr['setInterval']=true;
console.log( isWin(arr) ); // true
相比上面的屬性屬性檢查, 一個(gè)更為妥善的方法是使用對象的toString函數(shù)來判斷:
function isWin(obj){
return Object.prototype.toString.call(obj)==='[object Window]'
}
以上函數(shù)在標(biāo)準(zhǔn)瀏覽器中妥妥的, 但同時(shí)又帶來了新的兼容問題:
// ie6-8中的結(jié)果
Object.prototype.toString.call(window)==='[object Window]'; // false
Object.prototype.toString.call(window)==='[object Object]'; // true
// chrome
Object.prototype.toString.call(window)==='[object global]'; // true
// safari
Object.prototype.toString.call(window)==='[object DOMWindow]'; // true
果然, 主要的問題又是來自萬惡的ie們. 所幸天無絕人之路, 這又讓我想起了ie中的一個(gè)靈異事件:
// 下面兩行, 信不信?
console.log( window==document ); // true
console.log( document==window ); // false
寫到這里, 我想最終的解決方案已經(jīng)出來了:
function isWin(obj){
return/Window|global/.test({}.toString.call(obj))||obj==obj.document&&obj.document!=obj;
}
先看jQuery的$.isWindow函數(shù):
復(fù)制代碼 代碼如下:
function isWin(obj){
return obj && typeof obj === 'object' && 'setInterval' in obj;
}
這個(gè)函數(shù)本身是很科學(xué)的, 它主要是通過檢查目標(biāo)對象是否擁有setInterval屬性來判斷.
然而問題在于, 在缺少約定的情況下, 它也許并不太可靠, 比如:
復(fù)制代碼 代碼如下:
var o={xx:'oo'};
o['setInterval']=true;
console.log( isWin(o) ); // true
上例通過給對象字面量添加setInterval屬性, 欺詐成功.
而事實(shí)上, 任何一個(gè)非null的Object都可以如此偽裝, 比如數(shù)組:
復(fù)制代碼 代碼如下:
var arr=[1,2,3];
arr['setInterval']=true;
console.log( isWin(arr) ); // true
相比上面的屬性屬性檢查, 一個(gè)更為妥善的方法是使用對象的toString函數(shù)來判斷:
復(fù)制代碼 代碼如下:
function isWin(obj){
return Object.prototype.toString.call(obj)==='[object Window]'
}
以上函數(shù)在標(biāo)準(zhǔn)瀏覽器中妥妥的, 但同時(shí)又帶來了新的兼容問題:
復(fù)制代碼 代碼如下:
// ie6-8中的結(jié)果
Object.prototype.toString.call(window)==='[object Window]'; // false
Object.prototype.toString.call(window)==='[object Object]'; // true
// chrome
Object.prototype.toString.call(window)==='[object global]'; // true
// safari
Object.prototype.toString.call(window)==='[object DOMWindow]'; // true
果然, 主要的問題又是來自萬惡的ie們. 所幸天無絕人之路, 這又讓我想起了ie中的一個(gè)靈異事件:
復(fù)制代碼 代碼如下:
// 下面兩行, 信不信?
console.log( window==document ); // true
console.log( document==window ); // false
寫到這里, 我想最終的解決方案已經(jīng)出來了:
復(fù)制代碼 代碼如下:
function isWin(obj){
return/Window|global/.test({}.toString.call(obj))||obj==obj.document&&obj.document!=obj;
}
相關(guān)文章
使用jQuery解決IE與FireFox下createElement方法的差異
使用jQuery解決IE與FireFox下createElement方法的差異。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11
jQuery回調(diào)函數(shù)的定義及用法實(shí)例
這篇文章主要介紹了jQuery回調(diào)函數(shù)的定義及用法,以實(shí)例形式詳細(xì)分析了回調(diào)函數(shù)的原理與實(shí)現(xiàn)技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
jquery中map函數(shù)遍歷數(shù)組用法實(shí)例
這篇文章主要介紹了jquery中map函數(shù)遍歷數(shù)組用法,實(shí)例分析了jQuery中map函數(shù)遍歷數(shù)組的相關(guān)技巧,并提供了一個(gè)自定義遍歷數(shù)組函數(shù)供參考之用,需要的朋友可以參考下2015-05-05
jQuery基礎(chǔ)知識(shí)filter()和find()實(shí)例說明
這是jQuery里常用的2個(gè)方法。他們2者功能是完全不同的,而初學(xué)者往往會(huì)被誤導(dǎo)。2010-07-07
jQuery幫助之CSS尺寸(五)outerHeight、outerWidth
在前面我們分別通過innerHeight()和innerWidth()來獲得第一個(gè)匹配元素內(nèi)部區(qū)域的高度和寬度,我們在應(yīng)用中往往除了需要內(nèi)部的尺寸,同樣還需要知道外部的高度和寬度.2009-11-11
Treegrid的動(dòng)態(tài)加載實(shí)例代碼
這篇文章主要介紹了Treegrid的動(dòng)態(tài)加載實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-04-04

