Расширение Safari 5: Как я могу определить, изменилась ли текущая вкладка окна? - PullRequest
2 голосов
/ 22 августа 2010

У меня есть расширение Safari 5, которое содержит панель инструментов.Всякий раз, когда текущая вкладка изменяется, эта панель инструментов должна обновляться.Я хотел бы сделать что-то вроде этого из сценария моего бара:

safari.self.browserWindow.addEventListener("activeTab", tabChanged, false);

Однако, похоже, это не работает.Я пробовал также ряд других имен событий:

  • activeTab
  • activeTabChanged
  • onActiveTab
  • onActiveTabChanged
  • вкладка
  • tabChanged
  • onTab
  • onTabChanged
  • selectionChanged
  • onSelectionChanged

Кто-нибудь знает, как обнаружитькогда активная вкладка меняется?

Не то чтобы это как-то связано, но похоже, что я бы сделал это в Chrome с:

 chrome.tabs.onSelectionChanged.addListener(tabChanged);

Ответы [ 8 ]

5 голосов
/ 27 сентября 2011

В Safari 5.1 появилось несколько новых событий для расширений, в том числе событие «активации», которое срабатывает, когда окно или вкладка находятся в фокусе.

https://developer.apple.com/documentation/safariextensions/safariactivateevent

4 голосов
/ 19 октября 2012

Это событие, которое вы ищете.Я не уверен, но я думаю, это новое дополнение к API расширений.Вы можете положить в global.html или в popover.html

safari.application.addEventListener("activate", activateHandler, true);

function activateHandler(event) {
    safari.application.activeBrowserWindow.activeTab.page.dispatchMessage('someId', false);
}
2 голосов
/ 18 октября 2010

Я согласен с ответом @imiaou: судя по документам Apple, кажется, нет способа сделать это: (.

Поскольку мне нужно было обнаружить изменения вкладок для моего расширения (которое я переношу из Chrome), я сделал следующий обходной путь на основе опроса, который, кажется, работает нормально (на моей глобальной странице):

var prevActiveTab;

setInterval("poorMansOnTabChange()", 1500); //poll every 1.5 sec

function poorMansOnTabChange() {
    var curTab = safari.application.activeBrowserWindow.activeTab;
    if (curTab != prevActiveTab) {
        prevActiveTab= curTab;
        console.log("active tab changed!");
        //do work here
    }
}

Меня не устраивает постоянный опрос браузера, но я не вижу другого выхода, пока Apple не добавит поддержку этих событий табуляции. Если ваше расширение может жить с относительно уменьшенной задержкой запуска события переключения вкладок, то это может быть разумным обходным решением (максимальная задержка 1,5 с приемлема для моего расширения, и это не похоже на замедление работы браузера).

0 голосов
/ 21 февраля 2013

Этот код поможет отследить изменение в URL: - Напишите этот код Inject.js, в побочной функции


function trackURL() {

    alert("beforeNavigate "+safari.application.activeBrowserWindow.activeTab.url);
        setTimeout(function() {
            alert("afterNavigate "+safari.application.activeBrowserWindow.activeTab.url);

            }, 500);
    }
    safari.application.addEventListener("beforeNavigate", trackURL, true);
0 голосов
/ 03 июля 2011

Я обнаружил, что этот метод работает лучше, чем фокусное событие, им можно управлять на фоновой странице:

safari.application.addEventListener("validate", PopUp.validateCommand, false);

var PopUp = {

    activeTab : null,

    // commands are validated before being excecuted
    validateCommand : function(aEvent) {

        // this is a hack for detecting tab switches, safari does not have a dedicated API like Chrome 
        if(PopUp.activeTab !== null){
            if(PopUp.activeTab !== safari.application.activeBrowserWindow.activeTab){
                $.each(safari.application.browserWindows, function(aIndex, aWindow) {
                    $.each(aWindow.tabs, function(aIndex, aTab) {
                        //  message all tabs about the focus switch event
                        if (aTab !== safari.application.activeBrowserWindow.activeTab && aTab.page) {
                            aTab.page.dispatchMessage("tabUnfocused");
                        }else{
                            aTab.page.dispatchMessage("tabFocused");
                        }
                    });
                });
            }
        }
        // set the new active tab
        PopUp.activeTab = safari.application.activeBrowserWindow.activeTab;
    }
}
0 голосов
/ 25 января 2011

Хотя в Safari нет специального API, связанного с вкладками в Chrome, у него есть идеальное решение этой проблемы.

@ Galt прошел 99% пути с идеей добавить слушатель событий в ваш введенный JavaScript и dispatchMessage эту информацию в ваше расширение.

Требуемый обработчик событий называется focus и запускается каждый раз, когда выбирается вкладка или окно.

В вашем введенном коде:

var tabInFocus = function( event )
{
 safari.self.tab.dispatchMessage("tabFocusSwitched","");
}

window.addEventListener("focus", tabInFocus, false);

Затем вы можете обновить пользовательский интерфейс вашего добавочного номера, указав данные, относящиеся к safari.application.activeBrowserWindow.activeTab

0 голосов
/ 19 октября 2010

В отличие от chrome, который предоставляет специальный API для таких событий, как изменения окон и вкладок, вы все равно можете делать это с расширениями Safari.

Вам просто нужно, чтобы ваш внедренный javascript настраивал прослушиватели событий для тех событий, которые вы хотите.

Тогда, если эта информация нужна глобальным или другим частям расширения, вы можете передать информацию в сообщениях с помощью команды postMessage.

injected.js:

window.addEventListener("load", loaded, false); safari.self.tab.dispatchMessage("somethinghappened","load");

0 голосов
/ 24 августа 2010

Кажется, Apple не предоставляет много API для манипулирования вкладками, как это делает Chrome.В настоящее время нет способа обнаружить событие табуляции.

...