【问题标题】:Loading html into page element (chrome extension)将 html 加载到页面元素中(chrome 扩展)
【发布时间】:2011-08-04 08:04:09
【问题描述】:

我正在尝试编写一个 Chrome 扩展程序,该扩展程序将在某些网页的顶部有一个栏。如果我有这样的内容脚本:

$('body').prepend('<div id="topbar"><h1>test</h1></div>');

一切看起来都不错,但我最终想要的是这样的:

$('body').prepend('<div id="topbar"></div>');
$('#topbar').load('topbar.html');

topbar.html 在哪里:

<h1>test</h1>

但是,当我将其更改为此时,网页被破坏了。大部分内容都消失了,我最终只看到了一些广告。我什至看不到“测试”标题。我已经检查以确保页面上没有其他“顶部栏”ID。怎么了?

【问题讨论】:

  • topbar.html 在哪里? Chrome 扩展程序还是网页端?
  • 它在 chrome 扩展的目录中
  • 好吧,.load 使用 AJAX 将文件加载到元素中,我很确定您无法通过 AJAX 本地 chrome 文件加载。
  • 我只是使用了看起来几乎与此相同的代码。我将 "web_accessible_resources": [...] 添加到我的 manifest.json 文件中,它运行良好..

标签: javascript jquery dom google-chrome-extension


【解决方案1】:

扩展文件夹中文件的 URL 具有以下格式:

chrome-extension://<ID>/topbar.html

你可以通过运行得到这个路径:

chrome.extension.getURL("topbar.html")

现在如果你尝试这样做:

$('#topbar').load(chrome.extension.getURL("topbar.html"));

由于跨域政策,它不会让你这样做。后台页面没有此限制,因此您需要在此处加载 HTML 并将结果传递给内容脚本:

content_script.js

chrome.extension.sendRequest({cmd: "read_file"}, function(html){
    $("#topbar").html(html);
});

background.html

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.cmd == "read_file") {
        $.ajax({
            url: chrome.extension.getURL("topbar.html"),
            dataType: "html",
            success: sendResponse
        });
    }
})

在现实世界中,您可能只会阅读一次 topbar.html,然后重复使用它。

【讨论】:

  • $.get(chrome.extension.getURL("topbar.html"), function(topbarContent){ ... }, 'html'); bit 对我来说很好 - 我在控制台中没有看到任何跨域错误。
  • 应该在清单中指定web_accessible_resources。见:developer.chrome.com/extensions/…
  • 你确定@VladIliescu...?我的意思是……你是把它当作 html 还是某个对象?
  • 请注意,getURL() 方法现已弃用。根据Browser support for Javascript APIs,“非标准。预计跨浏览器支持不佳”
【解决方案2】:

虽然上述解决方案确实有效,但需要注意的一点是,您需要从事件处理程序中返回 true,以便在 $.ajax 调用成功后通信端口仍然可用。

更多信息见下文。 https://code.google.com/p/chromium/issues/detail?id=307034

【讨论】:

  • 如果您想扩展其他人的答案,最好在他们的答案上留下评论,而不是再做第二个。
【解决方案3】:

纯js解决方案。

在你的manifest.json:

{
  "manifest_version": 3,
  # [...]
  "web_accessible_resources": [{
      "matches": ["<all_urls>"],
      "resources": ["topbar.html"]
  }]
}

在你的content.js:

async function load_toolbar() {
  let newElement = new DOMParser().parseFromString('<div id="toolbar"></div>', 'text/html').body.childNodes[0];
  let toolbar_url = chrome.runtime.getURL("toolbar.html");

  document.querySelector("body").appendChild(newElement);
  document.getElementById("toolbar").innerHTML = await (await fetch(toolbar_url)).text();
}

load_toolbar();

【讨论】:

    【解决方案4】:

    仅供参考,现在在 2020 年,chrome.extension.onRequest 已被弃用,并在加载扩展程序时导致错误。 相反,应该使用 chrome.runtime.sendMessage。 对于 content.js,代码现在为:

    chrome.runtime.sendMessage({cmd: "read_file"}, function(html){
        $("#topbar").html(html);
    });
    

    对于 background.js,代码现在是:

    chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
        if(request.cmd == "read_file") {
            $.ajax({
                url: chrome.extension.getURL("topbar.html"),
                dataType: "html",
                success: sendResponse
            });
           return true;
        }
    })
    

    一定要注意 ajax 之后的“返回 true”,这让我很不爽

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2012-01-21
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多