判断对象是否Window的实现代码


Posted in Javascript onJanuary 10, 2012

直入正题吧.
先看jQuery的$.isWindow函数:

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

这个函数本身是很科学的, 它主要是通过检查目标对象是否拥有setInterval属性来判断.
然而问题在于, 在缺少约定的情况下, 它也许并不太可靠, 比如:
var o={xx:'oo'}; 
o['setInterval']=true; 
console.log( isWin(o) ); // true

上例通过给对象字面量添加setInterval属性, 欺诈成功.
而事实上, 任何一个非null的Object都可以如此伪装, 比如数组:
var arr=[1,2,3]; 
arr['setInterval']=true; 
console.log( isWin(arr) ); // true

相比上面的属性属性检查, 一个更为妥善的方法是使用对象的toString函数来判断:
function isWin(obj){ 
return Object.prototype.toString.call(obj)==='[object Window]' 
}

以上函数在标准浏览器中妥妥的, 但同时又带来了新的兼容问题:
// ie6-8中的结果 
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

写到这里, 我想最终的解决方案已经出来了:
function isWin(obj){ 
return/Window|global/.test({}.toString.call(obj))||obj==obj.document&&obj.document!=obj; 
}
Javascript 相关文章推荐
原生js 秒表实现代码
Jul 24 Javascript
jquery自定义滚动条插件示例分享
Feb 21 Javascript
javascript框架设计之类工厂
Jun 23 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
关于JavaScript的单双引号嵌套问题
Aug 20 Javascript
如何让你的JS代码更好看易读
Dec 01 Javascript
基于Vue的ajax公共方法(详解)
Jan 20 Javascript
Vue 理解之白话 getter/setter详解
Apr 16 Javascript
JS实现百度搜索框关键字推荐
Feb 17 Javascript
JavaScript实现拖动对话框效果的实现代码
Oct 12 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
Dec 29 Javascript
vue实现简易音乐播放器
Aug 14 Vue.js
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 #Javascript
javascript中onmouse事件在div中失效问题的解决方法
Jan 09 #Javascript
jQuery 阴影插件代码分享
Jan 09 #Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 #Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 #Javascript
分享几个超级震憾的图片特效
Jan 08 #Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 #Javascript
You might like
php Smarty 字符比较代码
2011/02/27 PHP
PHP加密解密类实例分析
2015/04/20 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
AngularJS中的作用域实例分析
2018/05/16 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
Python logging设置和logger解析
2019/08/28 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
主题酒店策划书
2014/01/28 职场文书
2014年会计工作总结
2014/11/27 职场文书
安全员岗位职责
2015/02/10 职场文书
道歉的话语大全
2015/05/12 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书
mysql自增长id用完了该怎么办
2022/02/12 MySQL