如何清空GoogleChrome地址栏?
How to clear the Google Chrome address bar?
当我在选项卡中加载我的扩展页面时,我需要清除 Google Chrome 地址栏。
THIS是我的分机,需要清除的地址是这样的:
chrome-extension://<extension-id>/page.html
* 你问题的真实解答在最下面
正在清除浏览器地址栏
几乎所有使用过 JavaScript 的人都会想到这个问题:我可以通过 JavaScript? 好吧,对不起,但答案是巨大的 NOPE!
为什么你不能clear/replace地址栏中的URL?
首先,JavaScript 实际上并没有提供任何功能,最著名的浏览器(Chrome、Mozilla , Opera...) 和他们的 APIs。其次,但同样重要的是,这将是一个巨大的安全漏洞。想象一下,一些恶意的人想要窃取您的一些密码(例如,Facebook 的密码):如果可以更改浏览器的地址栏,他会很容易地创建一个假 log-in 页面,复制原始页面,然后替换URL 和 "facebook.com/login" 让它看起来就像你真的在 Facebook 上(这很容易,是吧?)。您可以明显地看到这适用于任何站点和许多其他服务。
JavaScript location
和 history
在JavaScript中,有两个常用的object用来操作页面地址:
第一个是window.location
,它为您提供有关当前页面位置的有用信息,(例如.hostname
, .path
、.href
等),以及重新加载页面或导航到其他 URL 的功能。顺便说一句,当使用这个object更改地址时,页面将总是重新加载。
location.href = "http://newsite.com"; // will reolad
location.path = "/home.html"; // will reload
location.replace("google.com"); // will also reload
第二个更棘手的是 window.history
,它还允许您在不重新加载页面的情况下操作 URL ,在某些限制内(显然)。凭借其方法 .pushState()
和 .replaceState()
,您可以在不重新加载页面的情况下更改当前的 path。顺便说一下,您只能浏览自己网站的页面(不能更改主机名)。
history.back();
// will make your browser go back to the previous page
history.pushState(null, null, "newPage.html");
// will replace the current path with /newPage.html and add it to the history
// http://example.com/page1.html -> becomes -> http://example.com/newPage.html
// now, if you call history.back() the path will be set back to /page1.html
history.replaceState(null, null, "newPage.html");
// will replace the current path with /newPage.html, PLUS it will also replace the current history path
// http://example.com/page1.html -> becomes -> http://example.com/newPage.html
// calling history.back() will not set the path back to /page1.html, but to the previous one (if exists)
这个API非常有用。 YouTube、Twitter 和许多其他著名网站都使用此功能来更改 URL 而无需重新加载页面。这种做法允许您更改部分页面内容,而不必重新加载那些保持不变的部分(例如:在 Youtube 上它只会加载新的视频、信息和相关内容,不是整页)。
Chrome 扩展:URL 覆盖
Google chrome 为其扩展提供了在 manifest.json
:
中使用 the "chrome_url_overrides"
field 覆盖三个常见默认页面的可能性
- 打开新标签页时显示的新标签页 (
chrome://newtab
)。
- 包含导航历史并用于管理的历史页面 (
chrome://history
)。
- 书签页面 (
chrome://bookmarks
) 包含您的所有书签并用于管理它们。
只有这三种情况允许您在Chrome中"replace"地址栏URL。不要误解我的意思:如果您在其中一个页面中,Chrome 仍然不允许您更改 URL,但它会自动更改它。使用这种技术,用户可以在新标签页、历史记录和书签页面上享受他们漂亮的扩展,而不会看到丑陋的 "chrome-extension://..." URL.
- 使用
"history"
覆盖将加载您的自定义页面而不是默认历史记录页面,但会保持默认 chrome://history
URL.
- 使用
"bookmarks"
覆盖将加载您的自定义页面而不是默认书签,但也会保持默认 chrome://bookmarks
URL.
- 使用
"newtab"
覆盖将加载您的自定义页面而不是新标签页,但会保持默认(空白)URL。
如果我想导航到另一个保持默认地址的页面怎么办?
假设您位于这三个页面之一,并且您加载了自定义页面而不是原始页面,您可以使用 <iframe>
设置为全宽和全高,通过 JavaScript,更改其 src
属性:
HTML:
<iframe id="my-frame" style="width: 100%; height: 100%; margin: 0; padding: 0", frameborder="0"></iframe>
JavaScript:
var frame = document.getElementById('my-frame');
frame.src = "/path/to/page.html";
// navigate to a local page stored in your extension
// or:
frame.src = "http://www.somesite.com";
// navigate to an external site (not always possible)
注意: 由于该站点的安全策略,可能并不总是允许导航到外部站点。如果您尝试加载的外部页面将 X-Frame-Options
header 设置为 "SAMEORIGIN"
(例如 google.com),您将无法加载它,并且会发生错误:
"Refused to display 'http://www.somesite.com/...' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'."
回答你的问题:
经过这么长的浏览,您的扩展程序中存在一个简单的问题:您正在使用 "chrome_url_overrides"
将新标签页覆盖为 dashboard.html
,这将执行脚本 redirect.js
使用 url: "/searchTab.html"
创建一个新选项卡。这就是为什么您会看到 "chrome-extension://..." URL。那么 你为什么要做这些事情? 你加载了一个完美的无用的空白页面,其唯一目的是用 searchTab.html
页面打开一个新标签... 你真的不需要这个。 只需删除那个无用的 /dashboard.html
页面并将 manifest.json
中的覆盖页面更改为 /searchTab.html
:
...
"chrome_url_overrides": {
"newtab": "/searchTab.html"
},
...
当我在选项卡中加载我的扩展页面时,我需要清除 Google Chrome 地址栏。
THIS是我的分机,需要清除的地址是这样的:
chrome-extension://<extension-id>/page.html
* 你问题的真实解答在最下面
正在清除浏览器地址栏
几乎所有使用过 JavaScript 的人都会想到这个问题:我可以通过 JavaScript? 好吧,对不起,但答案是巨大的 NOPE!
为什么你不能clear/replace地址栏中的URL?
首先,JavaScript 实际上并没有提供任何功能,最著名的浏览器(Chrome、Mozilla , Opera...) 和他们的 APIs。其次,但同样重要的是,这将是一个巨大的安全漏洞。想象一下,一些恶意的人想要窃取您的一些密码(例如,Facebook 的密码):如果可以更改浏览器的地址栏,他会很容易地创建一个假 log-in 页面,复制原始页面,然后替换URL 和 "facebook.com/login" 让它看起来就像你真的在 Facebook 上(这很容易,是吧?)。您可以明显地看到这适用于任何站点和许多其他服务。
JavaScript location
和 history
在JavaScript中,有两个常用的object用来操作页面地址:
第一个是
window.location
,它为您提供有关当前页面位置的有用信息,(例如.hostname
,.path
、.href
等),以及重新加载页面或导航到其他 URL 的功能。顺便说一句,当使用这个object更改地址时,页面将总是重新加载。location.href = "http://newsite.com"; // will reolad location.path = "/home.html"; // will reload location.replace("google.com"); // will also reload
第二个更棘手的是
window.history
,它还允许您在不重新加载页面的情况下操作 URL ,在某些限制内(显然)。凭借其方法.pushState()
和.replaceState()
,您可以在不重新加载页面的情况下更改当前的 path。顺便说一下,您只能浏览自己网站的页面(不能更改主机名)。history.back(); // will make your browser go back to the previous page history.pushState(null, null, "newPage.html"); // will replace the current path with /newPage.html and add it to the history // http://example.com/page1.html -> becomes -> http://example.com/newPage.html // now, if you call history.back() the path will be set back to /page1.html history.replaceState(null, null, "newPage.html"); // will replace the current path with /newPage.html, PLUS it will also replace the current history path // http://example.com/page1.html -> becomes -> http://example.com/newPage.html // calling history.back() will not set the path back to /page1.html, but to the previous one (if exists)
这个API非常有用。 YouTube、Twitter 和许多其他著名网站都使用此功能来更改 URL 而无需重新加载页面。这种做法允许您更改部分页面内容,而不必重新加载那些保持不变的部分(例如:在 Youtube 上它只会加载新的视频、信息和相关内容,不是整页)。
Chrome 扩展:URL 覆盖
Google chrome 为其扩展提供了在 manifest.json
:
"chrome_url_overrides"
field 覆盖三个常见默认页面的可能性
- 打开新标签页时显示的新标签页 (
chrome://newtab
)。 - 包含导航历史并用于管理的历史页面 (
chrome://history
)。 - 书签页面 (
chrome://bookmarks
) 包含您的所有书签并用于管理它们。
只有这三种情况允许您在Chrome中"replace"地址栏URL。不要误解我的意思:如果您在其中一个页面中,Chrome 仍然不允许您更改 URL,但它会自动更改它。使用这种技术,用户可以在新标签页、历史记录和书签页面上享受他们漂亮的扩展,而不会看到丑陋的 "chrome-extension://..." URL.
- 使用
"history"
覆盖将加载您的自定义页面而不是默认历史记录页面,但会保持默认chrome://history
URL. - 使用
"bookmarks"
覆盖将加载您的自定义页面而不是默认书签,但也会保持默认chrome://bookmarks
URL. - 使用
"newtab"
覆盖将加载您的自定义页面而不是新标签页,但会保持默认(空白)URL。
如果我想导航到另一个保持默认地址的页面怎么办?
假设您位于这三个页面之一,并且您加载了自定义页面而不是原始页面,您可以使用 <iframe>
设置为全宽和全高,通过 JavaScript,更改其 src
属性:
HTML:
<iframe id="my-frame" style="width: 100%; height: 100%; margin: 0; padding: 0", frameborder="0"></iframe>
JavaScript:
var frame = document.getElementById('my-frame'); frame.src = "/path/to/page.html"; // navigate to a local page stored in your extension // or: frame.src = "http://www.somesite.com"; // navigate to an external site (not always possible)
注意: 由于该站点的安全策略,可能并不总是允许导航到外部站点。如果您尝试加载的外部页面将 X-Frame-Options
header 设置为 "SAMEORIGIN"
(例如 google.com),您将无法加载它,并且会发生错误:
"Refused to display 'http://www.somesite.com/...' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'."
回答你的问题:
经过这么长的浏览,您的扩展程序中存在一个简单的问题:您正在使用 "chrome_url_overrides"
将新标签页覆盖为 dashboard.html
,这将执行脚本 redirect.js
使用 url: "/searchTab.html"
创建一个新选项卡。这就是为什么您会看到 "chrome-extension://..." URL。那么 你为什么要做这些事情? 你加载了一个完美的无用的空白页面,其唯一目的是用 searchTab.html
页面打开一个新标签... 你真的不需要这个。 只需删除那个无用的 /dashboard.html
页面并将 manifest.json
中的覆盖页面更改为 /searchTab.html
:
...
"chrome_url_overrides": {
"newtab": "/searchTab.html"
},
...