1

快速且可能愚蠢的问题。我有以下情况:我选择了多个元素并将点击处理程序绑定到它们。单击它们后,我想删除处理程序并取消对所有这些单击的绑定。$(this)总是指实际被点击的元素,所以$(this)只从被点击的元素中删除点击处理程序——而不是从我将事件绑定到的所有选择器中。

$(modal + ' .modal-close, ' + modal + ' a.cancel_link, ' + modal + ' .okBtn').bind('click', function(e) {
        e.preventDefault();
        ...
        //$(this).unbind('click');
        $(modal + ' .modal-close, ' + modal + ' a.cancel_link, ' + modal + ' .okBtn').unbind('click');
});

奇怪的问题是。有没有更好的方法,还是我必须重复函数中的所有选择器才能解除对所有选择器的点击?我知道我之前可以声明一个变量,但是有没有类似的东西$(this-all):)

4

2 回答 2

1

您可以在闭包中捕获初始 jQuery 对象:

var $all = $(modal + ' .modal-close, ' + modal + ' a.cancel_link, '
    + modal + ' .okBtn');
$all.click(function(e) {
    e.preventDefault();
    // ...
    $all.unbind("click");
});
于 2011-07-24T16:31:26.560 回答
1

正如你所说,声明一个变量可能是你最好的选择。

$(this-all)在很多情况下没有意义,因为单击事件不知道您在绑定该事件时使用的特定选择器,它只知道要执行的元素和函数。

请注意,有一种更简洁的方式来做你正在做的事情。.find()您可以使用该方法查找所选元素的祖先,而不是逐个构建选择器:

var $modal = $(modal); // assuming `modal` is a string
var $elems = $modal.find('.modal-close, a.cancel_link, .okBtn'); // hyphens, underscores, and camelCase -- oh my!
$elems.click(...);
于 2011-07-24T16:38:43.923 回答