【问题标题】:jQuery event.preventDefault() don't work unless debugging除非调试,否则 jQuery event.preventDefault() 不起作用
【发布时间】:2015-06-17 20:51:01
【问题描述】:

我正在尝试使用 this 方法将 GET 参数转换为 POST。即使单击鼠标中键,我也希望正确处理锚点。

这就是我绑定事件处理程序的方式:

$(document).ready(function () {
    $(".post").each(function(){
        $(this).mousedown(function(evt){
            switch(evt.which){
                case 1:
                case 2:
                    evt.stopPropagation();
                    evt.preventDefault();
                    get2post(evt);
                    break;
            }
        });
    });
});

当我点击.post 锚点时,浏览器会发送 POST 请求,然后立即中止它,转而发送本应阻止的 GET 请求。

(请不要介意处理 GET 请求时发生的错误。这正是因为应该通过 POST 发送参数,而不是 GET)

最后,当我调试get2post 函数时,它按预期工作。我不知道为什么evt.preventDefault() 行仅在调试时有效。

我在 Firefox 和 Chrome 上进行了尝试,得到了相同的结果。这里发生了什么?为什么 evt.preventDefault() 除非调试才能工作?

【问题讨论】:

    标签: javascript jquery events javascript-events event-handling


    【解决方案1】:

    anchorbuttoninputmousedown 事件上没有默认行为。您想改为阻止 click 事件的默认行为。

    $(function () {
        $('.post').on('click', function (evt) {
            switch (evt.which) {
                case 1:
                case 2:
                    evt.stopPropagation();
                    evt.preventDefault();
                    get2post(evt);
                    break;
            }
        });
    });
    

    【讨论】:

    • 您的解决方案有效,但仅在单击左按钮时才有效。中间按钮打开一个新选项卡并通过 GET 发送参数。
    • 我无法实际测试它。调试它,看看发生了什么。也许只需使用:$('.post').on('click', function (evt) {get2post(evt); return false;});
    • 同样的结果。我有一个想法:处理“在新选项卡中打开”时的浏览器行为可能会绕过 javascript;它只是获取 URL(使用 GET 参数)并打开一个新的。这个假设是合理的,因为单击中间按钮时甚至没有执行代码。也许在每种情况下都没有将 GET 参数转换为 POST 的安全方法;左键单击时可以使用,但中键单击时无效。更糟糕的是,由于这是一种浏览器行为,每个供应商可能以不同的方式实现此功能。
    • 您无法更改某些默认浏览器行为,并且无论如何打开的任何新选项卡都必须是 GET 请求,这就是 http 协议的工作方式。现在也可以禁用上下文菜单:$('.post').on('click contextmenu', handler);
    • 我担心如果中间点击不起作用,它可能会混淆一些用户。这是因为建议他们在新选项卡中打开链接,以便同时使用这两个页面。看来我必须使用表单和按钮,因此在这种特殊情况下无需覆盖上下文菜单。但是感谢您的提示,下一步是禁用上下文菜单。
    猜你喜欢
    • 2014-01-19
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多