jQuery点击被触发两次

时间:2010-10-23 22:40:13

标签: javascript jquery onclick

代码:

$(".box-collapse").live("click",function(){
    if(updating()) return false;
    var b = $(this).parent().parent();
    b.find(".album-div").stop(true,false).slideToggle();
    $.ajax({
        url: addNonce($(this).attr("href")),
        success:function(data){
            c = b.attr("id");
            var resp = $('<div />').html(data);
            var col = $("#"+c+" .box-collapse");
            var ncol = resp.find("#"+c+" .box-collapse");
            col.html(ncol.html());
            col.attr('href',ncol.attr('href'));
            resp.remove();
            clearUpdate(data);
            wait = false;
        }
    });
    return false;
});

此点击被点击两次。

会发生什么:

  • 点击即可折叠并发送一个 响应以保存崩溃。
  • 再次单击以展开并发送一个 要求保存扩展。
  • 再次点击以折叠即可 两次射击(让它扩大,但崩溃得救)。
  • 再次点击它会激发4次。

它只在第二次点击后开始多次射击。这令我感到困惑。

如果删除数据服务,则不会触发两次。我在服务上做错了什么? (即我只在wait = false

中留下success

我在此次通话中使用的其他功能:

function updating(){
    if(!wait) {
        $("#loading").html('Updating...');
        wait = true;
        return false;
    }
    else {
        $("#loading").html('Slow down...');
        return true;
    }
}

function clearUpdate(data){
    var resp = $('<div />').html(data);
    //alert(resp.find("#nonce").val() + " "+$("#nonce").val());
    $("#loading").html(resp.find("#loading").html());
    if(typeof(resp.find("#nonce").val()) == 'undefined'){
        alert(data);
        $("#loading").html("Fatal error. Your session could have ended. <a href='javascript:location.reload()'>Refresh</a>");
        resp.remove();
        return false;
    }
    else if(resp.find("#errorcode_").val() == "refresh"){
        location.reload();
    }
    resp.find(".image-box").each(function(){
        $("#"+$(this).attr("id")).find(".image-count").html($(this).find(".image-count").html());
    });
    $("#nonce").val(resp.find("#nonce").val());
    wait = false;
    resp.remove();
}

wait标志阻止在服务最后一个请求之前发送请求。我这样做是因为我跟踪一个nonce,我必须在每个请求后得到一个新的nonce。

同样,如果我删除数据服务,它工作正常。但我需要为数据提供服务以获得新鲜的随机数。

另外,我没有看到它在任何地方崩溃。任何帮助都会很棒。如果需要,我会发布任何其他功能。我的完整脚本非常大。

以下是.box-collapse父级的HTML:

    <div class='box image-box album-marker-visible image-box-w-20 image-box-list-0' id='portrait'>
    <h2 class='box-header image-box-header'>
    <input type='checkbox' name='albums[portrait]'>
    <span class='image-box-header-move'>
    <span class='image-album-number'>1</span>. Portrait <input type='hidden' class='image-album-anchor' value='portrait'>
    <input type='hidden' class='image-album-portfolio' value='1'>
    <span class='image-count'>(20)</span>
    <span class='box-mover'>Move to: <a href='images?n=bridals,weddings,engagement,portrait&port=2&nonce=I8FX2BH841' title='Move to Wedding Portfolio'>Wedding Portfolio</a>&nbsp;Move: <a href='images?n=story,portrait,capture,press,concerts&port=1&nonce=I8FX2BH841'>down</a></span></span>
<span class='album-marker'>&nbsp;|&nbsp;<a href='images?ia=3&action=hide&nonce=I8FX2BH841' title='Mark album as hide' class='album-mark-hide album-mark'>hide</a></span>
<a class='box-mover-show box-collapse' href='images?expand=portrait&nonce=I8FX2BH841' title='Expand Portrait'>expand</a></h2> 

.box有多个实例,我没有在h2标记后显示内容(这就是我的div未关闭的原因。)

根据要求,这是应该发生的一步一步的过程:

  • 我点击.box-collapse实例上的折叠。它发送了href
  • jQuery切换幻灯片。
  • 在回电话中,我从刚刚点击的链接中获取新的href。它应该已将查询字符串从expand=an_album更改为collapse=an_album,反之亦然。我还将状态从“展开”改为“崩溃”。我正在根据我刚刚点击的包含.box的ID搜索响应。我得到正确的响应(崩溃将更改为扩展),但jQuery slideToggles两次。
  • clearUpdate()中,我从收到的数据中更新我的随机数。如果我没有收到一个nonce,我就死了。我还会更新每个.box的图像数。

我已成功发出提醒,第一次点击时,我会收到一个提醒。再次点击,我会收到一个提醒。点击 THIRD 时间,我会收到两个提醒。第四次,4次提醒。

我已在alert($(".box-collapse").length);中完成了clearUpdate(),且尺寸不会改变。

错误在于成功功能和/或clearUpdate。由于我收到与我已有的完全相同的HTML(减去上面的更改),我是否有可能重新解析javascript并重新绑定点击?但这似乎不可行,因为我应该在第一次点击后多次开火。 的更新 我在$(document).ready()添加了一个提醒,每次收到回复都会收到提醒。所以它重新解析javascript并重新绑定点击。我的立即修复是将其更改为:$(".box-collapse").die("click").live("click",function())但我会添加一个查询来禁用javascript标题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果数据包含.box-collapse类

,则很可能会创建第二次点击事件
var resp = $('<div />').html(data);

你真的需要班级选择器吗?标识符应该是唯一的 这使得b.html()== $(“#”+ c +“。box-collapse”)。html()和b == col [0]

var col = $("#"+c+" .box-collapse");

这令人担忧。这意味着在resp中有一个与b内的id相同的元素。 这很可能是切换到click实时点击事件的原因 发生两次。

var ncol = resp.find(“#”+ c +“。box-collapse”);

对.box-collapse内容或要理解的数据知之甚少

col.html(ncol.html());
col.attr('href',ncol.attr('href'));

现在我想我终于明白了。

将数据更改为包含JSON对象或更简单的HTML结构,它应该像这样工作。

很好的例子

 data == { "innerText":"expand", "url":"images?expand=portrait&nonce=I8FX2BH841" }

 col.html(data.innerText);
 col.attr('href', data.url);

错误示例

服务器响应:

data == <span class="innerText">expand</span><span class="url">images?expand=portrait&nonce=I8FX2BH841</span>

var div = $("<div />").html(data);
col.html(div.find(".innerText").html());
col.attr(div.find(".url").html());

并调整clearUpdate函数