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

joh*_*825 15 html javascript jquery dom

我想将DOM元素添加到HTML的head部分.jQuery不允许将DOM元素脚本添加到head部分,而是执行它们,参考.

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

var script = '<script type="text/javascript"> //function </script>'
$('head').append(script);
Run Code Online (Sandbox Code Playgroud)

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

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

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

我想将base64编码脚本添加到head部分.我使用的base64解码器JS喜欢这个解码JavaScript,然后戴上头部分.

//编辑
它会

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

使编码脚本和添加在一个JavaScript文件中.我想使用base64.js或其他一些解码器javascript文件供浏览器不接受atob().

pba*_*ris 38

试试这个

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

document.getElementsByTagName('head')[0].appendChild(script);
Run Code Online (Sandbox Code Playgroud)

  • [`document.head`](https://developer.mozilla.org/en-US/docs/Web/API/Document/head)比`document.getElementsByTagName('head')[0]`更好. (8认同)
  • 我想添加一个脚本而不是脚本文件。 (3认同)

Nic*_*ook 11

如果使用本地和远程脚本文件的混合在头部中注入多个脚本标记,则可能出现这样的情况,即依赖于外部脚本的本地脚本(例如从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);
Run Code Online (Sandbox Code Playgroud)

当然这种情况是.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;
};
Run Code Online (Sandbox Code Playgroud)

通过这个添加脚本,以确保先前完成之前完成下一个可以完成像...

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

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

load_script("some-script.js")
.then(function() {
    /* some-script.js is done loading */
});
Run Code Online (Sandbox Code Playgroud)


小智 7

试用 ::

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


lil*_*shu 5

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

这可能是这样做的:

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


T.T*_*dua 5

我找到的最佳解决方案:

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);
}
Run Code Online (Sandbox Code Playgroud)