代码之家  ›  专栏  ›  技术社区  ›  Matt Anxo P

jQuery die()终止所有元素,而不是只指定一个

  •  1
  • Matt Anxo P  · 技术社区  · 15 年前

    <li> 使用此代码的元素:

    $('li', $list).live("click", rightItemSingleClickEvent);
    

    请注意,我在这里使用一个毯子选择器将同一个live click事件连接到所有 <li> $list中的元素,这只是一个无序列表。我打过一次电话 $(document).ready() . rightItemSingleClickEvent()实际上会终止方法顶部的实时单击事件。这是因为存在与单击相关联的动画,我在动画发生时将其杀死,这样就不会出现重复的单击。终止单击的代码如下:

    $(this).die("click");
    

    动画完成后,我重新连接单击事件:

    $notesArea.fadeIn(function() {
        $listItem.live("click", rightItemSingleClickEvent);
    });
    

    <li> ),它似乎杀死了所有的列表项,而不仅仅是那个。因此,一旦我单击一个列表项,当它的功能继续工作时(我仍然可以单击),其他所有的列表项都无法再单击。我想知道这是否与我通过覆盖所有内容的总括性声明连接live click事件有关 < 马上就来。

    所以如果我把现场活动和 < <li> 也会杀死所有的兄弟姐妹。

    任何洞察都将不胜感激。谢谢。

    我被要求为rightItemSingleClickEvent发布更多的代码。这个函数基本上处理用户单击列表项时发生的事情。我通过添加和删除css类来模拟单击和取消单击。还有一个文本框在单击时显示,在取消单击时隐藏。这是在重新连接实时单击事件之前必须完成的动画。我还应该指出,我正在使用helper函数来终止和连接单击事件,handleNotes()是一个函数,它在用户解除锁定时存储文本框文本,并执行一些我认为与此问题无关的其他操作。不过,更令人困惑的是,我的代码仍然张贴在下面:

    function rightItemSingleClickEvent(ev) {
    
    var $target = $(ev.target); // what was clicked on the item
    var $clickedItem = $('#' + $(this).attr('id'));
    
    killItemClickEvents($(this)); // kill live click event to prevent extra clicks during animation
    
    if ($target.is('a.ui-icon-circle-close')) { // if clicking remove icon, just remove the item
    
        removeItem($clickedItem, getLeftList());
    }
    else { // otherwise, handle click event
    
        if ($clickedItem.hasClass("ui-state-default")) { // UNCLICK BUTTON LOGIC (if button is clicked)
    
            handleNotes("hide", $clickedItem); // Hide notes box and store its contents in $(this)'s notes div
            $clickedItem.removeClass("ui-state-default").addClass("ui-state-active"); // unclick button
        }
        else { // CLICK BUTTON LOGIC (if button is unclicked)
    
            if ($clickedItem.siblings(".ui-state-default").attr('id') != undefined) { // if a button is already clicked
                // got some stuff to do with button that was already clicked
                var $prev_clickedButton = $clickedItem.siblings(".ui-state-default");
    
                handleNotes("store", $prev_clickedButton);
    
                // now unclick all buttons -- only one clickable at a time
                $prev_clickedButton.removeClass("ui-state-default").addClass("ui-state-active");
    
                handleNotes("toggle", $clickedItem);
            }
            else {
                handleNotes("show", $clickedItem); // Show notes box and populate it with $(this)'s notes
            }
    
            // then click the button that was clicked (by changing its css class)
            $clickedItem.removeClass("ui-state-active").removeClass("ui-state-hover").addClass("ui-state-default"); // click it
        }
    }
    }
    

    更新:

    更新2: 因为我没能通过这个问题,我修改了代码来检查“:animated”状态,并放弃了杀死和重新连接live click事件的想法。但是,我仍然想知道为什么一个列表项上的kill()会杀死所有的列表项,即使我已经为每个列表项分别分配了实时单击事件。

    1 回复  |  直到 15 年前
        1
  •  0
  •   PetersenDidIt    15 年前

    live events .

    Live events

    这意味着这将无法正常工作:

    $('li', $list).live("click", rightItemSingleClickEvent);
    

    $('#'+$list.attr('id')+' li').live("click", rightItemSingleClickEvent);
    

    die调用终止所有元素上的事件的原因是它在父元素上绑定了一次。当你移除它时,你会为所有的人移除它。使用事件委派(.live())的主要原因是只绑定一个事件,而不是多个事件。