我有一个包含工具栏的Safari 5扩展程序。每当当前选项卡更改时,应更新该工具栏。我想从我的酒吧脚本中做这样的事情:
safari.self.browserWindow.addEventListener("activeTab", tabChanged, false);
然而,这似乎不起作用。我也尝试过其他一些事件名称:
有人知道如何检测活动标签何时发生变化吗?
这并不是说这有任何关联,但看起来我会在Chrome中执行此操作:
chrome.tabs.onSelectionChanged.addListener(tabChanged);
答案 0 :(得分:5)
Safari 5.1有几个新的扩展事件,包括在窗口或标签聚焦时触发的“激活”事件。
https://developer.apple.com/documentation/safariextensions/safariactivateevent
答案 1 :(得分:4)
这是你正在寻找的事件。我不确定,但我认为是扩展api的新增功能。您可以加入global.html
或popover.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");