37

我想将 DOM 元素添加到 HTML 的 head 部分。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,然后放在头部。

//已编辑
它将是

$.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().

4

12 回答 12

74

尝试这个

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

document.head.appendChild(script);
于 2013-09-13T11:14:36.697 回答
16

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

所以这样的事情会有一个问题:(jquery.some-plugin.js 中的“jQuery is not defined”)。

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);

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

load_script("some-script.js")
.then(function() {
    /* some-script.js is done loading */
});
于 2017-10-26T18:17:57.930 回答
8

试用 ::

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

于 2015-12-15T21:33:08.170 回答
7

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

这可能会这样做:

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

向那些可能对为什么会这样工作感到困惑的人进行一些澄清: 网页中的所有代码都是文本。文本是网页中最基本的类型。浏览器简单地开始处理文本,遵循它的规则,直到它到达末尾(这包括环回、递归等)

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

于 2015-12-15T01:04:24.577 回答
4

我发现的最佳解决方案:

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);
}
于 2017-02-14T12:09:43.183 回答
3
var script = $('<script type="text/javascript">// function </script>')
document.getElementsByTagName("head")[0].appendChild(script[0])

但在这种情况下,脚本将不会被执行,并且函数将无法在全局命名空间中访问。要使用代码,<script>你需要按照你的问题做

$('head').append(script);

于 2013-09-13T11:23:29.073 回答
2

这是一个老问题,我知道它专门询问如何在头部添加一个脚本标签,但是根据 OPs 的解释,他们实际上只是打算执行一些通过其他 JS 函数获得的 JS 代码。

这比在页面中添加脚本标签要简单得多。

简单地:

eval(decoded);

Eval 会直接执行一个 JS 字符串,根本不需要将它添加到 DOM 中。

我不认为真的需要在页面加载后向 DOM 添加内联脚本标签。

更多信息在这里:http ://www.w3schools.com/jsref/jsref_eval.asp

于 2015-05-12T23:43:26.937 回答
1

我使用 PHP 作为我的服务器端语言,所以我将用它编写示例 - 但我确信您的服务器端也有一个方法。

只需让您的服务器端语言从变量中添加它。w/php 类似的东西会如下所示。

请注意,这仅在脚本与页面加载一起加载时才有效。如果您想动态加载它,此解决方案将无济于事。

PHP

HTML

<head>
    <script type="text/javascript"> <?php echo $decodedstring ?> </script>
</head>

总结:使用服务器端解码并使用服务器语言将其放入您的 HTML 中。

于 2014-11-07T04:15:31.447 回答
1

你可以这样做:

var scriptTag = document.createElement("script");
scriptTag.type = "text/javascript";
scriptTag.src = "script_source_here";
(document.getElementsByTagName("head")[0] || document.documentElement ).appendChild(scriptTag);
于 2013-09-13T11:16:00.903 回答
1
<script type="text/JavaScript">
     var script = document.createElement('SCRIPT');
    script.src = 'YOURJAVASCRIPTURL';
    document.getElementsByTagName('HEAD')[0].appendChild(script);
 </script>
于 2020-04-07T07:06:16.667 回答
1

如果你想添加一个脚本标签,里面有一些脚本,请使用

var script= document.createElement('script');
script.text = "alert('Hi!');";
document.head.appendChild(script);
于 2021-12-01T02:11:22.453 回答
1

这是一个安全且可重用的函数,用于将脚本添加到 head 部分(如果它不存在)。

在此处查看工作示例:示例

<!DOCTYPE html>
<html>
  <head>
    <base href="/"/>
    <style>
    </style>
  </head>
  <body>
    <input type="button" id="" style='width:250px;height:50px;font-size:1.5em;' value="Add Script" onClick="addScript('myscript')"/>
    <script>
      function addScript(filename)
      {
        // house-keeping: if script is allready exist do nothing
        if(document.getElementsByTagName('head')[0].innerHTML.toString().includes(filename + ".js"))
        {
          alert("script is allready exist in head tag!")
        }
        else
        {
          // add the script
          loadScript('/',filename + ".js");
        }
      }
      function loadScript(baseurl,filename)
      {
        var node = document.createElement('script');
        node.src = baseurl + filename;
        document.getElementsByTagName('head')[0].appendChild(node);
        alert("script added");
      }
    </script>
  </body>
</html>
于 2019-02-04T21:03:14.347 回答