当前位置: 首页 > 知识库问答 >
问题:

Safari扩展:全新选项卡的事件?

慕永年
2023-03-14

我正在寻找重定向新标签Safari到一定的URL,本质上改变默认的新标签页。但是,我不想重定向通过以下链接打开的新选项卡。

Windows和Tabs API描述了选项卡“打开”事件,但当任何新选项卡打开(包括从链接打开的新选项卡)时,都会触发这些事件。

是否有一种方法可以仅为那些通过单击新标签按钮创建的标签捕获新标签事件?

共有1个答案

周育
2023-03-14

在打开事件处理程序中,首先检查事件目标是否是选项卡。如果是,则为该选项卡上的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事件在超时时间内不会触发。这通常意味着该选项卡为空。空选项卡不能是链接单击的结果,因此我们可以在timeout函数中放入一些代码,以执行我们喜欢的操作:

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;是新tab命令的结果的情况,情况3B;还有另一个应用程序案例,案例3C。

我想不出一种方法来区分3B和3C。如果真的没有办法区分这两种情况,可能对你的应用程序非常不利,因为你大概不想重定向其他应用程序打开的选项卡。

如果你不在乎你的应用程序是否会干扰3C标签,那么至少有一种方法可以区分3A标签和3B/3C标签。这就是我想到的方式:

>

function handleMessage(e) {
    if (e.name === 'linkClicked') {
        lastClickedLinkUrl = e.message.url;
        lastLinkClickTime = e.message.clickTime;
    }
}

beforeNavigate处理程序中,测试事件的url值是否与上次单击链接的url不同。如果是,则新选项卡不是由该链接单击生成的,因此它可能不是由任何链接单击生成的。如果两个URL相同,请检查自上次单击链接以来是否已超过100毫秒。如果是这样的话,可能只是巧合,URL是相同的,因此您可以再次推断,新选项卡不是由链接单击产生的。例如:

function handleBeforeNavigate(e) {
    e.target.removeEventListener('beforeNavigate', handleBeforeNavigate, false);
    if (e.url === null) {
        takeOverTab();
    } else if (e.url !== lastClickedLinkUrl || (new Date) - lastLinkClickTime > 100) {
        takeOverTab();
    }
}

请注意,这种检测方法并非万无一失。可能有很多方法会出错。不过,我希望这能有所帮助。

 类似资料:
  • tabsSwiper 全屏选项卡 平台差异说明 App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序 √ √ √ x √ √ √ 基本使用 通过设置is-scroll(默认为true),配置tabsSwiper组件的内容是否可以左右拖动,一般4个标签以下时,无需拖动,设置为false,5个标签以上,建议可以左右拖动。 具体的标签,通过list参数配置,该参数要求为数组,元素为

  • 因此,我正在测试一个web应用程序,我必须打开一个新的选项卡,切换到它,做一些输入,然后切换回第一个选项卡,这不止一次。我尝试通过以下方式打开新选项卡: 这将导致出现以下警报: 但我无法通过Appium的自动化来接受它。我尝试过的事情: 使用以下功能:“safariAllowPopups”和“AutoAcceptablers” 在iOS sim卡中更改safari的相应设置 .switchTo()

  • 注意:不能重复这个,因为在这个解决方案中是针对iOS移动应用的。iOS-从本机应用程序返回Safari而不打开新选项卡 谢谢你抽出时间。

  • 有一些扩展允许用户进行个性化设置,这样就需要向用户提供一个选项页面。Chrome通过Manifest文件的options_page属性为开发者提供了这样的接口,可以为扩展指定一个选项页面。当用户在扩展图标上点击右键,选择菜单中的“选项”后,就会打开这个页面1。 1 对于没有图标的扩展,可以在chrome://extensions页面中单击“选项”。 指定options_page属性后,扩展图标上的

  • 我正在创建一个safari扩展。如何手动将新选项卡/窗口设置为我选择的URL?我使用了这篇文章中的一些逻辑来确保我只是接管了用户创建的选项卡/WindowsSafariExtension:Event来创建一个全新的选项卡? 我设置了我的新选项卡事件侦听器: 使用此选项处理打开的选项卡/窗口: 当一个新的选项卡/窗口打开时,我能够发出警报,但我一辈子都不知道如何浏览到url。我尝试了window.l

  • 描述 (Description) JavaScript事件可当你用的窗格的JavaScript代码的工作中使用。 例子 (Example) 下面的例子演示了如何使用JavaScript事件在Framework7选项卡 - <!DOCTYPE html> <html> <head> <meta name = "viewport" content = "width = device-