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

时间:2010-10-16 12:37:39

标签: controls jquery

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

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

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

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

你能帮助我吗?

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

答案 2 :(得分: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()进行跟踪。更简单。