如何在页面加载后通过jQuery动态插入<script>标记?

Dou*_*oug 95 javascript jquery script-tag javascript-injection

我在解决这个问题上遇到了问题.我首先尝试将脚本标记设置为字符串,然后使用jquery replaceWith()在页面加载后将它们添加到文档中:

var a = '<script type="text/javascript">some script here</script>';
$('#someelement').replaceWith(a);
Run Code Online (Sandbox Code Playgroud)

但是我在那个var上得到了字符串文字错误.然后我尝试编码字符串,如:

var a = '&left;script type="text/javascript"&gt;some script here&lt;\/script&gt;';
Run Code Online (Sandbox Code Playgroud)

但发送它replaceWith()只是将该字符串输出到浏览器.

有人可以告诉我你如何<script>在页面加载后动态地将标签添加到浏览器中,理想情况下通过jQuery?

Roc*_*mat 99

您可以将脚本放入单独的文件中,然后使用$.getScript它来加载和运行它.

例:

$.getScript("test.js", function(){
    alert("Running test.js");
});
Run Code Online (Sandbox Code Playgroud)

  • 由于@hippietrail的答案将以4个赞成票吸引最多的关注,因此应该明确表明他是不正确的.正如jQuery文档在他们的`$ .ajax`中所强调的那样:"脚本和JSONP请求不受相同的原始策略限制." [源(http://api.jquery.com/jQuery.ajax/).换句话说,**`$ .getScript`可以从其他域中提取.js文件,而不仅仅是你自己的**. (39认同)
  • @hippietrail这实际上不是真的.它只是插入一个普通的ol'脚本标签,它不需要CORS或同域.我使用它来缩短加载Google Analytics的代码,例如,它加载得很好.事实上,在幕后实际运行的jquery代码与GA代码段非常相似. (14认同)
  • 但是使用`$ .getScript()`脚本需要在同一个域上,或者远程域和浏览器都需要支持`CORS`. (6认同)
  • 谢谢,但是那会坚持到DOM吗?我意识到我遗漏了重要信息,我需要将script标签插入DOM中进行评估,这时它将返回第三方广告代码,以在特定&lt;div&gt;中显示在我们的网站上。 (2认同)

Bas*_*sem 63

请尝试以下方法:

<script type="text/javascript">
// Use any event to append the code
$(document).ready(function() 
{
    var s = document.createElement("script");
    s.type = "text/javascript";
    s.src = "http://scriptlocation/das.js";
    // Use any selector
    $("head").append(s);
});
Run Code Online (Sandbox Code Playgroud)

http://api.jquery.com/append

  • +1使用`append`添加脚本.附加导致甚至内联脚本立即评估(正是我需要的).谢谢 (4认同)

jco*_*and 32

以下是使用现代(2014)JQuery进行此操作的正确方法:

$(function () {
  $('<script>')
    .attr('type', 'text/javascript')
    .text('some script here')
    .appendTo('head');
})
Run Code Online (Sandbox Code Playgroud)

或者如果你真的想要替换你可以做的div:

$(function () {
  $('<script>')
    .attr('type', 'text/javascript')
    .text('some script here')
    .replaceAll('#someelement');
});
Run Code Online (Sandbox Code Playgroud)

  • 或者改为.text('some script here')你可以写.attr('src','path_to_your_js_file') (3认同)

ima*_*man 10

一种更简单的方法是:

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

您也可以使用此表单加载css.

  • 您可能希望避免在源代码中放置字符串`</ script>`,因为它可能会导致解析问题:http://stackoverflow.com/questions/236073/why-split-the-script-tag-when-writing -IT-与文档写 (5认同)
  • 逃避最后一个`/`为我做了诀窍:`$('head').append('<script src ="your.js"> <\/script>'); (2认同)

ddl*_*lab 5

这个答案在技术上与jcoffland回答的相似或相同.我刚刚添加了一个查询来检测脚本是否已经存在.我需要这个,因为我在一个内部网站上工作,有几个模块,其中一些是共享脚本或自带,但这些脚本不需要每次都加载.我在生产环境中使用这个片段超过一年,它就像一个魅力.评论自己:是的我知道,问一个函数是否存在会更正确... :-)

if (!$('head > script[src="js/jquery.searchable.min.js"]').length) {
    $('head').append($('<script />').attr('src','js/jquery.searchable.min.js'));
}
Run Code Online (Sandbox Code Playgroud)


Gag*_*gik 5

这是一种更清晰的方法 \xe2\x80\x94 不需要 jQuery \xe2\x80\x94 它将脚本添加为 的最后一个子元素<body>

\n
document.body.innerHTML +=\'<script src="mycdn.js"><\\/script>\'\n
Run Code Online (Sandbox Code Playgroud)\n

但如果您想添加加载脚本,请使用Rocket Hazmat 的方法

\n
\n

注意:它将取消声明的事件监听器。

\n
\n