jQuery链接.load()请求?

时间:2010-09-17 14:15:05

标签: jquery ajax chaining

所以我刚刚使用jQuery的.load(),看起来我们无法将$("#example").load('./uri.ext #ID')配置成链接:

$("#example").load('./uri.ext #ID1').load('./uri.ext #ID2').load('./uri.ext #ID3')

如果我们有一个DIV的模板文件或某些东西来动态构建页面而不是将HTML存储在字符串变量中或者沿着这些行存储的东西当然会有用...另外,我们可以保留其中的几个一个档案。

理想情况下,我希望使用该命令嵌套事物:

<div id="example">
    <div id="ID1">
        <div id="ID2">
            <div id="ID3">
            </div>
        </div>
    </div>
</div>

我遇到的问题是双重的。首先,请求的async : true属性会导致下一个请求触发,并且放置不会按预期执行。然后我尝试运行嵌套的$(“#example”)。load('。/ uri.ext#ID1')。ajaxCompletes(function(){/ next .load()顺序 /最终进入一个没有结束的递归陷阱,并继续发送对这些文件的请求。

关于如何使用我尝试过的语法/方法完成我所要完成的任何想法?另外,如果这不是问题而只是对jQuery链接的误解,那么我将非常感谢对此的任何解释。

2 个答案:

答案 0 :(得分:5)

您需要将它们嵌套在回调函数中以实现此目的:

$('#example').load('./uri.ext #ID1', function() {
  $('#ID1').load('./uri.ext #ID2', function() {
    $('#ID2').load('./uri.ext #ID3', function() {
      // load successful
    });
  });
});
ES6 标准的

编辑

 $('#example').load('./uri.ext #ID1', () => {
      $('#ID1').load('./uri.ext #ID2', () => {
        $('#ID2').load('./uri.ext #ID3', () => {
          // load successful
        });
      });
    });

答案 1 :(得分:0)

提出问题和答案。

我正在使用递归调用提供稍微更优雅的解决方案,以防其他人想要构建它。请注意,这并不直接回答原始问题的上下文。这是我自己的解决方案的背景,但这个想法是一样的。

var App = App || {};

App.Quiz = (function ($) {
    "use strict";

    var _templates = [{ target: "#quiz_main_template", url: "/UserControls/Quiz/Quiz_Main.tmpl.htm" },
        { target: "#quiz_media_left_template", url: "/UserControls/Quiz/Quiz_Media_Left.tmpl.htm" },
        { target: "#quiz_media_right_template", url: "/UserControls/Quiz/Quiz_Media_Right.tmpl.htm" },
        { target: "#quiz_no_media_template", url: "/UserControls/Quiz/Quiz_No_Media.tmpl.htm" }]

    function loadTemplates(templates, callback) {
        if (templates.length) {
            var nextTemplate = templates.pop();
            $(nextTemplate.target).load(nextTemplate.url, loadTemplates(templates, callback));
        } else {
            callback.call();
        }
    }

    function init() {
        loadTemplates(_templates, function () { alert("Done!");})
    }

    return {
        init: init
    };
})(jQuery);

$(function () {
    App.Quiz.init();
});