【问题标题】:Programmatically (or optionally) override Chrome's New Tab page以编程方式(或可选)覆盖 Chrome 的新标签页
【发布时间】:2015-08-06 21:34:27
【问题描述】:

我写了一个 Chrome 扩展程序 overrides the New Tab page:

ma​​nifest.json

  "chrome_url_overrides": {
    "newtab": "new-tab.html"
  },

有没有办法让这个覆盖成为可选?也就是说,我想让用户取消选中选项页面中的复选框并禁用新选项卡覆盖。这一定是可能的,因为当我第一次打开一个新标签时,会有一个弹出窗口通知扩展程序更改了新标签设置并询问是保留更改还是恢复设置:

我找不到任何用于控制覆盖的 API。 New Tab Redirect 项目没有显示原生新标签的选项。

【问题讨论】:

  • 这很可能违反了 Google 的单一用途扩展政策。你要么是新标签的替代品,要么不是。

标签: javascript google-chrome google-chrome-extension tabs


【解决方案1】:

Google 制作了一个Star Wars new tab replacement,允许您查看默认的新标签页。它使用的网址是chrome-search://local-ntp/local-ntp.html

例子:

options.html:

<input type="checkbox"> Use default new tab page

options.js:

var checkbox = document.querySelector("input[type=checkbox]")
checkbox.addEventListener("click", function() {
 chrome.storage.sync.set({ defaultnewtab: checkbox.checked })
})

newtab.js:

chrome.storage.sync.get("defaultnewtab", function(storage) {
 if(storage.defaultnewtab) {
  chrome.tabs.update({ url: "chrome-search://local-ntp/local-ntp.html" })
 }
})

【讨论】:

  • 这里是否有适用于 Firefox Web 扩展的 URL?
【解决方案2】:

使用@Daniel Herr 描述的星球大战方法,我做到了,效果很好。虽然感觉有点 hack-y。

我在popup.html 中设置了一个选项,无论扩展是否“开启”。

首先,使用Chrome定义的方法设置默认的新标签页:

ma​​nifest.json

"chrome_url_overrides": {
      "newtab": "newtab.html"
},

然后在您的扩展程序的 newtab.html 中调用一个新的 JavaScript 文件 newtab.js(或其他)。

我也在使用 jQuery,所以我的代码使用它,但您可以使用 DOMContentLoaded 本地执行此操作。

newtab.js

$(document).ready(function(){ 

    // It takes a moment for the Chrome query/update so sometimes there is a flash of content
    // Hiding the Body makes it look blank/white until either redirected or shown
	$('body').hide();

	var background = chrome.extension.getBackgroundPage();
	var _app = background._app;

	// App is OFF, show Default New Tab
	if(!_app._on){

		// Get the current Tab
		chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {

			var active = tabs[0].id;
          
            // Set the URL to the Local-NTP (New Tab Page)
			chrome.tabs.update(active, { url: "chrome-search://local-ntp/local-ntp.html" }, function() { });
		});

	// App is ON, show custom content
	} else {
		
		$('body').show();
	}

});

基本上,方法是更新选项卡,使其重定向到chrome-search://local-ntp/local-ntp.html,这是默认 Chrome NTP 的硬 URL。

由于这是一个 Chrome 内部 URL - URL 字段仍然显示为空白。

【讨论】:

  • 缺少的信息是 URL - 因为重定向到 chrome://newtab 没有给出任何结果。非常有用的答案。
  • 看起来很有希望,但我相信正确的方法是上面的answer,虽然它不能始终如一地工作,但会尝试一下,感谢分享
【解决方案3】:

您可以使用chrome.tabs.onUpdated.addListener() 编写一个监听器来监听标签何时更新,而不是使用chrome_url_override,然后检查url 是否为chrome://newtab/,如果是并且勾选了复选框,然后使用chrome.tabs.update() 将它们重新定位到另一个页面。

【讨论】:

  • 如果tabs permission is requested(安装扩展程序时显示为警告)和chrome.tabs.update 会将扩展程序的丑陋的chrome-extension://hibkhcnpkakjniplpfblaoikiggkopka/html/fauxbar.html URL 填充到多功能框中,则此方法有效。如何清除多功能框?
  • 我使用了这种确切的方法,但新标签并不总是正确重定向,有时它会与默认的 chrome 新标签页一起挂起,现在搜索了几个小时,没有找到有效的答案,似乎是一个不一致的问题chrome.tabs.update
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-05-10
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多