【问题标题】:How to find some certain event handlers with jQuery?如何使用 jQuery 找到某些特定的事件处理程序?
【发布时间】:2011-04-26 07:44:29
【问题描述】:

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

禁用时,我只是将控件的类设置为禁用,对于按钮/提交控件,我添加一个事件处理程序 click(function(){return false;}) 我可以在稍后重新启用控件时取消绑定。

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

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

你能帮帮我吗?

【问题讨论】:

    标签: controls jquery


    【解决方案1】:

    我不会去做所有这些工作。

    由于您在禁用的元素上有一个 .disabled 类,我只需通过在 if() 语句中测试该类来将其用作禁用/启用该功能的标志,如果元素有则返回 false disabled 类。

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

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

    我会这样做:

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

    现在,当您删除 .disabled 类时,输入将再次起作用。否 unbind/bind 或使用 .data() 进行跟踪。简单得多。

    【讨论】:

    • 是的,这将是最有效的解决方案,但它会迫使可能编写一些事件处理程序的其他开发人员记住检查禁用状态。我希望启用/禁用解决方案就像一段单独的代码,很可能是 jQuery 插件。
    【解决方案2】:

    试试这个:

    <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>
    

    【讨论】:

    • 谢谢,您的代码和 event.type 分析一起成功了。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2010-09-12
      • 2011-01-24
      相关资源
      最近更新 更多