如何将 DOM 元素脚本添加到 head 部分?

IT技术 javascript jquery html dom
2021-03-11 09:12:54

我想将 DOM 元素添加到 HTML 的头部部分。jQuery 不允许将 DOM 元素脚本添加到 head 部分,而是执行Reference

我想script<head>部分中添加标签并编写脚本

var script = '<script type="text/javascript"> //function </script>'
$('head').append(script);

像这样的功能。我试过 jQuery 和 javascript\,但它不起作用。

请告诉我如何script通过 jQuery 或 javascript添加和写入头部。

我厌倦了 javascript 来添加 DOM 元素,但它不能.innerHTML()用于写入头。我使用 jQuery 2.0.3 和 jQuery UI 1.10.3。

我想将 base64 编码的脚本添加到 head 部分。我像这样使用base64解码器js来解码javascript,然后放在head部分。

//编辑
后将是

$.getScript('base64.js');
var encoded = "YWxlcnQoImhpIik7DQo="; //More text
var decoded = decodeString(encoded);
var script = '<script type="text/javascript">' +decoded + '</script>';
$('head').append(script);

适合编码脚本和添加到一个 javascript 文件中。我想使用base64.js或其他一些用于浏览器的解码器 javascript 文件不接受atob().

6个回答

试试这个

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'url';    

document.head.appendChild(script);
document.headdocument.getElementsByTagName('head')[0].
2021-05-01 09:12:54
我想添加一个脚本而不是脚本文件。
2021-05-03 09:12:54
这非常简单但引人入胜。
2021-05-08 09:12:54

如果像这样混合本地和远程脚本文件在头部注入多个脚本标签,可能会出现依赖于外部脚本的本地脚本(例如从 googleapis 加载 jQuery)会出错的情况,因为外部脚本可能不是在本地加载之前加载。

所以这样的事情会有问题:(jquery.some-plugin.js 中的“jQuery 未定义”)。

var head = document.getElementsByTagName('head')[0];

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js";
head.appendChild(script);

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "/jquery.some-plugin.js";
head.appendChild(script);

当然,这种情况就是 .onload() 的用途,但是如果正在加载多个脚本,那可能会很麻烦。

作为对这种情况的解决方案,我将这个函数放在一起,该函数将保留一个要加载的脚本队列,在前一个完成后加载每个后续项目,并返回一个 Promise,当脚本(或队列中的最后一个脚本,如果没有参数)加载完成。

load_script = function(src) {
    // Initialize scripts queue
    if( load_script.scripts === undefined ) {
        load_script.scripts = [];
        load_script.index = -1;
        load_script.loading = false;
        load_script.next = function() {
            if( load_script.loading ) return;

            // Load the next queue item
            load_script.loading = true;
            var item = load_script.scripts[++load_script.index];
            var head = document.getElementsByTagName('head')[0];
            var script = document.createElement('script');
            script.type = 'text/javascript';
            script.src = item.src;
            // When complete, start next item in queue and resolve this item's promise
            script.onload = () => {
                load_script.loading = false;
                if( load_script.index < load_script.scripts.length - 1 ) load_script.next();
                item.resolve();
            };
            head.appendChild(script);
        };
    };

    // Adding a script to the queue
    if( src ) {
        // Check if already added
        for(var i=0; i < load_script.scripts.length; i++) {
            if( load_script.scripts[i].src == src ) return load_script.scripts[i].promise;
        }
        // Add to the queue
        var item = { src: src };
        item.promise = new Promise(resolve => {item.resolve = resolve;});
        load_script.scripts.push(item);
        load_script.next();
    }

    // Return the promise of the last queue item
    return load_script.scripts[ load_script.scripts.length - 1 ].promise;
};

通过添加脚本以确保在开始下一个之前完成前一个可以像......

["https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js",
 "/jquery.some-plugin.js",
 "/dependant-on-plugin.js",
].forEach(load_script);

或者加载脚本并在完成后使用返回 Promise 来完成工作......

