在同一个函数中从ajax中的ajax中再次调用函数?

时间:2012-10-02 15:40:24

标签: jquery ajax

对于令人困惑的标题感到抱歉,但我找不到更好的解释方法..

情况如下:

在函数概述()中,我使用AJAX调用以及动态html来获取数据。 在AJAX成功回调中,我对新的html执行某些处理程序。 在其中一个处理程序中,我正在发布另一个AJAX调用。

现在,这是我的问题:我想在第二个AJAX成功回调中重新加载第一个AJAX调用,以获取我的更新数据。我该怎么做?

由于

编辑:根据要求,这是我的代码(简化)

function overview() {
    var dataString = '...';
    $.ajax({
        type: 'POST',
        url: 'get-data.php?',
        cache: false,
        data: dataString,
        success: function(data) {
            $('table.table-overview tr.table-heading').after(data);

            $('tr.new-tr span.status').click(function() {
                var dataString = '...';
                $.ajax({
                    type: 'GET',
                    url: 'change-status.php?',
                    cache: false,
                    data: dataString,
                    success: function(response) {
                        if(response == 'saved') {
                            overview();
                        }
                    }
                });
            });
        }
    });
}

已解决:经过一些试验和错误后,将.click()处理程序替换为.live('click')使其正常工作!

3 个答案:

答案 0 :(得分:2)

要回答添加的子问题,请运行此行代码

$('tr.new-tr span.status').click(function() {})

您告诉浏览器将当前存在的<span class="status"/>内的每个<tr class="new-tr"/>用于附加点击事件监听器。 .[live][1]('click')是不同的(),你在每次点击时都会说,如果它在一个内部,那么就调用该函数(这适用于绑定直播事件时不存在的跨度)。在ajax回调的成功事件中,这两种方法都很糟糕。您可以先在ajax调用之外绑定live even listener,然后相信它只会在<span class="status"/>内的<tr class="new-tr"/>上触发,即使它们是稍后创建的。

答案 1 :(得分:0)

不确定我理解这个问题。但你可以链接ajax请求......所以你可以做类似

的事情
function func1(){
   $.ajax(){
      url: "whatever.html",
      type: json
      success: func2(data)
   }
 }

 function func2(input){
 //do something with input here

  $.ajax(){
      url: "whatever2.html",
      type: json
      success: func3(data)
   }
  }

我在ajax请求中缺少参数,而func2中的请求可以从输入参数'input'发布数据。在页面上有多个ajax请求应该不是问题,你只需要担心它们何时触发并确保你将正确的数据从一个传递给另一个......

答案 2 :(得分:0)

我相信这就是你所描述的。

function ajax1(callback){

    $.ajax({
        ...
    }).done(callback);

}


function ajax2(callback){

    $.ajax({
        ...
    }).done(callback);

}


function overview(){

    loadAjax1(); // start off the ajax loading

}

function loadAjax1(){

    // get first ajax data
    ajax1(function(resp){

        $('body').html(resp) // put the ajax data in your dom, attach your handlers and such


        // find certain element to bind second ajax call
        $('body.find-your-item').click(function(){

            // when clicked, perform second ajax call, and on callback, recall intial ajax load
            ajax2(loadAjax1);
        });

    })

}