判断对象是否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 相关文章推荐
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
Oct 22 Javascript
js实现单行文本向上滚动效果实例代码
Nov 28 Javascript
js获取 type=radio 值的方法
May 09 Javascript
jquery动态改变form属性提交表单
Jun 03 Javascript
JS的事件绑定深入认识
Jun 26 Javascript
javascript 判断页面访问方式电脑或者移动端
Sep 19 Javascript
浅析Node.js非对称加密方法
Jan 29 Javascript
vue form 表单提交后刷新页面的方法
Sep 04 Javascript
微信小程序:数据存储、传值、取值详解
May 07 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
Sep 29 Javascript
浅析Vue下的components模板使用及应用
Nov 27 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
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中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
js切换div css注意的细节
2012/12/10 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
EasyUI实现下拉框多选功能
2017/11/07 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
python文件操作之目录遍历实例分析
2015/05/20 Python
深入理解Python中装饰器的用法
2016/06/28 Python
python字典DICT类型合并详解
2017/08/17 Python
python实现猜单词小游戏
2020/05/22 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Python变量访问权限控制详解
2019/06/29 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
python3 kubernetes api的使用示例
2021/01/12 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
视图的作用
2014/12/19 面试题
新闻专业推荐信范文
2013/11/20 职场文书
青年教师个人总结
2015/02/11 职场文书
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js