2

나는 파이어 폭스 확장 일하고 그리고는 다음과 같이 사용합니다iframe에서 DOMContentLoaded 이벤트가 발생했는지 여부를 확인하는 방법은 무엇입니까?

function myExt() 
{ 
    this.handleEvent = function (event) 
    { 
     switch (event.type) 
     { 
      case "DOMContentLoaded": 
      { 
       alert('fired'); 
      } 
     } 
    } 

    window.addEventListener ("DOMContentLoaded", this, false); 
} 

내 문제는 "페이지 내용의 iframe을, 그래서 내가 무엇을 찾고 있어요 것은 사용하는 경우 경고가 여러 번 실행됩니다 있다는 것입니다 event "on this.handleEvent event.target이 위쪽 윈도우 또는 iframe 윈도우를 참조하는지 알아야합니다.

어떻게하면됩니까?

+2

와아아? DOMContentloaded는 부모 윈도우에서 iframe *에 대해 발생합니다. *? 이상한,이 들어 본 적이 –

+0

나는 그것이 더 많은 것 같아요, 그것은 iframe 자체에 대한 화재, 그리고 그것을 포함하는 문서까지 거품. – MatrixFrog

+0

그래, 그게 "이벤트 버블 링"과 관련이 있습니다 – Peter

답변

0

나는 아직도 몇 가지 테스트를하고있는 중이 야하지만,이 기능은 일을 것 같습니다 :

this.isTopLevel = function(event){ 
    var doc = event.target; 
    for(var i = 0; i < gBrowser.browsers.length; i++) { 
     if(gBrowser.browsers[i].contentDocument == doc) return true; 
    } 
    return false; 
}; 
+0

괜찮습니다. =) – Peter

0

예, iframe은 이상한 것이므로 DOMContentLoaded입니다. 내용을 마치 자신의 '창'에있는 것처럼 취급합니다. event.target 님의 부모를 얻으려고 했습니까? 아니면 ownerDocument입니까?

나는 <object> 태그에로드 된 SVG에 Firebug을 사용했으며, 나는 ownerDocument이 당신이 찾고있는 것을 얻는다고 믿습니다.

0

당신은 event.target.frameElement 검사 시도 할 수 있습니다. 정의되지 않은 경우 주 문서이지만 정의 된 경우 프레임입니다. 그래도 이것이 프레임만을위한 것인지 또는 iframe을위한 것인지 기억할 수 없습니다.

+0

멋진 해결책으로 생각합니다. 나는 event.target과 gBrowser.browsers 문서를 비교해 보았습니다. 그렇게 잘 작동하는 것 같습니다. – Peter

0

나는 iframe을 필터링이 조각을 사용하고 있습니다 :

var browser = gBrowser.getBrowserForDocument(event.target); 
var pageIsFrame = (event.target instanceof Ci.nsIDOMHTMLDocument && 
    event.target != browser.contentDocument); 
if (pageIsFrame) { 
    // Not interested in frames. 
    return; 
} 

당신은 그것을위한 크롬 권한이 필요합니다.

if (window.frameElement) { 
    // This is an iframe. 
    //... 
} 

(참조 MDC의 문서 here 또는 here) : 새로운 추가 기능, I이 사용하고 (당신은 크롬 권한이없는) SDK 내용 스크립트에서

.

관련 문제