Javascript 区分webRequest.onBeforeRequest原始页面与注入页面

Javascript 区分webRequest.onBeforeRequest原始页面与注入页面,javascript,firefox-addon-webextensions,Javascript,Firefox Addon Webextensions,我正在后台脚本中使用webRequest.onBeforeRequest。然后,在注入到原始页面的内容(?)脚本中,我向页面发出请求的URL发出AJAX请求,我正在检测该URL,因此它自然开始循环,很快就会挂起浏览器 作为一种临时措施,我在AJAX调用中的URL末尾添加了另一个参数(&me=1),并制作了一个URL过滤器,该过滤器的结尾与原始URL的结尾类似,但这似乎不是最好的方法,因为原始URL在将来可能会更改 有什么更好的方法?例如,我查看了侦听器返回的requestDetails。但是,由

我正在后台脚本中使用
webRequest.onBeforeRequest
。然后,在注入到原始页面的内容(?)脚本中,我向页面发出请求的URL发出AJAX请求,我正在检测该URL,因此它自然开始循环,很快就会挂起浏览器

作为一种临时措施,我在AJAX调用中的URL末尾添加了另一个参数(&me=1),并制作了一个
URL
过滤器,该过滤器的结尾与原始URL的结尾类似,但这似乎不是最好的方法,因为原始URL在将来可能会更改

有什么更好的方法?例如,我查看了侦听器返回的
requestDetails
。但是,由于脚本是在原始页面中注入的,所以我找不到任何区别。或者,我可以制作一个
URL
过滤器,它只接受不以“&me=1”结尾的URL

