객체가 window인지 여부를 결정합니다.

3627 단어 window
이것은 매우 재미있는 제목이다.우선 Object에서prototype.toString은 그것을 해결할 수 있는지 없는지를 보기 위해 손을 댔다.
alert(Object.prototype.toString.call(window))
실행 코드
결과는 다양했다.
  • [object Object]IE6
  • [object Object]IE8
  • [object Window]IE9
  • [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 속성도 없습니다.너무 쉽게 모조하기 때문에 버려도 소용없다.
    어쩔 수 없이 하나하나 그 속성을 검사하여 어떤 특별한 속성이 있는지 보자.마침내 같은 이름의 윈도우 속성이 발견되었는데, 이것은 무한 순환으로 자신을 인용하는 것이다.이것은 IE에서 문제가 좀 있습니다.
    alert(window === window.window)
    실행 코드
    IE 는 false 를 팝업하고 다른 브라우저는 true 를 팝업합니다.그러나 다음과 같이 모든 브라우저가 통합됩니다.
    alert(window == window.window)
    실행 코드
    엄격한 판정이 있나요?윈도우는 무한 순환으로 자신을 인용한다는 것을 잊지 마라. 이전 자신을 인용한다고 해야 한다.따라서 다음과 같은 이점을 얻을 수 있습니다.
    alert(window.window === window.window.window)
    실행 코드
    최종 결과:
    
    
    var isWindow = function(obj){
    
       return obj.window === obj.window.window
    
    }
    
    

    ====================화려한 분계선 =============================
    아이보니의 영감 감사합니다!
    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))
    실행 코드
    2011.10.4 업데이트
    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
    실행 코드

    좋은 웹페이지 즐겨찾기