判斷對象是否Window的實現(xiàn)代碼
更新時間:2012年01月10日 01:20:16 作者:
判斷對象是否Window的實現(xiàn)代碼,需要的朋友可以參考下。
直入正題吧.
先看jQuery的$.isWindow函數(shù):
function isWin(obj){
return obj && typeof obj === 'object' && 'setInterval' in obj;
}
這個函數(shù)本身是很科學的, 它主要是通過檢查目標對象是否擁有setInterval屬性來判斷.
然而問題在于, 在缺少約定的情況下, 它也許并不太可靠, 比如:
var o={xx:'oo'};
o['setInterval']=true;
console.log( isWin(o) ); // true
上例通過給對象字面量添加setInterval屬性, 欺詐成功.
而事實上, 任何一個非null的Object都可以如此偽裝, 比如數(shù)組:
var arr=[1,2,3];
arr['setInterval']=true;
console.log( isWin(arr) ); // true
相比上面的屬性屬性檢查, 一個更為妥善的方法是使用對象的toString函數(shù)來判斷:
function isWin(obj){
return Object.prototype.toString.call(obj)==='[object Window]'
}
以上函數(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中的一個靈異事件:
// 下面兩行, 信不信?
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ù):
復制代碼 代碼如下:
function isWin(obj){
return obj && typeof obj === 'object' && 'setInterval' in obj;
}
這個函數(shù)本身是很科學的, 它主要是通過檢查目標對象是否擁有setInterval屬性來判斷.
然而問題在于, 在缺少約定的情況下, 它也許并不太可靠, 比如:
復制代碼 代碼如下:
var o={xx:'oo'};
o['setInterval']=true;
console.log( isWin(o) ); // true
上例通過給對象字面量添加setInterval屬性, 欺詐成功.
而事實上, 任何一個非null的Object都可以如此偽裝, 比如數(shù)組:
復制代碼 代碼如下:
var arr=[1,2,3];
arr['setInterval']=true;
console.log( isWin(arr) ); // true
相比上面的屬性屬性檢查, 一個更為妥善的方法是使用對象的toString函數(shù)來判斷:
復制代碼 代碼如下:
function isWin(obj){
return Object.prototype.toString.call(obj)==='[object Window]'
}
以上函數(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中的一個靈異事件:
復制代碼 代碼如下:
// 下面兩行, 信不信?
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;
}
相關(guān)文章
jquery隊列queue與原生模仿其實現(xiàn)方法分享
jquery中的queue和dequeue是一組很有用的方法,他們對于一系列需要按次序運行的函數(shù)特別有用。特別animate動畫,ajax,以及timeout等需要一定時間的函數(shù)2014-03-03輕松學習jQuery插件EasyUI EasyUI創(chuàng)建樹形菜單
這篇文章主要幫助大家輕松學習jQuery插件EasyUI,EasyUI創(chuàng)建樹形菜單,內(nèi)容很豐富,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-11-11jQuery dateRangePicker插件使用方法詳解
這篇文章主要為大家詳細介紹了jQuery dateRangePicker插件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07jquery trigger函數(shù)執(zhí)行兩次的解決方法
這篇文章主要介紹了jquery trigger函數(shù)執(zhí)行兩次的解決方法,詳細分析了trigger函數(shù)執(zhí)行兩次的原因與響應(yīng)的解決技巧,非常具有實用價值,需要的朋友可以參考下2016-02-02淺析onsubmit校驗表單時利用ajax的return false無效問題
前幾天,在校驗一個表單數(shù)據(jù)用到ajax時,遇到 return false 無效問題,以下就是對這個問題進行了分析介紹,需要的朋友可以參考下2013-07-07