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

 更新时间:2012年01月10日 01:20:16   作者:  
判断对象是否Window的实现代码,需要的朋友可以参考下。
直入正题吧.
先看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;
}

相关文章

  • jQuery实现每日秒杀商品倒计时功能

    jQuery实现每日秒杀商品倒计时功能

    这篇文章主要介绍了 jQuery实现每日秒杀商品倒计时功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • jquery队列queue与原生模仿其实现方法分享

    jquery队列queue与原生模仿其实现方法分享

    jquery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用。特别animate动画,ajax,以及timeout等需要一定时间的函数
    2014-03-03
  • 轻松学习jQuery插件EasyUI EasyUI创建树形菜单

    轻松学习jQuery插件EasyUI EasyUI创建树形菜单

    这篇文章主要帮助大家轻松学习jQuery插件EasyUI,EasyUI创建树形菜单,内容很丰富,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • jQuery dateRangePicker插件使用方法详解

    jQuery dateRangePicker插件使用方法详解

    这篇文章主要为大家详细介绍了jQuery dateRangePicker插件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • jQuery实现简单的文件上传进度条效果

    jQuery实现简单的文件上传进度条效果

    这篇文章主要为大家详细介绍了jQuery实现简单的文件上传进度条效果,上传文件时显示上传进度条,以百分比的形式显示上传进度,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • jquery trigger函数执行两次的解决方法

    jquery trigger函数执行两次的解决方法

    这篇文章主要介绍了jquery trigger函数执行两次的解决方法,详细分析了trigger函数执行两次的原因与响应的解决技巧,非常具有实用价值,需要的朋友可以参考下
    2016-02-02
  • jQuery中focus事件用法实例

    jQuery中focus事件用法实例

    这篇文章主要介绍了jQuery中focus事件用法,以实例形式分析了获取焦点时focus事件的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • 浅析onsubmit校验表单时利用ajax的return false无效问题

    浅析onsubmit校验表单时利用ajax的return false无效问题

    前几天,在校验一个表单数据用到ajax时,遇到 return false 无效问题,以下就是对这个问题进行了分析介绍,需要的朋友可以参考下
    2013-07-07
  • JQuery通过键盘控制键盘按下与松开触发事件

    JQuery通过键盘控制键盘按下与松开触发事件

    这篇文章主要介绍了JQuery通过键盘控制键盘按下与松开触发事件,文章通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • jQuery实现放大镜案例

    jQuery实现放大镜案例

    这篇文章主要为大家详细介绍了jQuery实现放大镜案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10

最新评论