精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-03
最后修改:2011-10-03
//JQ判断是否WINDOW对象的 // A crude way of determining if an object is a window isWindow: function( obj ) { return obj && typeof obj === "object" && "setInterval" in obj; }, 上面代码是提取JQ的判断方式,在JQ官网上看到有老外留言 var a={setInterval:2}; window===a;//false but $.isWindow(a); //true Bruce King it's a crude method man~ 他是一个粗略的方法〜哦~~ Object.prototype.toString.call(window) 是不一样的在不同浏览器上 想知道怎么判断WINDOW吗? 我已经想到了…… 如果你也想到不妨贴出来看看 一会给答案 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-03
function(a){return this===a}
|
|
返回顶楼 | |
发表时间:2011-10-03
最后修改:2011-10-03
廢廢廢 写道 function(a){return this===a}
。。如果 要判断 iframe 里的一个变量呢 2个 iframe 里的 window不想等 这种写法 被 call 或者 apply 这个 this 就不是 window 对象了 |
|
返回顶楼 | |
发表时间:2011-10-03
zeroneta 写道 廢廢廢 写道 function(a){return this===a}
。。如果 要判断 iframe 里的一个变量呢 2个 iframe 里的 window不想等 这种写法 被 call 或者 apply 这个 this 就不是 window 对象了 這個還真不知道...開估吧 不過好好的function幹嗎要call...我還不如Object = null |
|
返回顶楼 | |
发表时间:2011-10-03
最后修改:2011-10-03
了本来是一行的 可是 还是存在漏洞,只能写多点了。。(用到了 window 删除不掉的特性)
var iswindow = function( a ) { if ( a && a == a.window ) { try { delete a.window; if ( a.window ) { return true; }; a.window = a; return false; } catch ( e ) { return true; }; }; return false; }; iframe的window对象也可以判断 由于 IE 的 window === window.window 返回false 只能 用 == 来判断 |
|
返回顶楼 | |
发表时间:2011-10-03
最后修改:2011-10-03
在有了ES5後,似乎比較困難了
var iswindow = function( a ) { if ( a && a == a.window ) { try { delete a.window; if ( a.window ) { return true; }; a.window = a; return false; } catch ( e ) { return true; }; }; return false; }; var a = {}; Object.defineProperty(a, 'window', {value: a, configurable: false}); alert(iswindow(a)); // true |
|
返回顶楼 | |
发表时间:2011-10-03
最后修改:2011-10-04
试了一下 Object.getOwnPropertyDescriptor
onfigurable:false修改跟删除都无效了。。。 我想 到 那个时候 WINDOW 也跟容易判断了把 只前想到的一行代码的 是这样的 $.window = window, $.is_window = function( a ){ with ( a ) return a == window && $.window.top === window.top; }, |
|
返回顶楼 | |
发表时间:2011-10-04
这课题我一年前已研究过了 var dom = {}; dom.isWindow = function(obj){ if(!obj || !obj.window || !obj.document ) return false; var expando = "dom"+(new Date-0) //生成一个随机变量名 var doc = obj.document; //全局解析代码,IE的eval只对原作用域有效 //详见http://www.javaeye.com/topic/519098 //加之eval与with是 html5严格模式下要禁止的东西,弃之不用! try{ var js = doc.createElement("script"); var head = doc.getElementsByTagName("head")[0]; head.insertBefore(js,head.firstChild); js.text = expando + " = {};" head.removeChild(js); var ret = (doc.parentWindow || doc.defaultView)[expando] === obj[expando]; obj[expando] = void 0; }catch(e){ return false; } return ret; } var test1 = {}; test1.window = test1; test1.document = document; alert(dom.isWindow(test1)) var test2 = {}; test2.window = window; test2.document = document; alert(dom.isWindow(test2)) alert(dom.isWindow(window)) http://www.cnblogs.com/rubylouvre/archive/2010/02/20/1669886.html |
|
返回顶楼 | |
发表时间:2011-10-04
var dom = {}; dom.isWindow = function(obj){ if(!obj || !obj.window || !obj.document ) return false; var expando = "dom"+(new Date-0) //生成一个随机变量名 var doc = obj.document; //全局解析代码,IE的eval只对原作用域有效 //详见http://www.javaeye.com/topic/519098 //加之eval与with是 html5严格模式下要禁止的东西,弃之不用! try{ var js = doc.createElement("script"); var head = doc.getElementsByTagName("head")[0]; head.insertBefore(js,head.firstChild); js.text = expando + " = {};" head.removeChild(js); var ret = (doc.parentWindow || doc.defaultView)[expando] === obj[expando]; obj[expando] = void 0; }catch(e){ return false; } return ret; } var wg = { document : {} }, wgdoc = wg.document; wg.window = wg; wgdoc.createElement = function(){return wg; }; wgdoc.getElementsByTagName = function(){ return [wg]; }; wgdoc.parentWindow = wg; wg.insertBefore = function(){}; wg.firstChild = wg.firstChild; wg.removeChild = function(){}; alert(dom.isWindow(wg)) //true |
|
返回顶楼 | |
发表时间:2011-10-04
最后修改:2011-10-04
搞了一个更厉害的,利用IE678 window == document为true,document == window竟然为false的新奇特性 window.onload = function(){ var dom = {}, windowString = { "[object Window]":1, "[object DOMWindow]":1, "[object global]":1 }; // by 司徒正美 http://www.cnblogs.com/rubylouvre/ dom.isWindow = function(obj){ if( !obj || typeof obj !== "object")//必须是一个对象 return false; if(windowString[windowString.toString.call(obj)]) return true; return obj == obj.document && obj.document != obj } //测试代码 var test1 = {}; test1.window = test1; test1.document = document; alert(dom.isWindow(test1))//false var test2 = {}; test2.window = window; test2.document = document; alert(dom.isWindow(test2))//false alert(dom.isWindow(window))//true var iframe = document.createElement("iframe"); document.body.appendChild(iframe); var iwin = iframe.contentWindow || iframe.contentDocument.parentWindow; alert(dom.isWindow(iwin));//true document.body.removeChild(iframe); var wg = { document : {} }, wgdoc = wg.document; wg.window = wg; wgdoc.createElement = function(){return wg; }; wgdoc.getElementsByTagName = function(){ return [wg]; }; wgdoc.parentWindow = wg; wg.insertBefore = function(){}; wg.firstChild = wg.firstChild; wg.removeChild = function(){}; alert(dom.isWindow(wg));//false } |
|
返回顶楼 | |