jquery event.target被更改为在ajax post回调中显示不相关的元素?
我有两种类型的链接是事件绑定的。如果单击的链接具有“标记”类,则事件处理程序调用recallFlag,else doFlag函数jquery event.target被更改为在ajax post回调中显示不相关的元素?,jquery,Jquery,我有两种类型的链接是事件绑定的。如果单击的链接具有“标记”类,则事件处理程序调用recallFlag,else doFlag函数 $(document).ready(function() { $('div.flag-link, span.flag-link').bind('click', function(e){ if ($(e.target).attr('class')=='flagged') doRecall(e); else doFlag(e); return
$(document).ready(function() {
$('div.flag-link, span.flag-link').bind('click', function(e){
if ($(e.target).attr('class')=='flagged') doRecall(e);
else doFlag(e);
return false;
});
doFlag函数加载表单,当用户提交表单时,接收json数据。使用该数据,它会更改链接的href和类(标记-->未标记,反之亦然)
当用户第一次标记一个项目时,执行是ok的。但是当用户第二次单击另一个链接来标记另一个项目时,我有一个奇怪的行为:event.target被更改为post事件回调函数中的第一个元素(第一次单击)。因此,更新了错误的链接(以前单击的链接)
我做错了什么
function doFlag(e) {
var link = e.target;
var $prnt = $(link).parent();
var $url = $(link).attr('href');
console.log('new attempt to flag:' + $(link).attr('href'));
Boxy.load($url, {modal:true, title:e.target.innerHTML, closeText:'[Kapat]', unloadOnHide:true, cache:false, behaviours: function(r) {
$("#flag-form-submit").live("click", function(){
var post_url = $("#flag-form").attr('action');
$.post(post_url, $("#flag-form").serialize(), function(data){
//THIS IS WHERE THE CODE SCREWS UP:
//here "link" is changed to the former link that triggered the event previously
if (data.status == 'ok') {
$(link).attr('href', data.url);
$(link).attr('class', data.css_class);
$(link).attr('innerHTML', data.text);
$prnt.children('img.flag-img').css('visibility', 'visible');
}
}, "json");
boxy = Boxy.get(this);
boxy.hideAndUnload();
return false;
});
}
});
这是因为您正在使用.live事件。基本上,每个页面会话只应该绑定一次,但是每次都要向堆栈添加一个实时事件,但只有在单击第一个链接后才能看到第一个添加的事件 对于最少的代码更改,而不是.live,您可以使用单击,但请确保先解除绑定 e、 g 如果您想重构其中的大部分,那么我会将live处理程序移到该函数之外,将其绑定到doc ready中,然后使用#flag form submit元素上的.data存储当前链接
$("#flag-form-submit").data('currentLink', link);
然后在现场活动中
if (data.status == 'ok') {
var $link = $("#flag-form-submit").data('currentLink');
$link.attr('href', data.url);
$link.attr('class', data.css_class);
$link.attr('innerHTML', data.text);
$prnt.children('img.flag-img').css('visibility', 'visible');
}
你帮了大忙。根据您的指导,我添加了$(this).die('click');单击事件函数的末尾。它似乎也能完美地工作。继续这样做可以吗?还是我应该使用你的解决方案?最好只使用单击或事件。一(fn)。每次更改实现时使用live没有任何好处。我最初使用的是click,但我切换到live,因为使用click没有将元素绑定到事件。我怀疑这是因为在执行事件绑定代码时表单的元素没有完全加载。因此,我转向了生活,它起了作用。简而言之,我不确定如何使用click:)如果您在使用ajax时加载该按钮(不确定boxy是如何工作的),那么yeah live将是前进的方向,因为使用时该按钮需要位于dom中。clickboxy通过ajax加载该按钮,因此我似乎必须坚持使用live。非常感谢你的帮助。
if (data.status == 'ok') {
var $link = $("#flag-form-submit").data('currentLink');
$link.attr('href', data.url);
$link.attr('class', data.css_class);
$link.attr('innerHTML', data.text);
$prnt.children('img.flag-img').css('visibility', 'visible');
}