判定对象是否为window的js代码
作者:bea
<script>alert(Object.prototype.toString.call(window))</script> [Ctrl+A 全选 注: 如需引入外部Js需刷新才能执行]结果是五花八门: [object Object]IE6 [object Object]IE8 [object Window]firefox3.6 [object Window]opera10 [object DOMWindow]safai4.04 [obje
<script>alert(Object.prototype.toString.call(window))</script>
[Ctrl+A 全选 注:
如需引入外部Js需刷新才能执行]
结果是五花八门:
[object Object]IE6
[object Object]IE8
[object Window]firefox3.6
[object Window]opera10
[object DOMWindow]safai4.04
[object global]chrome5.0.3.22
看一下赫赫有名怎样判定,就判定它是否存在一个叫setInterval的属性。啧啧,好像不太严谨,但也无法严谨下去了,因为在IE中无法判定泛化函数是否函数,Object.prototype.toString.call一律打出[object Object],也没有name属性。由于太容易仿造,弃之不用。
无奈之下,逐一检查其属性,看有什么特别属性。终于发现了,有一个同名的window属性,它是无限循环引用自身。这个在IE中还点问题。
<script>alert(window === window.window)</script>
[Ctrl+A 全选 注:
如需引入外部Js需刷新才能执行]
IE会弹出false,其他浏览器弹出true。不过下面这样所有浏览器都统一了:
<script>alert(window == window.window)</script>
[Ctrl+A 全选 注:
如需引入外部Js需刷新才能执行]
有没有严谨的判定呢?不要忘记window是无限循环引用自身,应该说是引用上一个自己。因此,我们可以:
<script>alert(window.window === window.window.window)</script>
[Ctrl+A 全选 注:
如需引入外部Js需刷新才能执行]
最后得出:
代码如下:
var isWindow = function(obj){
return obj.window === obj.window.window
}
======================华丽的分界线=====================
感谢 Ivony提供的灵感!
代码如下:
function isWindow( obj ){
if(typeof obj !== "object") return false;//必须是一个对象
var expando = "dom"+(new Date-0) //生成一个随机变量名
//全局解析代码,IE的eval只对原作用域有效
//详见http://www.javaeye.com/topic/519098
//加之eval与with是 html5严格模式下要禁止的东西,弃之不用!
var js = document.createElement("script");
var head = document.getElementsByTagName("head")[0];
head.insertBefore(js,head.firstChild);
js.text = expando + " = {};"
head.removeChild(js)
return window[expando] === obj[expando]
}
isWindow(window)
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- 判断控件是否已加载完成的代码
- json-lib出现There is a cycle in the hierarchy解决办法
- ext combox 下拉框不出现自动提示,自动选中的解决方法
- javascript Firefox与IE 替换节点的方法
- jQuery 性能优化手册 推荐
- jquery实现的超出屏幕时把固定层变为定位层的代码
- JSON 学习之JSON in JavaScript详细使用说明
- js下用层来实现select的title提示属性
- Jquery+CSS 创建流动导航菜单 Fluid Navigation
- jquery 锁定弹出层实现代码
- javascript document.compatMode兼容性
- js操作ajax返回的json的注意问题!
- javascript入门基础之私有变量
- 第一个JavaScript入门基础 document.write输出
- jQuery入门问答 整理的几个常见的初学者问题
- jQuery 操作下拉列表框实现代码
- JavaScript 编写匿名函数的几种方法
- jquery 得到当前页面高度和宽度的两个函数
- jquery validator 插件增加日期比较方法