2010-08-12 3 views
8

다음 코드가 :.onload는 파이어 폭스 확장 기능에서 여러 번 호출 나는 파이어 폭스 확장 기능을 개발하고있어

function initialize() { 
    // For accessing browser window from sidebar code. 
    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIWebNavigation) 
       .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIDOMWindow); 
    var gBrowser = mainWindow.gBrowser; 
    gBrowser.onload = function() { 
     alert('loaded'); 
    }; 
} 
  1. 내가 확장 (사이드 바)를 열고 내에서 새 탭을 열 진행 Firefox 창에는 세 개의 경고 상자가 있습니다.
  2. 페이지를 새로 고치면 두 개의 경고 상자이 있습니다.
  3. 페이지로드가 끝나면 하나의 경고 상자 만 있습니다.
  4. 탭을 변경하면 경고가 발생합니다.

광산을 실행하기 전에 다른 모든 자바 스크립트가 페이지로드를 완료 할 때까지 기다려야하므로 DOMContentLoaded 또는 readystatechange 대신 .onload를 사용합니다.

여러 이벤트가 트리거되는 이유 및 이벤트가 트리거되지 않아야하는 이유에 대한 아이디어가 있습니까?

가 가
function initialize() { 
    // For accessing browser window from sidebar code. 
    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIWebNavigation) 
       .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIDOMWindow); 
    var gBrowser = mainWindow.gBrowser; 
    if (gBrowser.addEventListener) { 
     gBrowser.addEventListener("load",pageLoaded,true); 
    }  
} 

function pageLoaded(aEvent) { 
    if ((aEvent.originalTarget.nodeName == '#document') && 
     (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec)) 
    { 
     alert('loaded'); 
    } 
} 
페이지가로드 aEvent.originalTarget.nodeName == '#document가'확인
  1. 되어 것을 : MatrixFrog의 제안에서 다음

    솔루션

    , 나는 여기에 온 솔루션입니다 파비콘이 아닙니다.

  2. (aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec))은 이벤트를 발생시킨 요소는 하나의 IFRAME 탭의 페이지는 아닌 것을 확인
  3. gBrowser.onload 것 xul-image에만 적용되고 #document에는 적용되지 않으므로 gBrowser.addEventListener ("load", pageLoaded, true)로 대체되었습니다. !
  4. 확실 gBrowser.currentURI.spec을, 새로운 빈 탭에 대한 이벤트를 발사 피하려면 = "에 대해 : 빈"
+1

하나의 탭 (집중된 탭)에 대해서만 페이지가 다른 Firefox 탭에로드 될 때 제안 된 솔루션은 처리 할 수 ​​없습니다. aEvent.originalTarget.defaultView.location.href == gBrowser.currentURI.spec은 true로 평가됩니다. –

답변

6

https://developer.mozilla.org/en/Code_snippets/On_page_load

현재 파이어 폭스에서 트렁크 유흥은 문서뿐만 아니라 xul:image (tabbrowser의 favicons)에 대해서도 onPageLoad 함수를 실행합니다. 당신은 단지 문서를 처리하는 경우에도 외부의 '로드'이벤트가 발사보고있는 경우가로드되고 있는지 알아 내기 위해 이벤트 대상을 검사 할 수 있습니다, aEvent.originalTarget.nodeName == "#document"

을 확인하고 사용 유사한 특정 논리를 사용하여 특정 경우에 내선 번호 논리를 호출하지 않아야합니다.

+0

It 훨씬 적게 발생하지만 일부 페이지에서는 여러 번 작동합니다. 나는 이것이 onload 이벤트를 발생시키는 iframe 때문인 것으로 추측하고 있습니다. 문서의로드에서 iframe로드를 구별하는 방법과 페이지 및 모든 iframe이로드되었을 때 캡처하는 방법에 대해 알아보십시오. – Ivan

+2

@ 아이언, 예, 아마 iframe 일 것입니다. 그것이 iframe이 아니면'event.originalTarget.defaultView.frameElement'는 null/undefined가 될 것입니다. – MatrixFrog

+1

@MatrixFrog 다른 방법으로 확인할 수 있습니까? –

관련 문제