Определить ссылку на событие contextmenu в расширении сафари - PullRequest
2 голосов
/ 20 июня 2010

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

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

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

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

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

Ciao, Свен

Ответы [ 2 ]

3 голосов
/ 20 июня 2010

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

Вы можете использовать DOMSelection 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 голосов
/ 31 мая 2013

Ответ 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
}
...