通过AJAX加载的HTML内容按顺序加载外部JavaScript

通过AJAX加载的HTML内容按顺序加载外部JavaScript,javascript,jquery,ajax,Javascript,Jquery,Ajax,这是一个场景,不确定我错过了什么 pagea.htm对pageb.htm发出ajax请求,并将响应插入到页面中 Page B.htm包含指向其他几个JS文件的链接,其中许多文件包含一个document.ready()函数来初始化它们 当A.htm和B.htm位于同一台服务器上时,这种方法可以正常工作,但当它们位于不同的服务器上时,这种方法就不行了 我想我在这里看到的是,当页面A和B位于不同的服务器(跨域ajax)上时,外部资源将异步返回,或者至少是无序返回,因此脚本执行时希望JQuery.U

这是一个场景,不确定我错过了什么

  • pagea.htm对pageb.htm发出ajax请求,并将响应插入到页面中

  • Page B.htm包含指向其他几个JS文件的链接,其中许多文件包含一个document.ready()函数来初始化它们

当A.htm和B.htm位于同一台服务器上时,这种方法可以正常工作,但当它们位于不同的服务器上时,这种方法就不行了

我想我在这里看到的是,当页面A和B位于不同的服务器(跨域ajax)上时,外部资源将异步返回,或者至少是无序返回,因此脚本执行时希望JQuery.UI已经加载,而实际情况并非如此


感谢任何指点或建议。抱歉解释得不好。

您认为问题在于跨域处理请求的方式不同,这是正确的

这里有一个链接可以帮助您走上正确的道路:

但是,在继续之前,您必须实际重新实现您的解决方案,以检查资源是否已加载。有很多解决方案(请参见链接)

您可以设置一个计时器间隔并检查dom中的某些内容,或者另一个合理的解决方案(尽管缺乏效率)是在您的服务器上创建一个“代理”服务器端(例如php)文件,并让该文件执行跨域请求,然后输出结果


注意,由于jqueryUI是一个相当大的文件,所以可以想象跨域请求首先完成,并立即执行,即使jqueryUI尚未加载。在任何情况下,你都必须开始考虑让你的应用程序做出反应,而不是遵循一个顺序。

你正在通过jQuery注入HTML+脚本标记。在这种情况下*:

  • 在文档中注入除脚本之外的HTML内容
  • 然后一个接一个地执行所有脚本
  • 如果脚本是外部的,那么它将被下载并异步执行
因此,依赖于jQuery UI的外部或内联脚本可能在jQuery UI之前执行

一种可能的解决方案是更改页面的工作方式:

  • 去掉pageb.html中的外部脚本,但保留内联脚本
  • 在pagea.html中加载所需的脚本
  • 加载pageb.html
另一个解决方案是使用您自己的jQuery函数,它将:

  • 从HTML中删除所有
    元素
  • 按顺序下载并执行这些脚本
  • 注入剩余的HTML


*确切的行为没有记录在案。我必须仔细研究,才能推断出细节。

已经有一段时间没有使用jQuery了,但是.ajax没有回报承诺吗?能否调用.done(第二个ajax请求)以确保它们以正确的顺序返回?类似于:$.ajax().done(函数(数据){if(数据){$.ajax()})没有第二个ajax请求。至少还没有——我们需要先正确加载这些外部资源!:)好的。但是是否需要这项工作?$.ajax(一些请求)。done(函数(数据){do second task})。基本上等待返回的脚本,然后再进行其他操作?抱歉,如果我误解了这个问题。很容易误解。A.htm中没有第二个任务,它希望加载B.htm,外部脚本包含下一个任务…但它们无法启动,因为它们试图按顺序启动。$未定义,因为jquery.min.js在我的.module.js尝试使用它之前没有加载。我猜当您将JavaScript文件注入DOM中时,JavaScript文件的执行顺序无法得到保证。较小的js文件可能会在较大的js文件之前加载并执行。我会看看是否可以找到具体的引用。谢谢。看起来我手头有点乱:)我希望不会hat-JAWR将所有内容捆绑到一个文件中将有助于在某种程度上平滑事情。