2

ツールバーを含む Safari 5 拡張機能があります。現在のタブが変更されるたびに、そのツールバーを更新する必要があります。バーのスクリプトから次のようなことをしたいと思います。

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

しかし、それはうまくいかないようです。他の多くのイベント名も試しました:

  • アクティブなタブ
  • アクティブなタブが変更されました
  • onActiveTab
  • onActiveTabChanged
  • タブ
  • タブが変更されました
  • onTab
  • onTabChanged
  • 選択が変更されました
  • onSelectionChanged

アクティブなタブがいつ変更されたかを検出する方法を知っている人はいますか?

これが何らかの形で関連しているわけではありませんが、Chromeでこれを行うようです:

 chrome.tabs.onSelectionChanged.addListener(tabChanged);
4

8 に答える 8

6

Safari 5.1 には、ウィンドウまたはタブがフォーカスされたときに発生する「アクティブ化」イベントなど、拡張機能用の新しいイベントがいくつかあります。

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

于 2011-09-27T17:35:19.547 に答える
4

それはあなたが探しているイベントです。よくわかりませんが、拡張機能APIに新しく追加されたものだと思います。global.htmlあなたは中にまたは中に入れることができますpopover.html

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

function activateHandler(event) {
    safari.application.activeBrowserWindow.activeTab.page.dispatchMessage('someId', false);
}
于 2012-10-19T18:08:05.703 に答える
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 秒のレイテンシーが許容され、ブラウザーの速度が低下するようには感じられません)。

于 2010-10-18T14:22:33.627 に答える
0

Safari には Chrome 固有のタブ関連 API はありませんが、この問題に対する完全な解決策があります。

@Galt は、注入された JavaScript にイベント リスナーを追加し、dispatchMessageその情報を拡張機能に追加するというアイデアを 99% 達成しました。

探しているイベント ハンドラーの名前focusは で、タブまたはウィンドウが選択されるたびに起動されます。

挿入されたコードで:

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

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

次に、関連するデータを使用して、拡張機能の UI を更新できます。safari.application.activeBrowserWindow.activeTab

于 2011-01-25T00:09:32.367 に答える
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);
于 2013-02-21T10:28:37.607 に答える
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;
    }
}
于 2011-07-02T22:39:29.420 に答える
-1

ウィンドウやタブの変更などのイベントに特別なAPIを提供するchromeとは異なり、safari拡張機能を使用してそれを行うことができます。

挿入したJavaScriptで、必要なイベントのイベントリスナーを設定するだけです。

次に、その情報が拡張機能のグローバル部分またはその他の部分で必要な場合は、postMessageコマンドを使用してメッセージで情報を渡すことができます。

Injection.js:

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

于 2010-10-19T19:51:16.677 に答える
-1

Apple は、Chrome のようにタブを操作するための API をあまり提供していないようです。現在、タブ イベントを検出する方法はありません。

于 2010-08-24T10:01:16.720 に答える