javascript - 是否可以一次为元素的所有事件分配阻止默认值?

标签 javascript jquery events

<分区>

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);
    });
});

关于javascript - 是否可以一次为元素的所有事件分配阻止默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12213971/

相关文章:

javascript - 在React功能组件中,在鼠标悬停时加载react-bootstrap的下拉数据,而不是在鼠标单击时加载?

javascript - 检索多个数据属性并设置为子元素的文本

jquery - Bootstrap 日期选择器选项不起作用

javascript - 当我在提交按钮级别停止传播时,为什么会触发表单提交事件?

events - Logstash:在过滤器中创建新事件

javascript - 如何在单击/提交提交按钮时先执行 php 函数然后执行 javascript 函数

javascript - 使用由两个 .map() 组成的两个数组创建一个变量,寻找匹配项或交集

javascript - 如何检查一个表是否有具有特定ID的jquery行

database-design - 最佳实践 - 记录事件(一般)和更改(数据库)

javascript - 类属性在选择选项javascript中不起作用