Как написать расширение сафари, которое получает URL-адрес, по которому щелкают при открытии контекстного меню?

Я пытаюсь написать расширение для сафари, которое позволяет мне получить URL-адрес элемента, на который нажимают, когда я открываю контекстное меню (аналогично тому, как, когда вы открываете контекстное меню по ссылке и выбираете «открыть ссылку в новом окно" или что-то в этом роде.

Как только у меня будет URL-адрес в var, я сделаю с ним что-то еще. Как мне это сделать?

У меня есть следующий скрипт в моем глобальном html-файле.

    <script>
    safari.application.addEventListener("command",handleContextMenu,false);

    function handleContextMenu(event)
    {
        if(event.command === "my command")
        {
            var link = event.target;

            // try to get a link element in the parent chain 
            while(link != null && link.nodeType == Node.ELEMENT_NODE 
            && link.nodeName.toLowerCase() != "a") 
            {
                link = link.parentNode;
            }

            if(link) 
            {
                // do stuff
                                    //I open the window only to check that I am correctly getting the link
                var nwin = safari.application.openBrowserWindow();
                nwin.activeTab.url = link;
            }
        }
    }
    </script>

Вместо открытия страницы открывается окно с [object%20SafariExtensionContextMenuItem] в адресной строке.

Как мне исправить мой код, чтобы я указал правильный URL-адрес в адресной строке?


person Rahul Iyer    schedule 13.12.2013    source источник


Ответы (1)


event.target — это SafariExtensionContextMenuItem, а не тот элемент страницы, который вы ожидаете. Чтобы получить доступ к содержимому страницы, вам нужно будет использовать внедренный скрипт:

глобальный.js

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

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

введенный .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;
    }
    safari.self.tab.setContextMenuEventUserInfo(event, target.href);
}
person Matt Swain    schedule 13.12.2013
comment
Я делаю что-то, за исключением того, что у меня есть файл global.html (глобальная страница расширения). инъекции.js — это стартовый скрипт (внедренное содержимое расширения). Но в global.html event.userInfo = null, так что это не работает. - person Rahul Iyer; 14.12.2013
comment
Убедитесь, что уровень доступа установлен на «Все» в конструкторе расширений и «Включить защищенные страницы». - person Matt Swain; 14.12.2013
comment
Уровень доступа установлен на «Все», как и «Включить защищенные страницы». - person Rahul Iyer; 14.12.2013
comment
Я не знаю, почему это не работает для меня. Не могли бы вы дать ссылку на ваше полное расширение где-нибудь? - person Rahul Iyer; 26.12.2013
comment
Вот полное расширение, которое мне подходит. - person Matt Swain; 16.01.2014
comment
Я не знаю, почему это не работает, но файлы, на которые вы ссылаетесь, у меня тоже не работают. Если я нажму «Получить URL» в контекстном меню, ничего не произойдет. - person Rahul Iyer; 16.01.2014
comment
Есть ли что-то действительно очевидное, что я должен делать? Я никогда раньше не разрабатывал расширения. - person Rahul Iyer; 16.01.2014