2010-06-20 1 views
2

Я пытаюсь создать расширение сафари (в основном для учебных целей), которое создает вкусную закладку, когда пользователь щелкает правой кнопкой мыши по ссылке. Я смотрел WWDC Создание видеоролика расширения Safari, и все работает нормально.Определить ссылку на событие contextmenu в расширении сафари

За исключением того, что у меня нет подсказки, как узнать, нажал ли пользователь ссылку (или просто какой-то текст), и если да, получите ее url и title. Что я получил до сих пор:

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

Но это, очевидно, дает мне только строку выбора. Теперь, согласно справочной библиотеке Safari, getSelection() возвращает DOMSelection object. Но даже там я не могу определить метод, который дает мне ссылку на выбранную ссылку.

Как вы могли заметить, я достаточно новое для всей этой яваскрипта и DOM вещи, поэтому, пожалуйста, простите, если это очевидный вопрос :)

Ciao, Sven

+0

Немного следить: Как я не в состоянии извлечь больше контекстную информацию чем выбор, я попытался использовать jQuery, чтобы найти любую ссылку, соответствующую выбранному тексту, например: '$:" содержит ('' + getSelection() + "')"); ' Но это очень нечеткое, так как при нажатии на слово «a» существует очень высокий probab Возможно, текст ссылки может содержать это слово. – sschober

ответ

3

На простом право- нажмите, выбор будет установлен внутри анкерное звено. Это означает, что у вас будет выбран его текстовый узел, но сам узел ссылки не будет. Поэтому бесполезно пытаться найти ссылку внутри выделения.

Вы можете использовать DOMSelection «s focusNode, чтобы получить последний выбранный текстовый узел и проверить его предков до тех пор, пока ветер до <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 
}