如何重新启用 event.preventDefault?

IT技术 javascript jquery
2021-02-22 05:55:00

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

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

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

我使用以下方法成功地做到了这一点:

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

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

6个回答

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

按照要求

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

         ev.preventDefault();

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

  });
谢谢你的回答,你能给我一个例子来说明如何做到这一点。
2021-04-24 05:55:00
谢谢你。我基于它做了类似的事情来让谷歌分析工作。
2021-04-27 05:55:00
美丽、优雅的解决方案。非常感谢!
2021-04-29 05:55:00
最好的事情之一就是在需要时根据条件调用 preventDefault() 。虽然这是完全实现您所描述的唯一真正方法,但我鼓励您验证这是您问题的最佳解决方案。:)
2021-05-01 05:55:00
@Swivelgames 好的,但我的意思是,if (someLongRunningOperation()) {e.preventDefault();}因为这个原因肯定会失败;在写我的评论之前不久,我自己调试了这个问题。
2021-05-14 05:55:00

您可以使用以下代码执行 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 默认行为并保持某些元素可滚动的问题。凉爽的!
2021-04-25 05:55:00
function(e){ e.preventDefault();

和它的反面

function(e){ return true; }

干杯!

一个问题是,如果您想做的任何事情花费的时间太长(例如,进行 Ajax 调用),如果将其放在条件之后,您可能永远不会达到“return false”或“e.preventDefault()”。
2021-04-30 05:55:00
$('form').submit( function(e){

     e.preventDefault();

     //later you decide you want to submit
     $(this).trigger('submit');     or     $(this).trigger('anyEvent');
@我--谢谢!我修好了,打错字了
2021-04-16 05:55:00
错别字evvse$(this).trigger('submit')这里会遇到相同的e.preventDefault(). 这是一个糟糕的答案。
2021-05-10 05:55:00

使用异步操作(计时器、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);
}

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