我的目标是绑定到页面上的许多元素(使用on()),然后在单击后从特定元素(使用off())取消绑定。
$(document).on({
mouseenter: enter,
mouseleave: leave,
mousedown: down,
mouseup: up,
click: click
}, ".up_side .thumbsUp");
on()函数运行良好,但我无法弄清楚如何使用off()从被点击的元素中取消绑定。
var click = function() {
var thumbsUp = $(this);
var successCallback = function(data) {
// This is where I need to unbind the clicked element
$(thumbsUp).off({
mouseenter: enter,
mouseleave: leave
});
}
$(this).castVote(direction, modelName, modelId, successCallback, errorCallback);
}
感谢!!!
使用.data()存储标志并在执行代码之前检查标志。这似乎是一种解决方法,使代码更加脆弱。如果有人找到更好的方法,请回复。谢谢!
$(document).on({
mouseenter: function(){
if ($(this).data("submitted") != true)
{
$(this).css("cursor", "pointer");
$(this).css("backgroundPosition", "-48px");
}
},
mouseleave: function(){
if ($(this).data("submitted") != true)
{
$(this).css("backgroundPosition", "0px");
}
},
mousedown: function() {
if ($(this).data("submitted") != true)
{
$(this).css("backgroundPosition", "-96px");
}
},
mouseup: function() {
if ($(this).data("submitted") != true)
{
$(this).css("backgroundPosition", "0px");
}
},
click: function() {
if ($(this).data("submitted") != true)
{
var thumbsUp = $(this);
var ballotBox = $(thumbsUp).parent();
var votingStation = $(ballotBox).parent();
//ballotBox.hide(0, "", function() {
var direction = $(thumbsUp).dataset("direction");
var modelName = $(votingStation).dataset("modelName");
var modelId = $(votingStation).dataset("modelId");
var successCallback = function(data) {
$(thumbsUp).css("backgroundPosition", "-144px");
// Add flag to indicate successful vote
thumbsUp.data("submitted", true)
$(this).vote_up_side('animateBallotBox', data, ballotBox, thumbsUp);
}
var errorCallback = function(XMLHttpRequest, textStatus, errorThrown) {
$(this).vote_up_side('animateError', ballotBox);
}
$(this).castVote(direction, modelName, modelId, successCallback, errorCallback);
}
}
}, ".up_side .thumbsUp");
答案 0 :(得分:5)
选择器一个选择器,它应该与附加事件处理程序时最初传递给
.on()
的选择器匹配。
和(我的重点)
要删除特定的委托事件处理程序,请提供选择器参数。选择器字符串完全必须与附加事件处理程序时传递给
.on()
的选择器字符串相匹配。
因此,AFAIK无法选择(无双关语)从委托事件处理程序中删除某些元素。
我认为您唯一的选择是保留事件处理程序,但使用一些.data()
标记每个元素,用于指示是否已单击该特定元素。
答案 1 :(得分:0)
你能用“.one()”吗?
从文档:“要删除与.on()绑定的事件,请参阅.off()。要附加仅运行一次然后自行删除的事件,请参阅.one()。”
答案 2 :(得分:0)
实际上,这没有意义。根据官方jQuery文档,在没有选择器的情况下调用off()
时,将删除所有指定的事件。因此,$(".someElement").off("click")
应取消绑定来自".someElement"
的所有点击处理程序,无论原始绑定是直接绑定还是委派。 如果它不起作用,那么jQuery有一个错误,你应该提交错误报告。
你使用data()
的方式肯定会有用,但我个人认为这是一个不必要的kludge / hack。