2010-08-22 2 views
2

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

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

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

  • activeTab
  • activeTabChanged
  • onActiveTab
  • onActiveTabChanged
  • Вкладка
  • tabChanged
  • onTab
  • onTabChanged
  • SelectionChanged
  • onSelectionChanged

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

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

chrome.tabs.onSelectionChanged.addListener(tabChanged); 

ответ

-1

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

2

Я согласен с ответом @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 сек. максимальная латентность приемлема для моего расширения, и не похоже, что это замедляет работу браузера).

+2

Да, я думаю, что это это лучший текущий ответ. К сожалению, это не работает для моей конкретной ситуации, если я не уменьшу задержку опроса до примерно 200 мс, что кажется слишком частым для моих вкусов. Тем не менее, спасибо за предложение. –

-1

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

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

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

injected.js:

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

+1

Правильно, это я понимаю. К сожалению, нет стандартного события DOM, которое срабатывает при изменении вкладки окна. Это то, что Apple должна будет предоставить. Возможно, они это делают, но я не могу найти никакой документации. –

0

В то время как 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

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

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; 
    } 
} 
4

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

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

function activateHandler(event) { 
    safari.application.activeBrowserWindow.activeTab.page.dispatchMessage('someId', false); 
} 
0

Этот код поможет проследить изменение 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

Я искал уведомление о том, что пользователь переключился на другую вкладку в том же окне, а не на то, когда пользователь нажимает ссылку на вкладке. –