2

我有一个包含工具栏的 Safari 5 扩展。每当当前选项卡更改时,都应更新该工具栏。我想从我的酒吧脚本中做这样的事情:

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

但是,这似乎不起作用。我也尝试了许多其他事件名称:

  • 活动标签
  • 活动选项卡已更改
  • 活动选项卡
  • onActiveTabChanged
  • 标签
  • 选项卡已更改
  • 选项卡
  • 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 已经完成了 99%,其想法是为注入的 JavaScript 添加一个事件监听器,并将dispatchMessage该信息添加到您的扩展中。

您要查找的事件处理程序名为focus,并且每次选择选项卡或窗口时都会触发。

在您注入的代码中:

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

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

然后,您可以使用与相关的数据更新您的扩展程序的 UIsafari.application.activeBrowserWindow.activeTab

于 2011-01-25T00:09:32.367 回答
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 回答
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 回答
-1

似乎 Apple 并没有像 Chrome 那样为我们操作标签提供太多 API。目前,没有办法检测标签事件。

于 2010-08-24T10:01:16.720 回答
-1

与为窗口和选项卡更改等事件提供特殊 API 的 chrome 不同,您仍然可以使用 safari 扩展来实现。

您只需让注入的 javascript 为您想要的事件设置事件侦听器。

然后,如果扩展的全局或其他部分需要该信息,您可以使用 postMessage 命令在消息中传递该信息。

注入的.js:

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

于 2010-10-19T19:51:16.677 回答