2013-09-16 2 views
3

휴가 중이며 사파리 확장 개발에 대해 거의 알지 못하는 동료를 위해 디버깅 중입니다.SafariNavigateEvent에서 URL 및 페이지 제목 데이터 가져 오기

'open', 'beforeNavigate', 'navigate'및 'activate'이벤트를 수신하는 Safari 확장 프로그램이 있습니다. 이러한 이벤트가 발생하면 activeTab의 URL 및 페이지 제목을 추적하려고합니다.

그러나 어떤 경우에는 (예 : 새 탭이 열리기 전에 beforeNavigate 및 탐색) 페이지 제목이 처리기에 전달 된 safari.application.activeBrowserWindow.activeTab 개체 또는 event 개체에 항상 정의되어있는 것은 아닙니다.

이벤트 개체를 콘솔에 출력하면 올바르게 채워지지만 이벤트 처리기에서 event['target']['title']에 직접 액세스하면 Untitled이 다시 나타납니다. 데이터를 채우는 데 지연이 있다고 생각하지만 딜레이를 처리하는 방법을 알지 못하거나 문서를 찾을 수 없습니까?

참고 저는 info.plist에서 웹 사이트 액세스가 ALL로 설정되어 있습니다.

누구에게이 문제가 발생 했습니까? 그것을 고치는 방법에 대한 생각?

safari.application.addEventListener("beforeNavigate", function (event) { 
    console.log('//-- Event Data -------------------------------------'); 
    console.log(event); 
    console.log(event['target']); 
    console.log('Url: ' + event['target']['url']); 
    console.log('Title: ' + event['target']['title']); 

    console.log('//-- Tab Data -------------------------------------'); 
    console.log('Url: ' + safari.application.activeBrowserWindow.activeTab.url); 
    console.log('Title: ' + safari.application.activeBrowserWindow.activeTab.title); 
}, true); 

그리고 콘솔에 출력 :

그는 코드의 단편이다

//-- Event Data ------------------------------------- 
SafariBeforeNavigateEvent 
    BUBBLING_PHASE: 3 
    CAPTURING_PHASE: 1 
    TARGETING_PHASE: 2 
    bubbles: true 
    cancelable: true 
    currentTarget: null 
    defaultPrevented: false 
    eventPhase: 0 
    target: SafariBrowserTab 
     browserWindow: SafariBrowserWindow 
     page: SafariWebPageProxy 
     reader: SafariReader 
     title: "Google" 
     url: "https://www.google.ca/" 
     __proto__: CallbackObject 
    timeStamp: 1379353767889 
    type: "beforeNavigate" 
    url: "http://www.google.ca/" 
    __proto__: CallbackObject 

SafariBrowserTab 
    browserWindow: SafariBrowserWindow 
    page: SafariWebPageProxy 
    reader: SafariReader 
    title: "Google" 
    url: "https://www.google.ca/" 
    __proto__: CallbackObject 
Url: 
Title: Untitled 
//-- Tab Data ------------------------------------- 
Url: 
Title: Untitled 

답변

0

나는 문제가 제목 실제로 페이지의 HTML 내에서 정의 있다는 것을 생각합니다. 이것은 beforeNavigate 이벤트이므로 페이지가 아직로드되지 않았으므로 일반적으로 제목은 아직 사용할 수 없으며 URL 만 사용할 수 있습니다.

페이지가 실제로로드되기 전에 특별히 수행 할 필요가없는 한 한 가지 해결책은 대신 navigate 이벤트를 사용하는 것일 수 있습니다. 그러나 실제로 페이지가로드 될 것이라는 것을 확신하지는 못하지만, 페이지가로드 될 확률이 높습니다.

여전히 문제가 있다면 더 복잡한 대안은 페이지가로드 될 때마다 글로벌 페이지로 메시지를 보내는 injected script을 사용하는 것입니다. 삽입 된 스크립트에서 DOM 준비 이벤트를 사용한 다음 페이지 제목이 포함 된 전체 페이지에 메시지를 발송하십시오. 포함 된 iframe이 메시지를 보내지 못하게하려면 if (window == window.top)을 사용하십시오.

+0

답변 해 주셔서 감사합니다. 올바른 것으로 표시했습니다. 제 경우에는 가장 좋은 해결책은 삽입 된 스크립트가 배경 스크립트에 페이지 제목과 URL을 보내도록하는 것입니다. 불행히도 Safari에서 해고 된 이벤트는이 데이터를 추적하는 데 꽤 쓸모없는 것으로 판명되었습니다. 탐색 이벤트조차도 정의되지 않은 또는 제목없는 페이지 제목을보고합니다. 궁극적으로 IMO는이 작업을 수행하는 방법이어야합니다. 오 잘. – adampetrie