论坛首页 Web前端技术论坛

你能写出来吗,严格判断对象是否是WINDOW,JQ的判断暴弱了

浏览 14849 次
精华帖 (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吗? 我已经想到了……

如果你也想到不妨贴出来看看

一会给答案

   发表时间:2011-10-03  
function(a){return this===a}
0 请登录后投票
   发表时间:2011-10-03   最后修改:2011-10-03
廢廢廢 写道
function(a){return this===a}



。。如果 要判断 iframe 里的一个变量呢  2个 iframe 里的 window不想等

这种写法 被 call 或者 apply 这个 this 就不是 window 对象了
0 请登录后投票
   发表时间:2011-10-03  
zeroneta 写道
廢廢廢 写道
function(a){return this===a}



。。如果 要判断 iframe 里的一个变量呢  2个 iframe 里的 window不想等

这种写法 被 call 或者 apply 这个 this 就不是 window 对象了


這個還真不知道...開估吧

不過好好的function幹嗎要call...我還不如Object = null
0 请登录后投票
   发表时间: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 只能  用 == 来判断
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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; },
0 请登录后投票
   发表时间: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

0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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
      }
 
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics