2010-10-16 26 views
1

由於許多瀏覽器並未在禁用的表單元素上顯示工具提示(正如Opera所做的那樣),所以我決定使用jQuery來模擬禁用的按鈕。如何用jQuery找到某些特定的事件處理程序?

禁用時我只是將控件的類設置爲禁用並且對於按鈕/提交控件,我添加了事件處理程序click(function(){return false;}) ,並且在重新啓用控件時我可以解除綁定。

現在的問題是 - 我需要從禁用的控件中移除所有附加的事件處理程序(click, enter key),因爲我使用的是基於自定義jQuery的工具提示,需要這些事件。「mouseenter」和「mouseleave」除外。 重新啓用按鈕後,我需要恢復所有處理程序。

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

你能幫我嗎?

回答

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

謝謝,你的代碼和event.type分析一起訣竅。 – JustAMartin 2010-10-16 16:35:53

1

我不會去所有的工作。

既然你對殘疾人元素.disabled類,我只用通過在if()聲明測試那個類,並返回假,作爲一個標誌,禁用/啓用功能,如果該元素具有disabled類。

因此,使用你給click處理程序,而不是:

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

我應該這樣做:

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

現在,當你刪除.disabled類,輸入將重新工作。沒有unbind/bind或跟蹤使用.data()。簡單得多。

+0

是的,這將是最有效的解決方案,但它會迫使其他開發人員編寫一些事件處理程序,並記住檢查是否處於禁用狀態。我希望enabler/disabler解決方案像一些單獨的代碼,最有可能是jQuery插件。 – JustAMartin 2010-10-16 16:35:07

相關問題