通过内容脚本将JavaScript注入XML文件

时间:2018-11-11 10:35:15

标签: javascript xml google-chrome-extension firefox-addon firefox-webextensions

我知道xml中实际上不应该包含javascript,但我正在开发一个浏览器扩展程序,该扩展程序需要在每个页面上注入一些代码才能为用户提供一些有趣的统计信息。

问题是,我无法将注入的代码在XML文档中运行,因为看起来好像我创建的脚本标签被视为文本一样?

相同的代码在HTML中效果很好

这就是我所拥有的:

manifest.json

"content_scripts": [
    {
      "matches": ["<all_urls>"],
        "all_frames": true,
        "match_about_blank": true,
        "run_at": "document_start",
        "js": ["scripts/content/countCalls.js"]
    }
  ]

countCalls.js

let injectedCode = 'console.log("Hello from injected code");';
let script = document.createElement('script');
script.appendChild(document.createTextNode(injectedCode));

let parent = document.head || document.body || document.documentElement;
let firstChild = (parent.childNodes && (parent.childNodes.length > 0)) ? parent.childNodes[0] : null;
if (firstChild) {
  parent.insertBefore(script, firstChild);
} else {
  parent.appendChild(script);
}

test.xml

<?xml version="1.0"?>
<main xmlns='http://www.w3.org/1999/xhtml'>
<script>
console.log("Hello from XML");
</script>
</main>

当我在浏览器中加载test.xml时,我看到以下内容:

  

console.log(“您好,注入的代码”);

在控制台中,我只看到以下内容:

  

您好,来自XML

因此,注入的代码被视为文本。反正这吗?否则,有意向xml中添加javascript会导致其绕过扩展名

1 个答案:

答案 0 :(得分:2)

只需使用兼容XML的命名空间创建脚本DOM元素:

let script = document.createElementNS('http://www.w3.org/1999/xhtml', 'script');