Javascript chrome扩展正在更改主机/域警告

Javascript chrome扩展正在更改主机/域警告,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在尝试创建一个chrome扩展,当我测试特定网站时,它会通知我主机/域的更改。通常会出现指向开发人员或现场环境的链接,如果我遵循其中一个链接,我希望得到警告,因为这些网站通常是相同的 为清晰起见,请编辑:当链接将我从http(s)://example.staging.something.com带走,并最终出现在实时站点http(s)://www.example.com或开发人员站点http(s)://example.dev.something.com时,我希望它提醒我 到目前为止,我已经成功

我正在尝试创建一个chrome扩展,当我测试特定网站时,它会通知我主机/域的更改。通常会出现指向开发人员或现场环境的链接,如果我遵循其中一个链接,我希望得到警告,因为这些网站通常是相同的

为清晰起见,请编辑:当链接将我从http(s)://example.staging.something.com带走,并最终出现在实时站点http(s)://www.example.com或开发人员站点http(s)://example.dev.something.com时,我希望它提醒我

到目前为止,我已经成功地创建了一个脚本来标识我何时在登台url(我们的测试环境)上,但是我无法反转此逻辑,以便在导航到不包含“登台”的url时向我发出警告

我的manifest.json

{
"manifest_version": 2,

"name": "A What URL",
"description": "This extension monitors and warns you of domain changes",
"version": "1.0",

"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},

"background": { "scripts": ["background.js"],
"persistent": false
},

"permissions": [
"activeTab",
"webNavigation"
]
}
my background.js

   chrome.webNavigation.onCommitted.addListener(function(e) {
        alert ("you are still on staging!");
  }, {url: [{hostContains: 'staging'}]});
我相信这很简单,但我的大脑似乎要简单得多

不幸的是,您无法“反转”过滤器,因此必须捕获代码中的所有事件并进行过滤

Chrome事件来了。您的代码建议您将它们视为DOM事件(使用
e
参数)。相反,它们根据所讨论的事件传递参数,有时是几个

如果查看,您将看到预期的回调格式为:

function(object details) {...};
其中,
details
将包含一个
url
属性

因此,您将有:

chrome.webNavigation.onCommitted.addListener(function(details) {
  // Regexp matches first "//", followed by any number of non-/, followed by "staging"
  if(!details.url.match(/[^\/]*\/\/[^\/]*staging/)) {
    alert ("This is no longer staging!");
  }
});
请注意,除非你能关闭它,否则这将是非常烦人的——毕竟它几乎可以匹配任何页面。

有多种方法可以解决您的问题

  • 当请求发送到生产网站时,使用(或)事件获取通知,并检查
    Referer
    标题是否设置为暂存站点。这仅在设置了文档引用者的情况下有效(如果从https导航到http,或者设置了“noreferrer”,则不会出现这种情况)

  • 在没有referer的情况下,使用、和/或API跟踪页面的导航状态,并在检测到发生转换时执行任何操作。正确实施这一点非常困难

以下是第一种方法的示例:

//background.js
chrome.webRequest.onBeforeSendHeaders.addListener(函数(详细信息){
var参考值;
对于(变量i=0;i
测试前面逻辑的manifest.json示例:

{
“名称”:“检测从开发到产品的导航”,
“版本”:“1”,
“清单版本”:2,
“背景”:{
“脚本”:[“background.js”],
“持久”:正确
},
“权限”:[
“网络请求”,
"*://*/*"
]
}

根据要求添加我的最终解决方案作为答案,以防其他人对未来感兴趣

非常感谢Xan和Rob的帮助!如果我可以勾选这两个,我会勾选,但最终我勾选了导致我实现的那个

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {

    var queryInfo = {
    active: true,
    currentWindow: true
    };

   chrome.tabs.query(queryInfo, function(tabs) {
       var tab = tabs[0];
       var url = tab.url;

       if(!url.match(/[^\/]*\/\/[^\/]*staging/) &&   changeInfo.status=="complete"){
           alert ("WTF!!! " +url); 
       }
   });
});

您希望在哪一点得到通知?当它被捕获时,你想做什么?我的意思是,我可以按原样回答你的问题(如何在该示例中反转逻辑),但根据你的“理想”逻辑,可能有一个更合适的答案。一旦发生了这种转换,对我来说很好,我认为onCommitted是正确的操作,尽管我确实查看了其他可用的选项。起初我只想得到警告,弹出的警报就足够了,但最终我想利用通知api使其更具闪动性。我的意思是,你的目标不是阻止导航,只是得到通知?是的,就是这样!非常感谢,我曾经尝试过使用e.url处理If语句,但没有使用.match方法。然而,这是目前你建议的每个页面的警报,包括那些我不希望它!url字符串的确切安全格式是http://*.staging.something.com/*和https://*.staging.something.com/*抱歉,如果上述内容不清楚,我在查看我们的登台站点时会弹出警报,这应该是我唯一没有看到奇怪警报的地方。我测试了我的regexp,它看起来很好。。尝试将
detail.url
添加到警报中。啊,好吧,这样就打开了一个全新的蠕虫罐。它似乎在大约:blank时触发了两次,然后又触发了另外两个与php相关的实例。我试着把它改成webNavigation.on,虽然我的想法已经完成了,但我得到了同样的结果。你可以尝试
选项卡。重新创建
选项卡。重新更新
(你需要
“选项卡”
权限才能访问URL),这绝对是一个更好的解决方案,尽管我仔细询问了OP的要求。这个解决方案超越了:)@Xan在发布这个问题之前,OP通过电子邮件与我进行了对话,因此,这使阅读更容易。如果其他选项卡完成加载,为什么要查询当前选项卡?如前所述,我确信这不是最干净的实现,我可以访问changeInfo中的所有数据,但是当我尝试使用它实现时,我不断遇到错误,所以我只是返回到使用一些有效的方法。我的观点是,如果您通过中键单击在后台打开某个选项卡,或者刷新其他页面,您的代码将查看当前可见的选项卡-这是正确的行为吗?我不希望在页面加载期间打开任何其他选项卡或将焦点更改为其他选项卡