在后台打开新标签页,将焦点留在当前标签页上 \- Chrome

新手上路,请多包涵

如何在 JavaScript 中执行 CTRL + 单击在最新版本的 Chrome (v68) 中有效的链接?

上下文 - 我正在运行一个 JavaScript 脚本,该脚本在一天中的特定时间打开特定选项卡(并在几分钟后关闭它)。我试图让它在后台打开选项卡,将焦点留在我正在使用的当前选项卡上。

以编程方式打开的选项卡导致 Chrome 弹出,即使在最小化时也是如此,这非常混乱。

我在 Stack Overflow 上找到的这些 旧解决方案 不适用于最新版本的 Chrome。

手动 CTRL + 单击链接可实现我想要的效果(选项卡在后台打开)。这可以在最新版本的 Chrome 上以编程方式实现吗?


以下代码不再适用于最新版本的 Chrome。

 const openNewBackgroundTab = (url) => {
  const anchor = document.createElement("a");
  anchor.href = url;
  document.body.appendChild(anchor);
  const evt = document.createEvent("MouseEvents");
  // the tenth parameter of initMouseEvent sets ctrl key
  evt.initMouseEvent(
    "click", true, true, window, 0, 0, 0, 0, 0,
    true, false, false, false, 0, null
  );
  anchor.dispatchEvent(evt);
}
openNewBackgroundTab('https://stackoverflow.com');

.. 新标签仍然是焦点。


重现步骤:

  • 打开窗口 1 并在控制台中执行:

let winStacko; setTimeout(() => { winStacko = open('https://www.stackoverflow.com'); }, 30 * 1000); setTimeout(() => winStacko.close(), 2 * 60 * 1000);

  • 执行脚本后30秒内打开窗口2

期望的行为:

  • 当背景选项卡打开然后关闭时,窗口 2 始终具有焦点。

原文由 Gabe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

由于您希望将此用于个人用途,并且您不介意使用扩展名,因此您可以编写自己的扩展名。

编写 chrome 扩展程序来实现所需的行为实际上非常简单,您只需要知道如何从扩展程序中打开/关闭选项卡即可。以下页面描述了整个 API

这是一个例子:

1 - 创建一个 manifest.json 文件,并请求 tabs 权限

{
  "name": "blabla",
  "version": "0.1",
  "permissions": ["tabs"],
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_title": "Open a background tab every x time"
  },
  "manifest_version": 2
}

2 - 在同一文件夹中创建 background.js 脚本

const INTERVAL = 5000;
setTimeout(function(){
    chrome.tabs.create({url: "https://www.stackoverflow.com", active: false }, tab =>{
        setTimeout(function(){
            chrome.tabs.remove(tab.id);
        },INTERVAL);
    });
},INTERVAL);

你也可以从这里下载

注意: 请注意这里的 active 参数,它定义了标签是否应该成为窗口中的活动标签。不影响窗口是否获得焦点

3 - 在 chrome 中使用扩展

  1. 如果您使用的是下载链接,请解压存档
  2. 从 Chrome 菜单导航到扩展程序
  3. 开启右上角的开发者模式
  4. 点击 Load Unpacked 按钮选择扩展文件夹
  5. 该扩展程序将自动运行

原文由 Hyyan Abo Fakher 发布,翻译遵循 CC BY-SA 4.0 许可协议

在过去,你可以使用类似的东西来做到这一点:

 if(window.focus == false)
{
    this.focus();
}

由于滥用者,现在您必须使用额外的插件。

解决方案:窗口翻转:

解决方案是创建另一个页面。当您单击链接时,窗口关闭,它切换到打开刚刚关闭的窗口的页面,并将其位置更改为新页面。

第一页代码:

 document.getElementById("myId").onclick = function(){window.open("page2.html");window.close()}

第 2 页代码:

 window.open("previouspage.html");
window.location = "newpage.html";
//close the page
window.close();

我将此策略称为 “Window Rollover”。

原文由 bluninja1234 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题