JQuery Ajax函数调用两次,而第一次调用是好的

时间:2011-10-31 14:59:52

标签: jquery timer

首先,我想确切地说,我已经阅读了本网站上所有“jQuery两次调用”的建议,并且没有一个人遇到我面临的问题。

这很简单,我不明白它是如何表现的。

  • 我首先调用一次,然后加载20条记录的AJAX请求并将它们放在表中
  • 然后在那些< tr>我添加一个(还)图片,我分配这样的事件:

$('.moderation_ok').click(function() {
  return decisionOk($(this));
}); 

然后

function decisionBoutonOk(t) {
  var p=t.parent().parent().parent().parent();
  var id=p.attr('id').substring(3);
  AjaxDevisSendDecision(id, 1, null);
  return false;
}

在Ajax函数中,如果一切正常,我会读取另一个行要添加的结果:

function AjaxDevisSendDecision(id, decision, raison) {
  $.ajax({
    url: '/json/devis/decision/',
    dataType: 'jsonp',
    data : { id: id, decision: decision, raison: raison },
    context: this,
    cache: false,
  })
  .success( function (data) {
    if (data.success) {
      /* Success */
      for (var x in data.result) {
        var s=data.result[x];
        addRowIntoTable(s);
        refreshEvents();
      }
    }
  });
}

我面临的问题是第一个电话是完美的并且完美运行:click =>调用AJAX => AJAX调用的结果ok =>添加新行...

现在我被困住了:如果我点击第二行的图像,AjaxDevisSendDecision()被称为瞬间 两次。而且真的不明白发生了什么。

有什么想法吗?

编辑:如果事件处理程序中存在异常,则不再存在问题:

function decisionBoutonOk(t) {
  var p=t.parent().parent().parent().parent();
  var id=p.attr('id').substring(3);
  p.css({ backgroundColor: '#5f5' });
  p.stop(true,true).hide('slow');
  AjaxDevisSendDecision(id, 2, null);
  eeqsf(); /* unknown function = raise exception */
  return false;
}

也许这可以提供一些线索来了解正在发生的事情......

有关您的信息,这里几乎是完整的源代码:

function refreshEvents() {
  $('tr').each(function() {
    var id=$(this).attr('id').substring(3);
    if(typeof(globT[id].height)!='undefined') {
      return;
    }
    /* First time here = remember height in pixels */
    globT[id].height=$(this).children('.principal').children('.texte').height();
    $(this).children('.principal').children('.texte').height('89px');
    $(this)
      .mouseenter(function() {
        var id=$(this).attr('id').substring(3);
        var c=$(this).children('.principal').children('.texte');
        c.stop(true, true).animate({ height: globT[id].height+'px'}, 'slow');
        c.children('.choix_moderateur').stop(true, true).fadeIn('slow');
      })
      .mouseleave(function() {
        var c=$(this).children('.principal').children('.texte');
        c.stop(true, true).animate({ height: '89px'}, 'slow');
        c.children('.choix_moderateur').stop(true, true).fadeOut('slow');
        c.children('.raison_refus').stop(true, true).fadeOut('slow');
      });
  });
  $('.moderation_ok').click(function(event) {
    event.preventDefault();
    return decisionBoutonOk($(this));
  });
}

function decisionBoutonOk(t) {
  var p=t.parent().parent().parent().parent();
  var id=p.attr('id').substring(3);
  AjaxDevisSendDecision(id, 1,null);
  eeqsf();
  return false;
}

function AjaxDevisGet(nb, notassigned) {
  $.ajax({
    url: '/json/devis/liste/',
    dataType: 'jsonp',
    data : { nb: nb, notassigned: notassigned },
    context: this,
    success: function (data) {
      if (data.success) {
        for (var x in data.result) {
          var s=data.result[x];
          ajouteDevisDansDOM(s);
        }
        refreshEvents();
      }
    }
  });
}

function AjaxDevisSendDecision(id, decision, raison) {
  $.ajax({
    url: '/json/devis/decision/',
    dataType: 'jsonp',
    data : { id: id, decision: decision, raison: raison },
    context: this,
    cache: false,
  })
  .success( function (data) {
    if (data.success) {
      /* success=add each row in the result */
      for (var x in data.result) {
        var s=data.result[x];
        ajouteDevisDansDOM(s);
        refreshEvents();
      }
    }
  })
  .complete( function () {
    console.log('complete');
  });
}

1 个答案:

答案 0 :(得分:1)

问题在于:

function refreshEvents() {
  $('tr').each(function() {
    ...
    blabla
    ...
  });
  $('.moderation_ok').click(function(event) {
    ...
    blabla
    ...
  });
}

成功调用Ajax之后,我调用了refreshEvents()并在此函数中(见前)我始终称为$('.moderation_ok').click(function(event) {}。这意味着:“如果我们点击属于班级moderation_ok的所有元素,则添加另一个函数。

我认为在声明像$('.moderation_ok').click(function(event) {}这样的函数时它会覆盖click()行为。 不! 我没有删除我的问题,因为我的回答可能对其他人有用。

以下是我在之前添加的代码:

$('.moderation_ok').unbind('click');

现在它就像一个魅力。

所以,摘要:

当声明像$('.moderation_ok').click(function(event) {} jQuery 这样的函数添加这个函数时,click()行为。如果您执行两次,则该函数将被称为两次,依此类推。

在这种情况下,请使用unbind()删除任何事件处理程序:$('.moderation_ok').unbind('click');