判断对象是否Window的实现代码
2023-06-13 09:14:32 时间
直入正题吧.
先看jQuery的$.isWindow函数:
复制代码代码如下:
先看jQuery的$.isWindow函数:
functionisWin(obj){
returnobj&&typeofobj==="object"&&"setInterval"inobj;
}
这个函数本身是很科学的,它主要是通过检查目标对象是否拥有setInterval属性来判断.
然而问题在于,在缺少约定的情况下,它也许并不太可靠,比如:
varo={xx:"oo"};
o["setInterval"]=true;
console.log(isWin(o));//true
上例通过给对象字面量添加setInterval属性,欺诈成功.
而事实上,任何一个非null的Object都可以如此伪装,比如数组:
vararr=[1,2,3];
arr["setInterval"]=true;
console.log(isWin(arr));//true
相比上面的属性属性检查,一个更为妥善的方法是使用对象的toString函数来判断:
functionisWin(obj){
returnObject.prototype.toString.call(obj)==="[objectWindow]"
}
以上函数在标准浏览器中妥妥的,但同时又带来了新的兼容问题:
//ie6-8中的结果
Object.prototype.toString.call(window)==="[objectWindow]";//false
Object.prototype.toString.call(window)==="[objectObject]";//true
//chrome
Object.prototype.toString.call(window)==="[objectglobal]";//true
//safari
Object.prototype.toString.call(window)==="[objectDOMWindow]";//true
果然,主要的问题又是来自万恶的ie们.所幸天无绝人之路,这又让我想起了ie中的一个灵异事件:
//下面两行,信不信?
console.log(window==document);//true
console.log(document==window);//false
写到这里,我想最终的解决方案已经出来了:
functionisWin(obj){
return/Window|global/.test({}.toString.call(obj))||obj==obj.document&&obj.document!=obj;
}
相关文章
- Python表白代码:太秀了,用过的人都找到了对象…【满屏玫瑰盛开】
- el表达式的内置对象_IF嵌套函数
- java中list对象和json字符串互转
- python json转对象
- 深入浅出Oracle的对象类型(oracle的对象类型)
- 最简短的拖动对象代码实例演示
- javascript对象比较实现代码
- 一个cssQuery对象javascript脚本实现代码
- jQuery对象和DOM对象的相互转化实现代码
- 返回对象在当前级别中是第几个元素的实现代码
- javascript中的对象创建实例附注释
- jquery1.5.1中根据元素ID获取元素对象的代码
- c#和Javascript操作同一json对象的实现代码
- jquery创建并行对象或者合并对象的实现代码
- 对象失去焦点时自己动提交数据的实现代码
- 一行代码实现纯数据json对象的深度克隆实现思路
- jQuery对象和Javascript对象之间转换的实例代码
- JS动态添加与删除select中的Option对象(示例代码)
- JS对象转换为Jquery对象实现代码
- javascript客户端遍历控件与获取父容器对象示例代码
- Jquery获取元素的父容器对象示例代码
- JavaScript获取当前页面上的指定对象示例代码
- jqueryform表单序列化为对象的示例代码
- Jquery操作js数组及对象示例代码