0

このコードには2つの問題があります。

1は常にゼロです。追加されるべきではない$(container + ' meta[data-level="' + level + '"]').length == 0追加の呼び出しを作成するため、これを知っていますが、とにかく追加されます。create_views(1);

2 dpUniSliderは、ajax呼び出しを介して作成されたliを認識しないため、機能しません。成功メッセージに移動すると正常に機能しますが、外部関数は機能しません。問題は、それをajaxの成功の中に含めると、ループの下にあるため、何度も呼び出されることです。

//Show levels using ajax, before slider is activated

function create_views(level) {
  $.ajax({
    url: "actions.php",
    type: "GET",
    data: "show_level=" + level,
    cache: false,
    success: function (data) {
      var view = '<li data-level="' + level + '">' + data + '</li>';
      var container = ".slides_container";
      if ($(container + ' meta[data-level="' + level + '"]').length == 0) {
        $(container).append(view);
      } else { //check if element exists, if yes overwrite it.
        //$(container + ' meta[data-level="' + level + '"]').replaceWith(view);
        alert("Exists");
      }
    }
  });
}
 //Loop through all levels and display views
 //level count can be rewritten to come from DB and not be hardcoded like now
var levels = 2;
for (var i = 1; i <= levels; i++) {
  create_views(i);
} // for loop
create_views(1); //test, delete this
 //Activate slide
var unislider = $(".slides_container").dpUniSlider({
  //loop: false,
  draggable: false
});
4

3 に答える 3

1

すべて完了した後に何かを実行したい複数の並列非同期ajax呼び出しを処理する場合、カウンターを保持し、成功コールバックをチェックして、最後のajax呼び出しがいつ成功したかを確認できます。

次のようになります。

$(function() {
    var TOTAL_TASKS = 2,
        completedTasks = 0;

    function performAjaxTask(taskNumber) {
        $.ajax({
            url: url,
            type: 'GET',
            data: data,
            cache: false,
            success: function(data) {
                // Process the data

                completedTasks++;

                if (completedTasks == TOTAL_TASKS) {
                    // Perform actions that need to wait until all
                    // ajax calls have returned successfully.
                }
            }
        });
    }

    for (var i = 1; i <= TOTAL_TASKS; i++) {
        performAjaxTask(i);
    }
});
于 2013-03-25T15:55:51.957 に答える
1

jQueryの遅延オブジェクトを使用して、すべてが正常に完了した後に何かを実行したい複数の並列非同期ajax呼び出しを処理できると思います。

これを試して:

$(function() {
    var LEVELS = 2,
        $container = $('.slides_container'),
        deferreds = []; // This will hold the deferred objects.

    // This function returns a deferred object.
    function getViewAndReturnDeffered(level) {
        return $.ajax({
            url: 'actions.php',
            type: 'GET',
            data: 'show_level=' + level,
            cache: false,
            success: function(data) {
                var $currentView = $container.find('[data-level="' + level + '"]'),
                    $newView = '<li data-level="' + level + '">' + data + '</li>';
                if ($currentView.length > 0) {
                    $currentView.replaceWith($newView);
                } else
                    $container.append($newView);
                }
            }
        });
    }

    for (var i = 1; i <= LEVELS; i++) {
        // Put the deferred objects in the array.
        deferreds.push(getViewAndReturnDeffered(i));
    }

    // The function passed to `.done()` will execute when all the deferred
    // objects have completed successfully.
    $.when.apply($, deferreds).done(function() {
        var unislider = $container.dpUniSlider({
            //loop: false,
            draggable: false
        });
    });
});
于 2013-03-25T18:13:21.740 に答える
0

<meta></meta>中身はあり.containerますか?おそらくそうではありません。使用する

$(container + ' li[data-level="' + level + '"]')
于 2013-03-25T15:49:59.853 に答える