Safari 5 Extension:如何检测窗口当前选项卡的更改时间?

时间:2010-08-22 15:09:24

标签: events safari safari-extension

我有一个包含工具栏的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 个答案:

答案 0 :(得分:5)

Safari 5.1有几个新的扩展事件,包括在窗口或标签聚焦时触发的“激活”事件。

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

答案 1 :(得分:4)

这是你正在寻找的事件。我不确定,但我认为是扩展api的新增功能。您可以加入global.htmlpopover.html

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

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

答案 2 :(得分: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秒的最大延迟,并且它不会让浏览器变慢)。

答案 3 :(得分:0)

虽然Safari没有Chrome特定的与标签相关的API,但它确实有解决此问题的完美解决方案。

@Galt占据了99%的目标,其目的是为您注入的JavaScript添加一个事件监听器,并向您的扩展程序添加dispatchMessage该信息。

您要查找的事件处理程序名为focus,每次选中标签或窗口时都会被触发。

在您注入的代码中:

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

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

然后,您可以使用与safari.application.activeBrowserWindow.activeTab

相关的数据更新扩展程序的用户界面

答案 4 :(得分: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;
    }
}

答案 5 :(得分:0)

此代码将有助于跟踪网址中的更改: - 在副函数

中编写此代码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);

答案 6 :(得分:-1)

似乎Apple没有为我们操纵像Chrome这样的标签提供太多API。 目前,无法检测标签事件。

答案 7 :(得分:-1)

与为窗口和标签更改等事件提供特殊API的chrome不同,您仍然可以使用safari扩展来执行此操作。

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

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

injected.js:

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