Создайте всплывающее окно в расширении сафари после нажатия контекстного меню

Привет, лучший коллега,

В настоящее время я создаю закладку для сафари и столкнулся со следующей проблемой. Я создал элемент контекстного меню и хочу вести себя следующим образом:

Если пользователь щелкнет правой кнопкой мыши ссылку на странице и щелкнет этот контекстный элемент, он должен получить атрибут href этой ссылки и открыть всплывающее окно внутри iframe.

Как я могу решить эту проблему?

Прямо сейчас я уже получил атрибут href, но как я могу открыть всплывающее окно?

мой эндскрипт: default.js

document.addEventListener("contextmenu", handleContextMenu, false);

function handleContextMenu(event){  
    if(event.target.nodeName === "A"){
        var url = event.target.href;
        safari.self.tab.setContextMenuEventUserInfo(event, url);
    }
}

мой глобальный.html

safari.application.addEventListener("command", performCommand, false);

function performCommand(event) {
if (event.command !== "DoAddSymbaloo")
        return;

        var u = event.userInfo;

}

Как я могу это исправить? Tnx заранее.


person Navid    schedule 15.10.2013    source источник
comment
Вы не сможете открыть ссылку во всплывающем окне, даже в iframe внутри него. Safari заблокирует его в соответствии со своей политикой безопасности.   -  person chulster    schedule 16.10.2013
comment
@canisbos это неправильно, это работает на моем, я должен проверить его в Safari 5.0, но в 6 он работает. Или Apple должна заблокировать его, когда я его опубликую.   -  person Navid    schedule 16.10.2013
comment
Вы правы в том, что можно загрузить веб-страницу в iframe внутри всплывающего окна. Я не думаю, что раньше это было возможно.   -  person chulster    schedule 16.10.2013


Ответы (1)


Вы не сможете установить URL-адрес всплывающего окна на веб-URL (это должен быть URL-адрес safari-extension), но вы можете иметь всплывающее окно, которое не содержит ничего, кроме iframe, и указать всплывающее окно для загрузки URL-адреса в iframe.

Самый простой способ сделать это — иметь прослушиватель «командных» событий в самом всплывающем окне (которое вы можете создать с помощью Extension Builder или API расширения; см. документы, если вам нужно освежить в памяти ).

safari.application.addEventListener("command", function (evt) {
    if (evt.command == 'DoAddSymbaloo') {
        document.querySelector('iframe').src = evt.userInfo;
        // now let's show the popover
    }
}, false);

Теперь вам нужно показать всплывающее окно. Чтобы всплывающее окно вообще стало видимым, его необходимо прикрепить к элементу панели инструментов. Я предполагаю, что вы уже сделали это, используя либо Extension Builder, либо API. Программно показать всплывающее окно можно с помощью метода showPopover на его элементе панели инструментов. Итак, сначала вам нужно найти элемент панели инструментов, к которому вы прикрепили всплывающее окно. Из сценария всплывающего окна:

var myToolbarItem = safari.extension.toolbarItems.filter(function (ti) {
    return ti.popover == safari.self;
})[0];

Это просто говорит: «Найдите элемент панели инструментов, всплывающее окно которого совпадает со мной, и назначьте этот элемент панели инструментов переменной myToolbarItem».

Если вы хотите, и если всплывающее окно будет прикреплено только к одному элементу панели инструментов, вместо того, чтобы назначать найденный элемент панели инструментов myToolbarItem, вы можете установить его как свойство объекта всплывающего окна, которое с точки зрения всплывающего окна является safari.self:

safari.self.toolbarItem = safari.extension.toolbarItems.filter(function (ti) {
    return ti.popover == safari.self;
})[0];

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

Теперь, объединив эти вещи:

safari.self.toolbarItem = safari.extension.toolbarItems.filter(function (ti) {
    return ti.popover == safari.self;
})[0];

safari.application.addEventListener("command", function (evt) {
    if (evt.command == 'DoAddSymbaloo') {
        document.querySelector('iframe').src = evt.userInfo;
        safari.self.toolbarItem.showPopover();
    }
}, false);

(Отредактировано для упрощения окончательного сценария.)

person chulster    schedule 16.10.2013
comment
Большое спасибо, я попробую это:)! - person Navid; 16.10.2013
comment
Уже решил проблему... как-то глупо, я забыл, что мне все еще нужен скрипт для инъекций :) - person Navid; 17.10.2013