2010-06-20 134 views
2

我試圖構建一個Safari瀏覽器擴展(主要用於學習目的),當用戶右鍵單擊鏈接時創建一個美味的書籤。我看過WWDC創建一個Safari擴展視頻,一切工作正常。確定Safari瀏覽器擴展中的contextmenu事件鏈接

除了我沒有線索如何找出用戶是否點擊了一個鏈接(或只是一些文本),如果是這樣,得到它的網址和標題。我到目前爲止是這樣的:

document.addEventListener("contextmenu", handleContextMenu, false); 
function handleContextMenu(event){ 
    safari.self.tab.setContextMenuEventUserInfo(event,getSelection().toString()); 
} 

但是,這顯然只給了我一串選擇。現在,根據Safari參考庫getSelection()返回DOMSelection object。但即使在那裏,我也無法找到一種方法來處理所選的鏈接。

正如你可能已經注意到,我是相當新的這整個JavaScript和DOM的東西,所以請原諒,如果這是一個明顯的問題:)

的Ciao, 斯文

+0

小跟進: 因爲我不能提取任何更多的上下文信息比選擇我試圖使用jQuery找到任何鏈接匹配所選文本,如下所示: '$(「a:contains('」+ getSelection()+「')」);' 但這是非常模糊,因爲當點擊單詞'a'時,存在非常高的可能性鏈接文本可能包含該單詞。 – sschober 2010-06-20 14:11:06

回答

3

在一個簡單的右點擊,將選中的設置爲裏面的錨鏈接。這意味着您將選擇其文本節點,但鏈接節點本身不會。因此,嘗試在選擇內部找到鏈接是沒有用的。

您可以使用DOMSelectionfocusNode來獲取最後選定的文本節點並檢查其祖先,直到您達到一個<a>元素。這應該做你想要的。

var link = null; 
var currentElement = event.getSelection().focusNode; 
while (currentElement != null) 
{ 
    if (currentElement.nodeType == Node.ELEMENT_NODE && currentElement.nodeName.toLowerCase() == 'a') 
    { 
     link = currentElement; 
     break; 
    } 
    currentElement = currentElement.parentNode; 
} 
// link is now an <a> element if the user selected a link's contents 
0

zneak的回答並沒有爲我工作,所以我event.target,而不是選擇工作:

var link = evt.target; 
// get parent node in case of text nodes (old safari versions) 
if(link.nodeType == Node.TEXT_NODE) { 
    link = link.parentNode; 
} 
    // if for some reason, it's not an element node, abort 
if(link.nodeType != Node.ELEMENT_NODE) { 
    return; 
} 

// try to get a link element in the parent chain 
while(link != null && 
     currentElement.nodeType == Node.ELEMENT_NODE && 
     link.nodeName.toLowerCase() != "a") { 
    link = link.parentNode; 
} 
if(link) { 
    // do stuff 
} 
相關問題