load_script("some-script.js")
.then(function() {
    /* some-script.js is done loading */
});
使用 vanilla JS 时的绝佳解决方案,它不仅可以节省时间,而且比编写和解析多余的 HTML 脚本标签更干净。
2021-04-15 09:12:54
这是对整体问题的出色完整解决方案,非常感谢您的分享。我将它用作轻量级库的一部分,以在记事本++中执行 javascript 代码。
2021-04-21 09:12:54
超级解决方案,我认为应该接受答案。
2021-05-02 09:12:54
are 是一篇关于加载脚本的好文章html5rocks.com/en/tutorials/speed/script-loading
2021-05-13 09:12:54

试用 ::

var script = document.createElement("script");
script.type="text/javascript";
script.innerHTML="alert('Hi!');";
document.getElementsByTagName('head')[0].appendChild(script);

我发现的最佳解决方案:

AppendToHead('script', 'alert("hii"); ');
//or
AppendToHead('script', 'http://example.com/script.js');
//or
AppendToHead('style', '#myDiv{color:red;} ');
//or
AppendToHead('style', 'http://example.com/style.css');

function AppendToHead(elemntType, content) {
  // detect whether provided content is "link" (instead of inline codes)
  var Is_Link = content.split(/\r\n|\r|\n/).length <= 1 && content.indexOf("//") > -1 && content.indexOf(" ") <= -1;
  if (Is_Link) {
    if (elemntType == 'script') {
      var x = document.createElement('script');
      x.id = id;
      x.src = content;
      x.type = 'text/javascript';
    } else if (elemntType == 'style') {
      var x = document.createElement('link');
      x.id = id;
      x.href = content;
      x.type = 'text/css';
      x.rel = 'stylesheet';
    }
  } else {
    var x = document.createElement(elemntType);
    if (elemntType == 'script') {
      x.type = 'text/javascript';
      x.innerHTML = content;
    } else if (elemntType == 'style') {
      x.type = 'text/css';
      if (x.styleSheet) {
        x.styleSheet.cssText = content;
      } else {
        x.appendChild(document.createTextNode(content));
      }
    }
  }
  //append in head
  (document.head || document.getElementsByTagName('head')[0]).appendChild(x);
}

根据作者的说法,他们想在头部创建一个脚本,而不是脚本文件的链接。此外,为了避免 jQuery 带来的并发症(在这种情况下它几乎没有提供有用的功能),vanilla javascript 可能是更好的选择。

这可能是这样做的:

var script = document.createTextNode("<script>alert('Hi!');</script>");   
document.getElementsByTagName('head')[0].appendChild(script);

向那些可能对其工作原理感到困惑的人进行一些澄清: 网页中的所有代码都是文本。文本是网页中最基本的类型。浏览器只是按照它的规则开始处理文本,直到它到达结束(这包括环回、递归等)

为此,制作此标签的脚本必须在标题中。浏览器在处理时,将在到达标题末尾之前命中此代码,将您想要的脚本附加到标题上,然后在继续处理时到达它。如果您有一个可靠的结束页脚,您可以将 'head' 更改为 'footer' 或类似的,但考虑到具有脚本的站点中最可靠的是页眉标签的存在,这使其成为在这种情况下最有用的选项.

这个只是在标题中添加文本,而不是脚本标签
2021-04-29 09:12:54
创建文本节点?!这只会将您的文本添加到头部,而不会创建脚本标记。
2021-04-30 09:12:54
@LongNguyen 我只能假设当你测试它时,你"<script>alert('Hi!');</script>"用你想要的任何东西替换不要那样做。ONLY 替换alert('Hi!');为您想要的脚本,或者您在正文中运行脚本。问题是,整个网站“仅仅是”文本。脚本标签文本。如果它在浏览器通过标头完成处理之前运行,则会触发警报如果您只是想要一个脚本那里稍后调用,它会起作用。
2021-05-07 09:12:54
@lilHar 不,我保留了您写的所有内容,没有替换任何内容。
2021-05-08 09:12:54
脚本文本。请注意我的示例中的开头“<script>”和结尾“</script>”。
2021-05-13 09:12:54