如何重新启用event.preventDefault?


79

我有一个网页,禁止所有提交按钮上的默认操作,但是我想重新启用按钮上的默认提交操作,我该怎么做?

我目前正在使用以下命令阻止默认操作:

$("form").bind("submit", function(e){
e.preventDefault();
});

我已经使用以下方法成功完成了此操作:

$(document).ready(function(){
$("form:not('#press')").bind("submit", function(e){
e.preventDefault();
});

但是单击按钮时可以动态地执行此操作吗?


Answers:


123

您将必须取消绑定该事件,然后重新绑定到一个不会阻止Default的单独事件,或者稍后在取消绑定后自己在方法中调用default事件。没有神奇的事件。cancelled= false;

按照要求

 $('form').submit( function(ev){

         ev.preventDefault();

         //later you decide you want to submit
         $(this).unbind('submit').submit()

  });

感谢您的回答,能否给我一个示例。
Richbits

3
最好的事情之一就是根据需要根据需要调用preventDefault()。尽管这是实现您所描述的唯一真实方法,但我鼓励您确认这是解决问题的最佳方法。:)
旋转

谢谢你 我基于它做了类似的事情来使谷歌分析工作。
德里克(Derek)

美丽,优雅的解决方案。非常感谢!
库珀·丸山

1
@Swivelgames好的,但是我的意思是if (someLongRunningOperation()) {e.preventDefault();}肯定会因为这个原因而失败;在写我的评论之前不久,我自己调试了这个问题。
Casey

13

您可以按照以下代码执行redsquare的建议:

function preventDefault(e) {
    e.preventDefault();
}
$("form").bind("submit", preventDefault);

// later, now switching back
$("form#foo").unbind("submit", preventDefault);

或者,只要允许提交,就分配表单属性。像这样:

function preventDefault(e) {
    if (event.currentTarget.allowDefault) {
        return;
    }
    e.preventDefault();
}
$("form").bind("submit", preventDefault);

// later, now allowing submissions on the form
$("form#foo").get(0).allowDefault = true;

很棒的简单解决方案!这解决了我为弹性体滚动打开/关闭iOS默认行为并保持某些元素可滚动的问题。凉!
Garavani 2014年

5
function(e){ e.preventDefault();

与之相反

function(e){ return true; }

干杯!


1
一个问题是,如果您想做的任何事情都花费太长时间(例如,进行Ajax调用),那么如果将其放在条件后面,则可能永远不会达到“返回假”或“ e.preventDefault()”的状态。
Casey 2014年

1
$('form').submit( function(e){

     e.preventDefault();

     //later you decide you want to submit
     $(this).trigger('submit');     or     $(this).trigger('anyEvent');

4
错字evvse$(this).trigger('submit')这里会碰到相同的e.preventDefault()。这是一个不好的答案。
2015年

@i-谢谢!我修复了它,这是一个错字
adardesign

1

使用异步操作(计时器,ajax),您可以isDefaultPrevented像这样覆盖属性:

$('a').click(function(evt){
  e.preventDefault();

  // in async handler (ajax/timer) do these actions:
  setTimeout(function(){
    // override prevented flag to prevent jquery from discarding event
    evt.isDefaultPrevented = function(){ return false; }
    // retrigger with the exactly same event data
    $(this).trigger(evt);
  }, 1000);
}

这是使用完全相同的数据重新触发事件的最完整方法。


0

我最近有一个类似的问题。我有一个表单和PHP函数,在表单提交后即可运行。但是,我需要先运行JavaScript。

        // This variable is used in order to determine if we already did our js fun
        var window.alreadyClicked = "NO"
        $("form:not('#press')").bind("submit", function(e){
            // Check if we already run js part
            if(window.alreadyClicked == "NO"){
                // Prevent page refresh
                e.preventDefault();
                // Change variable value so next time we submit the form the js wont run
                window.alreadyClicked = "YES"
                // Here is your actual js you need to run before doing the php part
                xxxxxxxxxx

                // Submit the form again but since we changed the value of our variable js wont be run and page can reload (and php can do whatever you told it to)
                $("form:not('#press')").submit()
            } 
        });

-3

您可以通过添加重新激活操作

this.delegateEvents();  // Re-activates the events for all the buttons

如果将其添加到主干js视图的render函数中,则可以根据需要使用event.preventDefault()。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.