我有一个使用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()
方法。
那么,我错在哪里?
1条答案
按热度按时间nafvub8i1#
我会使用jQuery事件来防止 Flink ,它们在这里提供了更智能的触发:请记住,
.live()
现在也支持hover
。可以像这样使用
hover
(mouseenter
/mouseleave
):