代码之家  ›  专栏  ›  技术社区  ›  Daniel Yankowsky

Safari5扩展:如何检测窗口的当前选项卡何时更改?

  •  2
  • Daniel Yankowsky  · 技术社区  · 14 年前

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

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

    然而,这似乎不起作用。我还尝试了许多其他事件名称:

    • 活动选项卡已更改
    • 激活抗体
    • onActiveTabChanged已更改
    • 标签
    • 标签已更改
    • 安塔布
    • Ontab已更改

    有人知道如何检测活动选项卡何时更改吗?

     chrome.tabs.onSelectionChanged.addListener(tabChanged);
    
    8 回复  |  直到 14 年前
        1
  •  6
  •   Cœur Gustavo Armenta    6 年前

    Safari5.1有几个新的扩展事件,包括一个“activate”事件,当窗口或选项卡被聚焦时触发。

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

        2
  •  4
  •   Toni Oriol    12 年前

    这就是你要找的活动。我不确定,但我认为它是扩展api的新添加。你可以放进去 global.html 或者在 popover.html

    safari.application.addEventListener("activate", activateHandler, true);
    
    function activateHandler(event) {
        safari.application.activeBrowserWindow.activeTab.page.dispatchMessage('someId', false);
    }
    
        3
  •  2
  •   Amos    14 年前

    我同意@imiaou的回答:从苹果的文档来看,似乎没有办法做到这一点:(。

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

    我对经常轮询浏览器很不满意,但在苹果添加对这些标签事件的支持之前,我看不到其他解决方法。如果您的扩展可以接受相对宽松的tab开关事件触发延迟,那么这可能是目前一个合理的解决方法(1.5秒)。最大延迟对于我的扩展来说是可以接受的,而且它不会让浏览器变慢)。

        4
  •  0
  •   Ian Wessman    14 年前

    @Galt的想法是在注入的JavaScript中添加一个事件监听器,并将其添加到 dispatchMessage 把这些信息传给你的分机。

    您要查找的事件处理程序名为 focus

    在注入的代码中:

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

    然后,可以使用与扩展相关的数据更新扩展的UI safari.application.activeBrowserWindow.activeTab

        5
  •  0
  •   fabritw    13 年前

    我发现这个方法比焦点事件更有效,它可以在后台页面进行管理:

    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;
        }
    }
    
        6
  •  0
  •   ThmHarsh    12 年前

    此代码将有助于跟踪URL中的更改:- 编写此代码注入.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);
    
        7
  •  -1
  •   imiaou    14 年前

        8
  •  -1
  •   GDP Danny    12 年前

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

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

    注入.js:

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