Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery event.target被更改为在ajax post回调中显示不相关的元素?_Jquery - Fatal编程技术网

jquery event.target被更改为在ajax post回调中显示不相关的元素?

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

我有两种类型的链接是事件绑定的。如果单击的链接具有“标记”类,则事件处理程序调用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 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');

}