首先,我想确切地说,我已经阅读了本网站上所有“jQuery两次调用”的建议,并且没有一个人遇到我面临的问题。
这很简单,我不明白它是如何表现的。
$('.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');
});
}
答案 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');