【问题标题】:how to inject script into document <head> without jquery如何在没有 jquery 的情况下将脚本注入文档 <head>
【发布时间】:2016-07-14 00:34:02
【问题描述】:

我正在构建一个浏览器扩展程序,我在 &lt;script&gt; 标记内有一个函数,可以修改我需要注入到任何给定网页的 &lt;head&gt; 的 DOM。整个函数是一个字符串("&lt;script&gt;function content blah blah&lt;/script&gt;")。我正在使用 jquery 来实现这一点:

$('head').prepend(modFunction);

这很好用。出于几个原因,我想删除 jQuery,但是当我尝试创建一个 &lt;script&gt; 元素以使用 vanilla javascript 注入 &lt;head&gt; 时,一切都失败了。到目前为止,我已经尝试了两种方法:

1.

  var headSelector = document.querySelector('head');
  var el = document.createElement('div');
  el.innerHTML = modFunction;
  modFunction = el.firstChild;
  headSelector.insertBefore(modFunction, headSelector.firstChild);

2.document.head.insertAdjacentHTML('afterbegin', modFunction);

两次 javascript 尝试都将具有正确功能的 &lt;script&gt; 标记注入到 &lt;head&gt; 中,但是都没有执行该函数。不知道为什么 jQuery 可以工作,而 vanilla javascript 不能。任何帮助将不胜感激。谢谢

【问题讨论】:

  • 如果你是动态插入脚本,你插入的位置真的无关紧要。你最好还是坚持身体。
  • 从上面的源代码看来,您正在尝试插入 div 而不是 script 标记..
  • document.getElementsByTagName('script')[0].parentNode.insertBefore(document.createElement('script'), document.getElementsByTagName('script')[0]); 这只有在您有一个现有的脚本标签时才有效,我假设您会这样做,因为您希望它在页面加载时运行

标签: javascript jquery html dom google-chrome-extension


【解决方案1】:

你有一些错误。

  1. 如果您的modFunction 是一个在其前后包含&lt;script&gt; 标签的字符串,您的代码将不起作用,因为更改divinnerHTML 将不会执行添加的脚本。

  2. 使用insertAdjacentHTML 函数是不必要的,因为modFunction 现在是Text 类型的对象,它将在您的脚本之前插入[object Text] 字符串。

  3. 改为使用appendChild 函数将新的脚本元素正确插入头部。

虽然@Jantho1990 说最好从文件中加载脚本,但许多浏览器使用缓存,所以如果您更改脚本源,它不会在浏览器中始终可见。

var scriptSource = '//YourScriptSource.....';
var scriptElem = document.createElement('script');
scriptElem.text = scriptSource;
document.head.appendChild(scriptElem);

【讨论】:

  • @duskwuff。不,它绝对有效。在投票之前尝试执行它。
【解决方案2】:

SoftwareEngineer171 的回答有效(参见https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script 中的文字),但我想指出几点:

  1. 您不应该将&lt;div&gt; 元素注入&lt;head&gt;。这是无效的 HTML,通常是不好的做法。

  2. 通常,最好将 JavaScript 作为文件存储在服务器上,并使用 src 属性将该文件放到页面上。这不仅更安全,还可以在您需要返回并更新代码时为您节省大量工作。

我会推荐以下解决方案:

你的JavaScriptFile.js

    function content blah blah

内联:

    <script type="text/javascript" src="yourJavaScriptFile.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2019-12-27
    • 1970-01-01
    • 2012-11-26
    • 2021-01-21
    • 2017-07-18
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多