1

我正在創建一個safari擴展。當用戶右鍵單擊safari中的鏈接時,應該彈出上下文菜單。當用戶點擊「獲取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> 

如何獲得的網址是什麼?它總是打開「未找到」。

回答

0

爲什麼不在handleCommand函數中只有var last url = event.userInfo函數? userInfo應該在那個時候定義,並且試圖設置contextmenu事件的值應該是更可預測的。

+0

沒有任何區別 - 「未找到」仍然是打開的網址。我沒有任何開發safari擴展的經驗,所以我只是錯過了一些。 –

+0

大家知道,這段代碼是一個更大的超級有用項目的重要組成部分。如果你能弄明白這一點,你可以幫助我解決一個可以爲無數人節省時間的問題! XD –

0

我不明白爲什麼你的代碼不工作,但有幾件事你可能想要改變。

首先,在注入的內容腳本中,如果沒有target.href,請不要打擾調用safari.self.tab.setContextMenuEventUserInfo。

其次,在全局腳本,如下更改handleContextMenu功能:

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

這樣一來,如果用戶沒有右鍵點擊一個鏈接,上下文菜單項目不會被插入。第三,正如馬特所說,你不需要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

相關問題