2

我尝试了以下 unbind 方法来取消与 class 的元素绑定'.rightclickarea'

   $('.rightclickarea').unbind();

         $('.rightclickarea').bind("contextmenu",function(e){
             e.preventDefault()
             });

但是该元素不是未绑定事件。因此,每次我调用此方法 BindBookMarkPopUp() 时,它都会尝试再次绑定,这会产生问题。那么有什么方法可以在 jquery 中的每个绑定之前解除绑定。谢谢!

function BindBookMarkPopUp() {


$('.rightclickarea').unbind("contextmenu");

$('.rightclickarea').bind('contextmenu', function(e) {

    id = $(this).attr("id");

    $("#current_id").html(id.substring(3));
    $("#current_id").attr("data-type",1);

    var $cmenu = $(".vmenu_bookmark");
    $('<div class="overlay"></div>').css({
        left : '0px',
        top : '0px',
        position : 'absolute',
        width : '100%',
        height : '100%',
        zIndex : '100'
    }).click(function() {
        $(this).remove();
        $cmenu.hide();
    }).bind('contextmenu', function() {
        return false;
    }).appendTo(document.body);
    $(".vmenu_bookmark").css({
        left : e.pageX,
        top : e.pageY,
        zIndex : '101'
    }).show();
    return false;
});

$('.vmenu_bookmark .first_li').live('click', function() {
    if ($(this).children().size() == 1) {
        alert("book_marks");

        if ($(this).attr("id") == "vmenu_bookmark") {
            $.colorbox({
                inline : true,
                width : 280,
                height : 120,
                href : "#title_content",
                title : "Enter title for Bookmark"
            });

        }
        $('.vmenu_bookmark').hide();
        $('.overlay').hide();
    }
});


$('.vmenu_bookmark .second_li').live('click', function() {


    if ($(this).children().size() == 1) {

        if ($(this).attr("id") == "vmenu_project") {

        alert("project_click")
            PopulateProjects();

            $.colorbox({
                inline : true,
                width : 500,
                height : 400,
                title : "",
                href : "#title_content_project"

            });


        }

        $('.vmenu_bookmark').hide();
        $('.overlay').hide();
    }
});

HTML 代码:

<div class="vmenu vmenu_bookmark">
            <div class="first_li" id="vmenu_bookmark"><span>Add to Bookmark</span></div>
            <div class="second_li" id="vmenu_project"><span>Add to Project</span></div>
            <div style="display: none;" class="sep_li"></div>

            <div style="display:none;" class="first_li"><span>XYZ</span>
                <div class="inner_li">
                    <span>ABC</span> 
                    <span>PQR</span>
                    <span>MNO</span>
                </div>
            </div>
    </div>
4

1 回答 1

1

unbind方法反转(删除)先前绑定的事件处理程序。您不能unbind提前处理尚未绑定的处理程序。

如果您希望取消绑定某个事件处理程序,请随后执行此操作。例如,为了取消绑定所有以前绑定的contextmenu事件,您可以执行以下操作:

$(".rightclickarea").unbind("contextmenu")

您还可以取消绑定所有类型的所有先前边界事件,只需不提供参数即可:

$(".rightclickarea").unbind()

最后,如果您只想取消绑定特定的事件处理程序,您有两个选项(这两个选项都要求您在第一次绑定时采取不同的行动):

选项1

您使用 绑定您的方法namespace,例如:

$(".rightclickarea").bind("contextmenu.myUniqueHandler", function() {
   /* your code here */
})

然后您可以使用以下方法取消绑定此特定事件处理程序:

$(".rightclickarea").unbind("contextmenu.myUniqueHandler")

选项 2

您将回调函数封装起来并将其存储在变量中,然后将其传递给bind方法:

var myUniqueHandler = function() {
   /* your code here */
}

$(".rightclickarea").bind("contextmenu", myUniqueHandler)

然后您使用该变量取消绑定它:

$(".rightclickarea").unbind("contextmenu", myUniqueHandler)

编辑:

深入了解您的问题(在进一步澄清之后).vmenu_bookmark,在多次调用BindBookMarkPopUp.

问题是您假设使用unbindon.rightclickarea将反转回调函数中已完成(或绑定)的任何内容。它不是。

当您使用 时unbind,您只会阻止您的绑定函数进一步执行:

// this will not execute after an unbind:
$('.rightclickarea').bind('contextmenu', function(e) {

    // ....
    // some code
    // ...
    // ..

    // VVV This will not unbind, it will still work. VVV
    $('.vmenu_bookmark .first_li').live('click', function() { 
       /// ...
    })
})

您在上面所做的一切,在解除绑定后都不会逆转 - 包括您的.live/.bind电话。

这意味着每次调用BindBookMarkPopUp都会向 中添加另一个事件处理程序 ( bind) .vmenu_bookmark,从而导致它们堆积起来。

解决方案是将您的所有.bind()and.live()调用(包括.vmenu_bookmark...and .rightclickarea)移到*函数之外*

您没有理由多次绑定 - 您只需执行一次。


于 2013-08-14T19:31:09.253 回答