2010-09-17 2 views
2

Так что я работал с JQuery-х .load() только сейчас и, похоже, мы не можем настроить $("#example").load('./uri.ext #ID') к цепи, как, например:jQuery chaining .load() запросы?

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

Что, конечно, было бы полезно, если бы мы имели шаблон файла DIVs или что-то, чтобы динамически строить страницу, а не хранить 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, объяснение я был бы очень благодарен за любое объяснение этому.

+0

Я не совсем уверен, что вы пытаетесь достичь этим. Если вы просто вложили кучу пустых divs, вы можете просто передать массив с ajax и сделать некоторые .append() вызовы – dave

+0

@ dave divs - примеры вложенности, я не пытаюсь вложить кучу пустых дивы. Дивы могут быть таблицей или содержать форму ввода или текстовые абзацы ... В концепции у меня бы был файл template.html, где я запрашиваю эти элементы, а не что-то вроде 'var str = '

Lorem Ipsum
' ' – Incognito

ответ

4

Вы должны были бы вкладывать их в функции обратного вызова для достижения этой цели:

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

EDIT для ES6 стандартов:

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

Любое понимание того, почему происходят другие действия? – Incognito

+1

Как вы его настраивали раньше, все ваши вызовы связывались с объектом $ ("# example"). Вот как работает цепочка с jquery, цель всегда одна и та же; это мы не обновляем, чтобы наследовать любой результат, полученный вами из предыдущего. – dave

+0

Нельзя ли использовать .ready()? –

0

Upvoted вопрос и ответ.

Я предоставляю немного более элегантное решение, используя рекурсивный вызов, если другие хотят его построить. Обратите внимание, что это напрямую не отвечает контексту исходного вопроса. Это в контексте моего собственного решения, но идея такая же.

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(); 
}); 
Смежные вопросы