1

사파리 확장 기능을 만들고 있습니다. 사파리의 링크를 마우스 오른쪽 버튼으로 클릭하면 컨텍스트 메뉴가 표시됩니다. 사용자가 "URL 가져 오기"를 클릭하면 클릭 한 URL이 새 창에서 열립니다. 나는 URL을 얻는 방법을 알아낼 수 없다! 대신 항상 "찾을 수 없음"이 열립니다.이 코드가 Safari에서 URL을 가져 오는 이유는 무엇입니까?

injected.js :

document.addEventListener('contextmenu', handleContextMenu, false); 

function handleContextMenu(event) 
{ 
    var target = event.target; 
    while(target != null && target.nodeType == Node.ELEMENT_NODE && target.nodeName.toLowerCase() != "a") 
    { 
     target = target.parentNode; 
    } 

    if(target.href) 
    { 
     safari.self.tab.setContextMenuEventUserInfo(event, target.href); 
    } 
    else 
    { 
     var foo = "href not found"; 
     safari.self.tab.setContextMenuEventUserInfo(event, foo); 
    } 
} 

Global.html :

<!DOCTYPE HTML> 
<script> 
var lastUrl; 

safari.application.addEventListener("contextmenu",handleContextMenu,false); 
safari.application.addEventListener('command', handleCommand, false); 

function handleContextMenu(event) 
{ 
    var query = event.userInfo; 
    lastUrl = query; 

    event.contextMenu.appendContextMenuItem("getUrl", "Get URL"); 
} 

function handleCommand(event) 
{ 
    if(event.command === 'getUrl') 
    { 
     if (lastUrl) 
     { 
      safari.application.openBrowserWindow().activeTab.url = lastUrl; 
     } 
     else 
     { 
      safari.application.openBrowserWindow().activeTab.url = "not found"; 
     } 
    } 
} 

</script> 

어떻게 URL을받을 수 있나요? 항상 "찾을 수 없음"이 대신 열립니다.

답변

0

handleCommand 기능에 var last url = event.userInfo이 없으십니까? 그 시점에서 userInfo를 정의해야하며 contextmenu 이벤트에 값을 설정하는 것이 더 예측 가능해야합니다.

+0

아무런 차이가 없습니다. "찾을 수 없음"은 여전히 ​​열리는 URL입니다. 사파리 확장 기능을 개발 한 경험이 없으므로 이제 막 실수를 저지르고 있습니다. –

+0

코드의이 부분은 훨씬 더 큰 슈퍼 유용한 프로젝트의 중요한 부분입니다. 당신이 이것을 파악할 수 있다면, 당신은 사람들이 수많은 시간을 절약 할 수있는 문제를 해결하도록 도울 수 있습니다! XD –

0

왜 코드가 작동하지 않는지 이해할 수 없지만 어쨌든 변경할 수있는 몇 가지 사항이 있습니다.

먼저 주입 된 컨텐츠 스크립트에서 target.href가 없으면 safari.self.tab.setContextMenuEventUserInfo를 호출하지 마십시오. 다음과 같이

둘째, 글로벌 스크립트에서, 당신의 handleContextMenu 기능을 변경 :

function handleContextMenu(event) { 
    if (event.userInfo) { 
     event.contextMenu.appendContextMenuItem("getUrl", "Get URL"); 
    } 
} 

그 방법을, 사용자가 링크를 마우스 오른쪽 단추로 클릭하지 않은 경우 상황에 맞는 메뉴 항목이 삽입되지 않습니다.

셋째, Matt이 말한 것처럼 다른 용도로 사용되지 않는 한 lastUrl 전역 변수가 필요하지 않습니다. handleCommand에서 직접 event.userInfo를 참조 할 수 있습니다. 컨텍스트 메뉴는 handleContextMenu에 의해서만 삽입되므로 비어 있는지 여부를 확인할 필요가 없습니다.

function handleCommand(event) { 
    if (event.command === 'getUrl') { 
     safari.application.openBrowserWindow().activeTab.url = event.userInfo; 
    } 
} 

희망이 도움이됩니다.

+0

나는 당신이 말한 것을 시도했고, 이제 "URL 가져 오기"는 컨텍스트 메뉴에 나타나지 않습니다. 본문의 앵커 만 포함 된 간단한 html 파일로 테스트했습니다. –

+0

이 경우 스크립트 중 하나에 실수가 있어야합니다. 다음은 코드가 작동한다는 것을 보여주는 개념 증명 확장입니다. https://dl.dropboxusercontent.com/u/23990/Canisbos/Nothing.safariextz - URL 가져 오기를 선택할 때 링크의 URL 만 표시합니다. 컨텍스트 메뉴에서 터미널 명령'xar -xf Nothing.safariextz'를 사용하여 소스 코드를 추출 할 수 있습니다. – canisbos