Javascript jQuery没有在ajax请求的脚本标记中加载js文件

Javascript jQuery没有在ajax请求的脚本标记中加载js文件,javascript,jquery,html,css,ajax,Javascript,Jquery,Html,Css,Ajax,我有一个ajax POST请求,这个请求附带了html,带有引用外部js文件的标记,当我在DOM中插入这个html时,js没有加载,我做错了什么?我记得在加载外部script1和script2时没有遇到问题 请求: $.ajax({ type: 'POST', dataType: 'xml/html', cache: false, url: "/html/with/scripttags", data: {somedata:'value'}, suc

我有一个ajax POST请求,这个请求附带了html,带有引用外部js文件的
标记,当我在DOM中插入这个html时,js没有加载,我做错了什么?我记得在加载外部script1和script2时没有遇到问题

请求:

$.ajax({
    type: 'POST',
    dataType: 'xml/html',
    cache: false,
    url: "/html/with/scripttags",
    data: {somedata:'value'},
    success: function(data) {
      $('body').append(data)
    }
  });
加载的内容:

<link rel="stylesheet" media="all" href="http://domain.com/application.css" />
<script src='http://domain.com/script.js' type='text/javascript'></script>
<script src='http://domain.com/script2.js' type='text/javascript'></script>
<script type='text/javascript'>alert('executed')</script>
<div>BLAALBLABLAB</div>

警报('已执行')
废话废话

但是,脚本标记中的警报执行时没有问题,并且
应用程序.css
外部文件加载时没有问题。看起来jQuery没有加载文件,我还检查了网络选项卡。

这是jQuery的正常行为,如果您想包含脚本,需要解析html并手动添加它们

坏消息:你甚至不能用
$()
选择字符串中的
script
标记

我没有对此进行测试,但这个快速而肮脏的示例应该可以工作:

function createGetScriptCallback(url) {
  return function () {
    return $.getScript(url);
  }
}
$.ajax({
  type: 'POST',
  dataType: 'xml/html',
  cache: false,
  url: "/html/with/scripttags",
  data: {
    somedata: 'value'
  },
  success: function (data) {
    var parser, doc, scriptsEl, callbacks;
    parser = new DomParser();
    doc = parser.parseFromString(data, "text/html")
    scriptsEl = doc.querySelectorAll("script[src]");
    callbacks = []
    for (var i = 0; i < scriptsEl.length; i++) {
      callbacks.push(createGetScriptCallback(scriptsEl[i].getAttribute("src")));
    }
    $.when.apply($, callbacks)
      .fail(function (xhr, status, err) {
        console.error(status, err);
      });
    $('body').append(data);
  }
});
函数createGetScriptCallback(url){ 返回函数(){ 返回$.getScript(url); } } $.ajax({ 键入:“POST”, 数据类型:“xml/html”, cache:false, url:“/html/with/scripttags”, 数据:{ 一些数据:“值” }, 成功:功能(数据){ var解析器、doc、scriptsEl、回调; parser=新的DomParser(); doc=parser.parseFromString(数据,“text/html”) scriptsEl=doc.queryselectoral(“script[src]”); 回调=[] 对于(变量i=0;i 但是您不应该依赖html来加载脚本


编辑:更少脏代码(受@guest271314的答案启发)

最简单的方法是删除

<script src='http://domain.com/script.js' type='text/javascript'></script>
<script src='http://domain.com/script2.js' type='text/javascript'></script>
$.ajax()
success

另请参见
dataType

多个空格分隔的值:从jQuery 1.5开始,jQuery可以转换 从内容类型标头中接收到的数据类型到 你需要。例如,如果希望将文本响应视为 XML,使用“文本XML”作为数据类型。您还可以创建一个JSONP 请求,将其作为文本接收,并由jQuery解释为XML: “jsonp文本xml”。类似地,一个速记字符串,如“jsonp xml” 将首先尝试从jsonp转换为xml,如果失败, 从jsonp转换为文本,然后从文本转换为xml


“xml/html”
不是有效的MIME类型,也不是数据类型的预期参数,这是我的猜测,但数据类型可能应该是“script”。此外,如果我正确理解了问题,这个jQuery方法也会很有帮助。还有,看看类似的问题。不,这很正常behaviour@Korgrue否。OP正在尝试加载单个HTML块。获取内容是异步的与此无关,因为失败发生在ajax调用完成后。只是想知道:您如何验证external script.js是否未加载?…您是否尝试加载一些测试页面?”我还检查了网络选项卡“are
script.js
”,
script2.js
request?注意,OP说jquery正在运行内联脚本内容。我自己也经历过,我想你可能是对的;我知道jQuery必须显式地安排运行内联脚本。这方面的代码(在jQuery中)非常复杂。是的,我认为库在构建文档片段之前会去掉
标记。
$.when($.getScript('http://domain.com/script.js')
      , $.getScript('http://domain.com/script2.js'))
.fail(function(jqxhr, textStatus, errorThrown) {
  console.log(textStatus, errorThrown)
})