Possible Duplicate:
jQuery - How can I bind all events on a DOM element?
想象一下,如果我们想让一些元素完全不可交互。
当然,我们可以为点击事件绑定(bind)一个阻止默认值,如下所示:
$('form *').bind('click', function(event) {
event.preventDefault();
});
但这只是一个事件,还有更多事件,例如悬停、聚焦、selectstart 等等。
我们可以在一行中指定它们,例如“click focus hover dblclick blur selectstart”,但这没有多大意义,也不容易维护。
那么,是否可以在不区分事件类型的情况下绑定(bind)事件监听器?也许一些原生的 JavaScript 监听器允许它?
没有这种可能性,因为并非所有元素都支持相同的事件,而且并非所有事件的行为方式都相同。您始终必须明确提供事件列表,无论是静态定义还是 dynamically by a script吐出事件名称。
尽管我链接到创建事件名称数组的脚本,但这些事件名称仅在一个元素上生成。您当然应该使用更复杂和更慢的脚本来生成它,该脚本枚举所有有问题的元素并添加缺失的事件。使用 Javascript 对象作为关联数组以更快地搜索是否已添加特定事件。
更好的建议
您尝试做的可能是一个高度过度设计的解决方案。当我创建一个应该禁用某些元素(无论是链接、按钮还是其他任何元素)的演示可点击界面时,我宁愿通过定义一个禁用相关元素的 CSS 类来实现它,并有一个简单的脚本在之后禁用。
您还可以通过提供您希望在特定元素上禁用哪些事件(默认为 click
事件)来进一步利用这一点。
<!-- no events; use defaults -->
<a href="#" class="disable">No-follow link</a>
<button class="disable">Nothing happens</button>
<!-- provide events -->
<a href="#" class="disable" data-events="click blur">No-follow link</a>
<form class="disable" data-events="submit">...</form>
脚本
$(function() {
var disable = function(evt) {
evt.preventDefault();
console.log("Prevented on " + evt.target.tagName);
};
$(".disable").each(function() {
var ctx = $(this);
ctx.bind(ctx.data("events") || "click", disable);
});
});
使用智能默认值
上面的例子定义了一个单一的事件默认值。 点击
事件。这很好并且在大多数情况下都有效,但并非在所有情况下都有效。例如,form
元素总是必须定义应该禁用的 submit 事件。所以。那么智能默认值。我们还应该考虑到需要抑制的列表事件通常很短。如果我们使用默认值涵盖大多数情况,我们只会对那些实际偏离默认值的元素产生很小的开销。
$(function() {
// click is still default event
// this object defines per element events that aren't just click
var extraDefaults = {
form: "submit"
};
var disable = function(evt) {
evt.preventDefault();
console.log("Prevented on " + evt.target.tagName);
};
$(".disable").each(function() {
var ctx = $(this);
ctx.bind(
// use inline-defined events
ctx.data("events") ||
// use extra defaults if present
extraDefaults[this.tagName.toLower()] ||
// just use default click event
"click",
disable);
});
});