0

有许多引导选项卡,每个选项卡都有带有大量“td”元素的示例表。我们在活动选项卡的 td 上绑定一个点击事件。为了性能,我们希望每次用户更改选项卡时取消绑定前一个选项卡的点击事件。

这是演示:http: //jsfiddle.net/hyTCy/

(“显示”事件是在所有转换完成之后)

$('a[data-toggle="tab"]').on('shown', function (e) {

    var newt = $(e.target).attr("href"),
        prevt = $(e.relatedTarget).attr("href");

    console.log("new tab: " + newt) // activated tab
    console.log("prev tab: " + prevt); // previous tab

    $(newt + " tbody").on("click", "td", function (e) {
        console.log("click");
    });

    var validate = function () {
        console.log("prev click ok");
    };
    $(prevt + " tbody").off("click", "td", validate);
});

正常情况下,如果你访问demo,点击“profile”标签,然后点击“home”,控制台应该会显示一条消息“prev click ok”,这样我们就知道上一个标签中的事件已经解除绑定了。

为什么功能验证不能正常工作?...谢谢!

4

1 回答 1

0

您对如何.off()工作有误。它只是取消绑定事件处理程序。它不执行传递给它的回调函数。您只传递回调函数,以便该.off()函数可以匹配要删除的正确事件处理程序,如果传递,它必须与传递给的函数完全相同.on()。当你调用它时实际上并没有调用它.off()

为了.off()正常工作,您必须传递与注册事件完全相同的回调函数,或者您必须不传递回调(在这种情况下,所有回调都将被取消注册)。现在,您正在传递与事件无关的回调,因此不会取消注册任何事件。

重要的是呼叫必须与您尝试注销的.off()呼叫具有完全相同的签名。.on()因此,无论.on()呼叫看起来如何,请确保.off()呼叫看起来相同。这意味着事件名称需要相同,选择器需要相同,并且回调函数需要完全不传递或相同。

如果这是您要撤消的操作:

$(newt + " tbody").on("click", "td", function (e) {
    console.log("click");
});

然后,你会想要使用这个:

$(prevt + " tbody").off("click", "td");

如果您尝试仅针对该特定回调,那么您需要将第一个回调放入一个函数中,以便它可以用于.off()这样的:

function logClick(e) {
    console.log("click");
}

$(newt + " tbody").on("click", "td", logClick);

并且.off()将使用相同的功能:

$(prevt + " tbody").off("click", "td", logClick);
于 2013-04-01T17:09:51.273 回答