2011-01-03 6 views

Antwort

2

Sie eine Nachricht von einem injizierten Skript wie so zu einer globalen Seite versenden können: safari.self.tab.dispatchMessage("messageName", messageData);

(Ihre globale Seite muss etwas haben, um diese Ereignisse zu erfassen):

// register for message callbacks from the injected script 
safari.application.addEventListener("message", respondToMessageFunction, false); 

Soweit wie um "Tab geschlossen" Ereignisse zu erfassen ... ist Ihre Schätzung so gut wie meine. Ich versuche gerade selbst diese Antwort zu finden.

0

Sie können Listener direkt zu den Ereignissen hinzufügen, aber bis jetzt habe ich nicht die richtige gefunden, die erkannt wird, wenn eine Registerkarte geschlossen wird.

0

Bisher habe ich noch keinen Weg gefunden, die globale Seite auf einer Registerkarte zu informieren, dass sie geschlossen wurde (oder gerade geschlossen wird). Eine beschissene Problemumgehung besteht darin, auf der globalen Seite einen Timer einzurichten, der regelmäßig überprüft, ob Tabs geschlossen wurden. Die folgende vereinfach Code wird protokolliert, wenn ein Tab im aktiven Fenster geschlossen ist:

var tabs = safari.application.activeBrowserWindow.tabs; 
var myTimer = setInterval(function(){ 
    for (var i = 0; i < tabs.length; i++) { 
     if (app.activeBrowserWindow.tabs[i] !== tabs[i]) { 
      console.log('A tab was closed.'); 
     } 
    } 
    tabs = safari.application.activeBrowserWindow.tabs; 
}, 1000); 

Dieses Beispiel ist ziemlich nutzlos, da es keine Informationen über die Registerkarte bietet, die geschlossen wurde, und es wird eine falsche Ausbeute positiv, wenn ein Tab nur verschoben wird.

1

Verwendung der „Validierung“ Ereignis im Hintergrund Registerkarte Schalter erkennen, zum Beispiel

var popupBackground = { 

    initialised : false, 
    activeTab : null, 
    numberOfTabs : null, 


    _init : function() { 
     var that = this; 

     // on browser initialise reset data 
     localStorage.clear(); 

     // this initialises the popup dialogue 
     localStorage["popupOpened"] = false; 



     // register listeners for application messaging 
     safari.application.addEventListener("command", function(event){ 
      that.handleCommand(event); 
     }, false); 

     safari.application.addEventListener("validate",function(event){ 
      that.validateCommand(event); 
     }, false); 

     safari.application.addEventListener("message", function(event){ 
      that.handleMessage(event); 
     }, false); 

    }, 


    _getActiveTab : function(){ 
     return safari.application.activeBrowserWindow.activeTab; 
    }, 


    // commands are validated before being excecuted 
    validateCommand : function(aEvent) { 
     var that = this; 

     // all commands should have the identifier specified in Extension Builder 
     if (aEvent.command === "togglePopup") { 
      // check that there is an active tab  
      if (!aEvent.target.browserWindow.activeTab.url) { 
       aEvent.target.disabled = true; 
      } else { 
       aEvent.target.disabled = false; 
      } 
     } 


     // this is a hack for detecting tab switches, safari does not have a dedicated API like Chrome 
     if(this.activeTab !== null){ 
      if(this.activeTab !== this._getActiveTab()){ 
       $.each(safari.application.browserWindows, function(aIndex, aWindow) { 
        $.each(aWindow.tabs, function(aIndex, aTab) { 
         if(typeof aTab.page !== "undefined"){ 
          // message all tabs about the focus switch event 
          if (aTab !== that._getActiveTab()) { 
           aTab.page.dispatchMessage("tabUnfocused"); 
           // set the popup status (incase tab closed with open popup) 
           localStorage["popupOpened"] = false; 
          }else{ 
           aTab.page.dispatchMessage("tabFocused"); 
          } 
         } 
        }); 
       }); 
      } 
     } 
     // set the new active tab 
     this.activeTab = this._getActiveTab(); 

    } 
} 
3

Für Safari 5.1 ab, sie tab close event hinzugefügt, die Sie hören können, und auf die übliche Art und Weise handhaben.