如何清空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 locationhistory

在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"
},
...