jQuery将绑定替换为live

icnyk63a  于 2022-12-22  发布在  jQuery
关注(0)|答案(1)|浏览(135)

我有一个使用jQuery和大量mouseover/mouseout效果的网站。到目前为止,我使用jQuery的.bind()方法,但如果你有超过1000个事件处理程序,这会大大降低你的浏览器速度。所以,我想使用.live.delegate
我的门户网站的一部分是一个聊天区。用户可以设置聊天消息,然后将显示在一个简单的表格。有一个功能,如果你移动鼠标到一个聊天消息的垃圾桶将出现允许您删除消息(如果它是由你或你是一个版主)。
回收站与聊天消息位于同一个表格单元格中。
问题是:使用.bind(),它的工作就像一个魅力。这是旧代码:

function CreateChatMessageContextMenu(ctrl, messageID, message, sender) {
    
    var a = document.createElement("a");
    a.href = "javascript:RemoveChatMessage(" + messageID + ");"
    a.id = 'aDeleteChatMessage' + messageID;
    a.style.display = 'none';
    var img = document.createElement("span");
    img.className = "sprite-common messages-image sprite-common-btnDelete";
    a.appendChild(img);
    ctrl.appendChild(a);

    $(ctrl)
        .bind('mouseover', function(event) { $('#aDeleteChatMessage' + messageID).show() })
        .bind('mouseout', function(event) { $('#aDeleteChatMessage' + messageID).hide() });
    return;

}

"ctrl"是对表格单元格的引用。
现在,使用.live(),垃圾箱也出现了,但是它 Flink 了很多,当我把鼠标移到垃圾箱上时,它消失了或者不活动了。我有一种感觉,更多的事件被抛出了。看起来mouseout是在移到垃圾箱上时抛出的,但是垃圾箱在tablecell里面,所以mouseout不应该被触发。新的代码如下:

$(document).ready
{
$('.jDeleteableChatMessage').live('mouseover mouseout', function(event) {
    var linkID = '#aDelete' + event.target.id;
    if (event.type == 'mouseover') {
        $(linkID).show();
    } else {
        $(linkID).hide();
    }
    return false;
});
}

function CreateChatMessageContextMenu(ctrl, messageID, message, sender) {
if (!UserIsModerator && (UserLogin != sender)) return;
ctrl.id = 'ChatMessage' + messageID;
var deleteString = 'Diese Chatnachricht löschen';
if (UserLang == '1') deleteString = 'Delete this chat message';

var a = document.createElement("a");
a.href = "javascript:RemoveChatMessage(" + messageID + ");"
a.id = 'aDeleteChatMessage' + messageID;
a.style.display = 'none';
var img = document.createElement("span");
img.className = "sprite-common messages-image sprite-common-btnDelete";
img.alt = deleteString;
img.title = deleteString;
a.appendChild(img);
ctrl.appendChild(a);

$(ctrl).addClass('jDeleteableChatMessage');

}

我添加了一个类来告诉jQuery哪些聊天单元格有垃圾桶,哪些没有。我还向表单元格添加了一个ID,稍后将使用它来确定关联的垃圾桶。是的,这是一个笨拙的数据传递到事件方法。当然,还有document.ready函数,它初始化.live()方法。
那么,我错在哪里?

nafvub8i

nafvub8i1#

我会使用jQuery事件来防止 Flink ,它们在这里提供了更智能的触发:请记住,.live()现在也支持hover
可以像这样使用hovermouseenter/mouseleave):

$('.jDeleteableChatMessage').live('hover', function(event) {
  $('#aDelete' + this.id).toggle();
  return false;
});

相关问题