(我不能(不会)使用flag变量,因为页面会不断地动态变化,这似乎不是最好的方法,即使我可以让它以某种方式工作(我没有)

当然,或者,我可以只使用原始请求提供的数据,但我无法使用将执行此操作的事件/对象,但可能不知何故我错过了它,因为我几乎是web扩展的初学者

编辑:

manifest.json

{
  "manifest_version": 2,
  "name": "testtube",
  "version": "1.0",
  "permissions": [
    "webRequest",
    "https://*/*",
    "activeTab"
  ],
  "web_accessible_resources": [
    "https://www.youtube.com/player_api",
    "index.html",
    "js/jquery-3.2.1.min.js",
    "js/player.js",
    "js/jquery-ui.min.js",
    "css/jquery-ui.css", "css/style.css"
  ],
  "content_scripts": [
    {
      "matches": [ "https://www.youtube.com/watch*"],
      "css": [ "css/jquery.dataTables.min.css", "css/jquery-ui.css", "css/style.css" ],
      "js": [ "js/jquery-3.2.1.min.js","js/jquery-ui.min.js",  "js/main.js" ]
    }
  ]
  ,"background": {
    "scripts": ["js/background.js" ]
  }

}
background.js

"use strict";

var lastRequestId = 0;

function logURL(requestDetails) {

    console.log("requestDetails: ", requestDetails);
//this is actually a solution as per my answer below
    if ((lastRequestId != requestDetails.requestId) && (requestDetails.url.indexOf("&me=1") == -1))
    {
        browser.tabs.sendMessage(requestDetails.tabId, { ccurl: requestDetails.url }).then(response => {
            console.log("Message from the content script:");
            console.log(response.response);
        }).catch(onError);;

    }
}

browser.webRequest.onBeforeRequest.removeListener(logURL);
browser.webRequest.onBeforeRequest.addListener(
  logURL,
  { urls: ["*://www.youtube.com/api/somepattern*"] }
);

function onError(error) {
    console.error(`Error: ${error}`);
}
main.js

"use strict";
var jq;

jq = document.createElement('script');
jq.onload = function () { };
jq.src = chrome.extension.getURL("/js/jquery-3.2.1.min.js");
document.querySelector('head').appendChild(jq);

jq = document.createElement('script');
jq.onload = function () { };
jq.src = chrome.extension.getURL("/js/jquery-ui.min.js");
document.querySelector('head').appendChild(jq);

/*... some other scripts... */

var s = document.createElement('script');
s.src = chrome.extension.getURL('/js/player.js');
s.onload = function () {
    this.remove();
};
(document.head || document.documentElement).appendChild(s);

var _url = "";


function UURL(request, sender, sendResponse) {

    _url = request.url;

    var loadR = " loadRequest('" + _url.toString() + "'); ";

    var script = document.createElement('script');
    script.textContent = loadR;

    document.querySelector('head').appendChild(script);

    return Promise.resolve({ response: "Hi from content script" });
}


$(function () {

    console.log("jquery loaded");

    browser.runtime.onMessage.removeListener(UURL)
    browser.runtime.onMessage.addListener(UURL);

    /* irrelevant code here... */

});
player.js

var loadRequest = function loadRequest(_url) {
_url = _url + "&me=1";

$.ajax({
    type: "get",
    url: _url,
    dataType: "xml",
    success: function (data) {
        /* irrelevant code here */

好的,“临时措施”的改进版本是,在侦听器中,我针对请求的url添加了另一个条件

(requestDetails.url.indexOf("&me=1") == -1)

然后打我的ajax电话。。。在请求的
url
过滤器中,我只在最后留下asterix(*)。通过这种方式,不管原始url是否在最后更改,都可以捕获额外的请求。。如果没有其他人回复,这就足够了。

好的,“临时措施”的改进版本是,在侦听器中,我针对请求的url添加了另一个条件

(requestDetails.url.indexOf("&me=1") == -1)
然后打我的ajax电话。。。在请求的
url
过滤器中,我只在最后留下asterix(*)。通过这种方式,不管原始url是否在最后更改,都可以捕获额外的请求。。如果没有其他人回复,就足够了。

如果您试图区分主页加载和
XMLHttpRequest
1 有多种方法可以区分不同类型的请求。如果没有实际的代码来尝试,我们必须猜测您实际在做什么

正常页面加载的示例如下所示:

webRequest.onBeforeRequest->arg[0]={“frameId”:0,“方法”:“GET”,“parentFrameId”:-1,“requestId”:“260870”,“tabId”:411,“时间戳”:150040123979.044,“类型”:“main_frame”,“url”:http://www.example.com/"}
-----------------------------------------------------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^
如您所见,该对象包含一个
类型
属性,该属性是一个。对于主框架的HTML加载,它将包含
“main_frame”
详细信息
对象也将包含
“frameId”:0,“parentFrameId:-1

对于AJAX请求,
type
属性的值应该是
xmlhttprequest
。然而,您所说的“ajax请求”有可能是指除请求之外的其他内容。在这种情况下,
type
属性可能有一些其他值,但它不应该是
“main\u frame”


一,。我对问题的原版理解与okkko的意图不同。如目前所述,这不包括他们感兴趣的案例。但是,它可能对阅读此问题/答案的其他人有一定的价值,因此我将其保留。

如果您试图区分主页加载和
XMLHttpRequest
1 有多种方法可以区分不同类型的请求。如果没有实际的代码来尝试,我们必须猜测您实际在做什么

正常页面加载的示例如下所示:

webRequest.onBeforeRequest->arg[0]={“frameId”:0,“方法”:“GET”,“parentFrameId”:-1,“requestId”:“260870”,“tabId”:411,“时间戳”:150040123979.044,“类型”:“main_frame”,“url”:http://www.example.com/"}
-----------------------------------------------------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^
如您所见,该对象包含一个
类型
属性,该属性是一个。对于主框架的HTML加载,它将包含
“main_frame”
详细信息
对象也将包含
“frameId”:0,“parentFrameId:-1

对于AJAX请求,
type
属性的值应该是
xmlhttprequest
。然而,您所说的“ajax请求”有可能是指除请求之外的其他内容。在这种情况下,
type
属性可能有一些其他值,但它不应该是
“main\u frame”



一,。我对问题的原版理解与okkko的意图不同。如目前所述,这不包括他们感兴趣的案例。但是,它可能对阅读此问题/答案的其他人有一些价值,因此我将其保留。

请将问题放在主题上:包括重复问题的问题。对于Chrome扩展或Firefox WebExtensions,这几乎总是意味着包括manifest.json和一些背景、内容和/或弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码没有按我想要的方式工作?”)必须包括:(1)所需的行为,(2)特定的问题或错误,(3)在问题本身中重现它所需的最短代码。请参阅:,和。我通常会尝试提供一些代码,但在本cas中