最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

判斷對(duì)象是否Window的實(shí)現(xiàn)代碼

 更新時(shí)間:2012年01月10日 01:20:16   作者:  
判斷對(duì)象是否Window的實(shí)現(xiàn)代碼,需要的朋友可以參考下。
直入正題吧.
先看jQuery的$.isWindow函數(shù):

復(fù)制代碼 代碼如下:

function isWin(obj){
return obj && typeof obj === 'object' && 'setInterval' in obj;
}

這個(gè)函數(shù)本身是很科學(xué)的, 它主要是通過(guò)檢查目標(biāo)對(duì)象是否擁有setInterval屬性來(lái)判斷.
然而問(wèn)題在于, 在缺少約定的情況下, 它也許并不太可靠, 比如:

復(fù)制代碼 代碼如下:

var o={xx:'oo'};
o['setInterval']=true;
console.log( isWin(o) ); // true

上例通過(guò)給對(duì)象字面量添加setInterval屬性, 欺詐成功.
而事實(shí)上, 任何一個(gè)非null的Object都可以如此偽裝, 比如數(shù)組:

復(fù)制代碼 代碼如下:

var arr=[1,2,3];
arr['setInterval']=true;
console.log( isWin(arr) ); // true

相比上面的屬性屬性檢查, 一個(gè)更為妥善的方法是使用對(duì)象的toString函數(shù)來(lái)判斷:

復(fù)制代碼 代碼如下:

function isWin(obj){
return Object.prototype.toString.call(obj)==='[object Window]'
}

以上函數(shù)在標(biāo)準(zhǔn)瀏覽器中妥妥的, 但同時(shí)又帶來(lái)了新的兼容問(wèn)題:

復(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

果然, 主要的問(wèn)題又是來(lái)自萬(wàn)惡的ie們. 所幸天無(wú)絕人之路, 這又讓我想起了ie中的一個(gè)靈異事件:

復(fù)制代碼 代碼如下:

// 下面兩行, 信不信?
console.log( window==document ); // true
console.log( document==window ); // false

寫(xiě)到這里, 我想最終的解決方案已經(jīng)出來(lái)了:

復(fù)制代碼 代碼如下:

function isWin(obj){
return/Window|global/.test({}.toString.call(obj))||obj==obj.document&&obj.document!=obj;
}

相關(guān)文章

最新評(píng)論

东宁县| 砚山县| 漳州市| 玉门市| 沈丘县| 松潘县| 新津县| 成武县| 紫阳县| 平罗县| 唐海县| 张家川| 大庆市| 澜沧| 灵宝市| 九台市| 新蔡县| 宝山区| 荣昌县| 绥中县| 叙永县| 霍邱县| 兴化市| 台前县| 蕲春县| 博客| 钟祥市| 梧州市| 辽源市| 湖北省| 纳雍县| 宜川县| 岳西县| 南溪县| 乳源| 溧水县| 门头沟区| 平和县| 建平县| 青神县| 富顺县|