我期待在Safari中新的选项卡重定向到一个特定URL中,在本质上改变默认的新标签页。 不过,我不希望重定向由以下链接打开新的标签页。
该窗口和标签API描述标签“开放式”的事件,但是当任何新标签页中打开(包括新的标签从链接打开),这些被解雇。
有没有办法赶上了只有那些通过点击新标签页按钮创建选项卡的新标签的事件?
提前致谢!
我期待在Safari中新的选项卡重定向到一个特定URL中,在本质上改变默认的新标签页。 不过,我不希望重定向由以下链接打开新的标签页。
该窗口和标签API描述标签“开放式”的事件,但是当任何新标签页中打开(包括新的标签从链接打开),这些被解雇。
有没有办法赶上了只有那些通过点击新标签页按钮创建选项卡的新标签的事件?
提前致谢!
在你open
事件处理程序,首先检查事件的目标是一个标签。 如果是,请注册的事件处理程序beforeNavigate
该选项卡上的事件。 还设置了超时注销处理程序,如果beforeNavigate
事件不火之内,说,50毫秒。 例如:
function handleOpen(e) {
if (e.target instanceof SafariBrowserTab) {
e.target.addEventListener('beforeNavigate', handleBeforeNavigate, false);
setTimeout(function () {
e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
}, 50);
}
}
现在,有三个相关的可能的结果beforeNavigate
事件后一个标签页中打开事件。
案例1: beforeNavigate
事件不会超时内火。 这通常意味着该选项卡为空。 空标签不能是链接点击的结果,所以我们可以把一些代码在超时功能尽我们用它喜欢:
function handleOpen(e) {
if (e.target instanceof SafariBrowserTab) {
e.target.addEventListener('beforeNavigate', handleBeforeNavigate, false);
setTimeout(function () {
e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
takeOverTab();
}, 50);
}
}
案例2: beforeNavigate
事件将触发,其url
属性将具有值null
。 这意味着该选项卡将加载任何顶级网站页面或书签页面(两个特殊的Safari浏览器的页面是新的选项卡上的选项中)。 像一个空标签,这种标签不可能是一个链接点击的结果,所以我们可以做什么,我们与标签一样。 例如:
function handleBeforeNavigate(e) {
e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
if (e.url === null) {
takeOverTab();
}
}
案例3: beforeNavigate
会火,它的url
值将是一个非空字符串:也就是说,实际的URL。 这是棘手的情况下,由于标签可能导致从任一链接点击,新的标签命令(如果用户已经配置了Safari浏览器打开新标签页,以他的主页),或其他应用或扩展的作用。 让我们叫的情况下标签是一个链接点击案例3A的结果; 它是新的分页命令,事例3B的结果的情况下; 和其他应用程序内的表壳,表3C。
我不能想办法3B和3C之间进行区分。 如果真的有不区分这两种情况的一种方式,它可能是你的应用程序很不好,因为你可能不希望重定向被其他应用程序打开的标签。
如果你不关心你的应用是否有3C标签干扰,没有从3B / 3C标签告诉3A标签至少一种方式。 这是发生在我的方式:
在每一页使用注入脚本来监听链接点击。 当用户点击一个链接,转发URL和点击的全球页面,该页面会记住他们以供将来参考的时间。 例如:
function handleMessage(e) { if (e.name === 'linkClicked') { lastClickedLinkUrl = e.message.url; lastLinkClickTime = e.message.clickTime; } }
在你beforeNavigate
处理程序,检验是否该事件的url
值是从最后被点击链接的网址不同。 如果是,新标签没有从该链接的点击造成的,因此它可能没有任何链接点击的结果。 如果两个URL是相同的,检查是否超过,也就是说,自上次链接点击已经经过100毫秒。 如果是这样的话,它可能只是一个巧合的网址是一样的,所以你又可以推断,新标签没有从链接点击的结果。 例如:
function handleBeforeNavigate(e) { e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false); if (e.url === null) { takeOverTab(); } else if (e.url !== lastClickedLinkUrl || (new Date) - lastLinkClickTime > 100) { takeOverTab(); } }
注意,该检测方法并非万无一失。 可能有多种方式可能会出问题。 不过,我希望这有助于。