代码之家  ›  专栏  ›  技术社区  ›  JustAMartin

如何使用jQuery查找某些事件处理程序?

  •  1
  • JustAMartin  · 技术社区  · 14 年前

    由于许多浏览器不显示禁用表单元素的工具提示(Opera也一样),我决定用jQuery模拟禁用按钮。

    click(function(){return false;}) 我可以在以后重新启动控件时解除绑定。

    现在的问题是-我需要删除所有附加的事件处理程序 (click, enter key) 在禁用的控件中,除了“mouseenter”和“mouseleave”,因为我使用的是基于jQuery的自定义工具提示,需要这些事件。 在重新启用按钮之后,我需要恢复所有处理程序。

    我知道我可以将附加的事件处理程序存储在 $.data() 但我不知道如何收集除“mouseenter”和“mouseleave”之外的所有事件处理程序。

    你能帮助我吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Nands    14 年前

    试试这个:

    <script>
    
    $(function() {
    
    //Lets attach 2 event handlers to the div
    $("#el").click(function(){ alert("click"); });
    $("#el").mouseover(function(){ alert("mouseover"); });
    
    
    //We iterate on the div node and find the events attached to it
    
    $.each($("#el").data("events"), function(i, event) {
        output(i);
        $.each(event, function(j, h) {
          output(h.handler);
          //DO your unbind here if its not a mouse-enter or a mouseleave
        });
      });
    });
    
    function output(text) {
        $("#output").html(function(i, h) {
            return h + text + "<br />";
        });
    }
    
    </script>
    
    <div id="el" style="width: 200px; height: 200px; border: solid 1px red;">Test</div>
    <span id="output"></output>
    
        2
  •  1
  •   Māris Kiseļovs    14 年前
        3
  •  1
  •   user113716    14 年前

    因为你有一个 .disabled 在disabled元素上的类,我只将其用作通过在 if() 语句,如果元素具有 disabled 上课。

    所以使用 click 你提供的处理程序,而不是:

    $('someElement').click(function(){return false;});
    

    $('someElement').click(function() {
        if( $(this).hasClass( 'disabled' ) ) {
            return false;
        } else {
            // run your code
        }
    });
    

    现在当你移除 。已禁用 类,输入将再次工作。不 unbind/bind .data() . 简单多了。