215

一旦我解雇了一个evt.preventDefault(),我怎样才能再次恢复默认操作?

4

19 回答 19

100

根据@Prescott 的评论,与以下相反:

evt.preventDefault();

可能:

本质上等同于'do default',因为我们不再阻止它。

否则,我倾向于向您指出其他评论和答案提供的答案:

如何取消绑定正在调用 event.preventDefault() 的侦听器(使用 jQuery)?

如何重新启用 event.preventDefault?

请注意,第二个已被 redsquare 给出的示例解决方案接受(在此处发布以获取直接解决方案,以防不作为重复而关闭):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});
于 2011-04-13T15:47:27.293 回答
55
function(evt) {evt.preventDefault();}

和它的相反

function(evt) {return true;}

干杯!

于 2011-11-19T17:48:48.410 回答
24

click要在 jQuery 中从事件继续链接之前处理命令:

例如:<a href="http://google.com/" class="myevent">Click me</a>

使用 jQuery 预防和跟进:

$('a.myevent').click(function(event) {
    event.preventDefault();

    // Do my commands
    if( myEventThingFirst() )
    {
      // then redirect to original location
      window.location = this.href;
    }
    else
    {
      alert("Couldn't do my thing first");
    }
});

或者干脆在window.location = this.href;后面跑preventDefault();

于 2014-06-20T02:45:17.573 回答
11

好的 !它适用于点击事件:

$("#submit").click(function(e){ 

   e.preventDefault();

  -> block the click of the sumbit ... do what you want

$("#submit").unbind('click').click(); // the html click submit work now !

});
于 2016-07-28T00:03:37.290 回答
11
event.preventDefault(); //or event.returnValue = false;

及其相反(标准):

event.returnValue = true;

来源: https ://developer.mozilla.org/en-US/docs/Web/API/Event/returnValue

于 2018-12-25T21:15:33.213 回答
8

为了执行异步调用,我不得不延迟 jQuery 中的表单提交。这是简化的代码...

$("$theform").submit(function(e) {
    e.preventDefault();
    var $this = $(this);
    $.ajax('/path/to/script.php',
        {
        type: "POST",
        data: { value: $("#input_control").val() }
    }).done(function(response) {
        $this.unbind('submit').submit();
    });
});
于 2013-04-05T04:46:56.083 回答
5

这里有一些有用的...

首先,我们将单击链接,运行一些代码,然后我们将执行默认操作。这将可以使用event.currentTarget来看看。在这里,我们将尝试在新选项卡上访问 Google,但在我们需要运行一些代码之前。

<a href="https://www.google.com.br" target="_blank" id="link">Google</a>

<script type="text/javascript">
    $(document).ready(function() {
        $("#link").click(function(e) {

            // Prevent default action
            e.preventDefault();

            // Here you'll put your code, what you want to execute before default action
            alert(123); 

            // Prevent infinite loop
            $(this).unbind('click');

            // Execute default action
            e.currentTarget.click();
        });
    });
</script>
于 2018-06-14T04:05:54.160 回答
4

我建议以下模式:

document.getElementById("foo").onsubmit = function(e) {
    if (document.getElementById("test").value == "test") {
        return true;
    } else {
        e.preventDefault();
    }
}

<form id="foo">
    <input id="test"/>
    <input type="submit"/>
</form>

...除非我错过了什么。

http://jsfiddle.net/DdvcX/

于 2011-04-13T15:50:33.203 回答
4

没有相反的方法event.preventDefault()可以理解为什么您首先必须查看event.preventDefault()调用它时的作用。

在底层,preventDefault 的功能本质上是调用 return false 来停止任何进一步的执行。如果您熟悉 Javascript 的旧方法,曾经流行使用 return false 来取消表单提交和使用 return true 的按钮之类的事件(甚至在 jQuery 出现之前)。

正如您可能已经根据上面的简单解释得出的那样:反义词event.preventDefault()是什么。您只是不阻止该事件,默认情况下,如果您不阻止该事件,浏览器将允许该事件。

请参阅下面的说明:

;(function($, window, document, undefined)) {

    $(function() {
        // By default deny the submit
        var allowSubmit = false;

        $("#someform").on("submit", function(event) {

            if (!allowSubmit) {
                event.preventDefault();

                // Your code logic in here (maybe form validation or something)
                // Then you set allowSubmit to true so this code is bypassed

                allowSubmit = true;
            }

        });
    });

})(jQuery, window, document);

在上面的代码中,您会注意到我们正在检查 allowSubmit 是否为 false。这意味着我们将阻止我们的表单提交event.preventDefault,然后我们将执行一些验证逻辑,如果我们满意,将 allowSubmit 设置为 true。

