javascript - 如何在每个页面请求时发送 ajax 调用,并使用 ajax 调用的结果对 DOM 进行更改?

标签 javascript ajax google-chrome google-chrome-extension

我正在开发一个 chrome 扩展程序,每次用户在浏览器中加载新网址时,该扩展程序都会进行 ajax 调用。当 ajax 调用的结果传入时,我想使用 ajax 调用的结果对 DOM 进行更改。我对 chrome 扩展开发还很陌生,但从我读到的内容来看,最好在后台脚本中进行 ajax 调用,然后将结果发送到可以修改 DOM 的内容脚本。

我能够进行ajax调用并在background.js中获取结果,但是当我尝试将其发送到popup.js时,我没有收到我需要的数据警报,因此我可以修改DOM。

我有:

background.js

chrome.webRequest.onBeforeRequest.addListener(
  process,
  {urls: ["*://www.example.com/*"]},
);

function process(details){ 
  var xhr;
  xhr = new XMLHttpRequest();
  xhr.open("GET", "https://example2.com/", true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      return myCallback(xhr.responseText);
    }
  };
  xhr.send();

  chrome.webRequest.onBeforeRequest.removeListener(getDeals);
  return
}

function myCallback(resp){
  chrome.runtime.sendMessage({
    data: resp
  });
}

popup.js

chrome.runtime.onMessage.addListener(
  function(data) {
    alert(data);
  }
);

manifest.json

{
  "manifest_version": 2,
  "name": "My program",
  "description": "my description",
  "version": "1.0",

  "icons": {"16": "daisy_16.png",
           "48": "daisy_48.png",
          "128": "daisy_128.png"},
  "permissions": [
    "background", "webRequest","webRequestBlocking", "webNavigation", "tabs", "https://example2.com/*", "declarativeContent", "storage", "<all_urls>"
  ],
  "externally_connectable": {
    "matches": ["*://*.example2.com/*"]
  },
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "content_scripts": [{
    "matches": ["http://*/*", "https://*/*"],
    "js": ["jquery-3.4.1.min.js", "popup.js"],
    "run_at": "document_end"
  }]
}

最佳答案

要向选项卡发送消息,您需要 chrome.tabs.sendMessage带有 tabIdframeId,所以让我们将 details 传递给 myCallback 并在内部使用它:

chrome.webRequest.onBeforeRequest.addListener(
  process,
  {urls: ['*://www.example.com/*']},
);

function process(details) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://example2.com/');
  xhr.onload = () => myCallback(xhr.responseText, details);
  xhr.send();
}

function myCallback(data, {tabId, frameId}) {
  chrome.tabs.sendMessage(tabId, {data}, {frameId});
}

此代码假设您在每个 iframe 中运行内容脚本,而不仅仅是在主页中:

 "content_scripts": [{
    ...........
    "all_frames": "true"
  }]

否则使用0仅发送到主页的内容脚本:

function myCallback(data, {tabId}) {
  chrome.tabs.sendMessage(tabId, {data}, {frameId: 0});
}

关于javascript - 如何在每个页面请求时发送 ajax 调用,并使用 ajax 调用的结果对 DOM 进行更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59419303/

相关文章:

javascript - 我将如何为每个字符串分配不同的颜色?

javascript every - 自动检测(键,值)中val的名称

javascript - 使用javascript和ajax更改3个div的内容

node.js - Heroku Node.js 示例 facebook 应用程序无法在 Google Chrome 中运行

html - Firefox Mobile 放大页面

javascript - 缓冲/忽略事件,直到不活动期间,然后仅触发最后一个事件

javascript - 在javascript跨浏览器中过滤数组

javascript - Ajax 请求是否保证发送 cookie?

java - Spring 3.0 MVC Ajax 示例

javascript - 制作 Chrome 扩展程序以下载(而不是查看)链接并使用自定义文件名