这确实是唯一有效的相反方法event.preventDefault()——您也可以尝试删除事件,这基本上可以达到同样的效果。

于 2018-06-01T10:39:13.200 回答
4

这是我用来设置它的:

$("body").on('touchmove', function(e){ 
    e.preventDefault(); 
});

并撤消它:

$("body").unbind("touchmove");
于 2018-03-12T20:49:15.867 回答
3

我认为“相反”是模拟一个事件。你可以使用.createEvent()

以 Mozilla 为例:

function simulateClick() {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);
  var cb = document.getElementById("checkbox"); 
  var cancelled = !cb.dispatchEvent(evt);
  if(cancelled) {
    // A handler called preventDefault
    alert("cancelled");
  } else {
    // None of the handlers called preventDefault
    alert("not cancelled");
  }
}

参考:document.createEvent


jQuery.trigger()让您可以触发元素上的事件——有时很有用。

$('#foo').bind('click', function() {
      alert($(this).text());
});

$('#foo').trigger('click');
于 2011-04-13T15:45:47.040 回答
3

这不是问题的直接答案,但它可能对某人有所帮助。我的观点是您仅根据某些条件调用 preventDefault() ,因为如果您在所有情况下都调用 preventDefault() ,则没有发生事件的意义。因此,只有在满足条件时才具有 if 条件并调用 preventDefault() 才能在其他情况下以通常的方式工作。

$('.btnEdit').click(function(e) {

   var status = $(this).closest('tr').find('td').eq(3).html().trim();
   var tripId = $(this).attr('tripId');

  if (status == 'Completed') {

     e.preventDefault();
     alert("You can't edit completed reservations");

 } else if (tripId != '') {

    e.preventDefault();
    alert("You can't edit a reservation which is already attached to a trip");
 }
 //else it will continue as usual

});
于 2020-03-28T05:32:41.893 回答
2

None of the solutions helped me here and I did this to solve my situation.

<a onclick="return clickEvent(event);" href="/contact-us">

And the function clickEvent(),

function clickEvent(event) {
    event.preventDefault();
    // do your thing here

    // remove the onclick event trigger and continue with the event
    event.target.parentElement.onclick = null;
    event.target.parentElement.click();
}
于 2019-01-12T20:32:19.843 回答
1

jquery on()可能是另一个解决方案。尤其是涉及到命名空间的使用。

jquery on() 只是当前绑定事件的方式(而不是 bind() )。off() 是取消绑定这些。当您使用命名空间时,您可以添加和删除多个不同的事件。

$( selector ).on("submit.my-namespace", function( event ) {
    //prevent the event
    event.preventDefault();

    //cache the selector
    var $this = $(this);

    if ( my_condition_is_true ) {
        //when 'my_condition_is_true' is met, the binding is removed and the event is triggered again.
        $this.off("submit.my-namespace").trigger("submit");
    }
});

现在使用命名空间,您可以添加多个这些事件并能够删除这些事件,具体取决于您的需要。虽然提交可能不是最好的例子,但这可能会在点击或按键或其他任何东西时派上用场。

于 2017-07-04T15:38:44.410 回答
0

您可以在“preventDefault”方法之后使用它

//这里evt.target返回默认事件(例如:defult url等)

var defaultEvent=evt.target;

//这里我们保存默认事件..

if("true")
{
//activate default event..
location.href(defaultEvent);
}
于 2014-06-09T07:06:18.940 回答
0

您始终可以将其附加到脚本中的某些单击事件:

location.href = this.href;

用法示例是:

jQuery('a').click(function(e) {
    location.href = this.href;
});
于 2017-12-05T18:17:16.917 回答
0

在同步流中,e.preventDefault()仅在需要时调用:

a_link.addEventListener('click', (e) => {
   if( conditionFailed ) {
      e.preventDefault();
      // return;
   }

   // continue with default behaviour i.e redirect to href
});

在异步流程中,您有很多方法,但一种很常见的方法是使用window.location

a_link.addEventListener('click', (e) => {
     e.preventDefault(); // prevent default any way

     const self = this;

     call_returning_promise()
          .then(res => {
             if(res) {
               window.location.replace( self.href );
             }
          });
});

您可以通过使用确保上述流程同步async-await

于 2021-05-20T14:16:10.593 回答
-1

在我使用后,这段代码可以让我重新实例化事件:

event.preventDefault(); to disable the event.


event.preventDefault = false;
于 2017-12-12T07:12:28.913 回答
-2

我使用了以下代码。这对我来说可以。

$('a').bind('click', function(e) {
  e.stopPropagation();
});
于 2014-07-10T04:48:50.667 回答