evt.preventDefault()的反义词是什么?


184

触发后evt.preventDefault(),如何再次恢复默认操作?


3
我认为通常会运行您的函数,然后运行默认行为,因此,您永远不会首先调用evt.preventDefault()
Prescott


2
@Nobita-我不太确定...一个特定于jQuery。
gilly3 2011年

1
哇,谢谢您的快速回应!但我的问题是,我不是触发evt.preventDefault();的人。我正在灯箱中运行第3方Flash应用程序。当我关闭灯箱时,以某种方式停止滚动页面的鼠标滚轮。在做一些研究时,我发现此Flash应用程序由于具有缩放功能而禁用了页面滚动。所以现在我试图在应用关闭后恢复页面滚动。也许我可以调用某些方法来恢复鼠标滚轮事件?
Bryan

Answers:


90

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

evt.preventDefault();

可能:

从本质上讲,它等同于“默认”,因为我们不再阻止它。

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

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

如何重新启用event.preventDefault?

请注意,第二个示例已被redsquare提供的示例解决方案接受(如果未将其作为重复项关闭,请在此处发布直接解决方案):

$('form').submit( function(ev) {
     ev.preventDefault();
     //later you decide you want to submit
     $(this).unbind('submit').submit()
});

1
这个完美地解决了我的问题。感谢您提供该代码段!
乔登·戴维森

谢谢!在这方面我花了一段时间(我需要停止并检查几件事,然后再提交表单,在某些情况下不提交,在其他情况下提交)。
凯瑟琳·奥斯本

1
它确实有效,但是我不明白为什么下一个表单提交再次调用该函数,我认为它肯定会取消绑定,但是看起来它仅对当前调用取消绑定...我无法解释,它确实正是我想要的,但这不是我所期望的。
Vadorequest '18 -10-13

1
一个聪明而快速的解决方案。喜欢它:)
ahmednawazbutt

53
function(evt) {evt.preventDefault();}

与之相反

function(evt) {return true;}

干杯!


8
这对我有用,但我想知道是否有人可以更好地解释原因?
edhedges

11
这不会撤消preventDefault(),实际上它的作用与您忽略return true:none相同。
br4nnigan

19

要在继续执行clickjQuery中事件链接之前处理命令:

例如: <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();


3
是的,但这是假设preventDefault是一个链接,而不是在文档正文上说touchmove。
曼谷人

4
这不是问题要问的。
马特·弗莱彻

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

在这种情况下,另一个选择可能是使用输入type =“ button”并绑定到click事件,而不是使用输入type =“ submit”并绑定到Submit事件。
2013年

8

好 !它适用于click事件:

$("#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 !

});


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/


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()–您也可以尝试删除事件,这些事件本质上可以实现相同的目的。


4

这里有用的东西...

首先,我们将单击链接,运行一些代码,然后我们将执行默认操作。使用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>

2

这是我用来设置的:

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

并撤消它:

$("body").unbind("touchmove");

2

这里没有任何解决方案对我有帮助,我这样做是为了解决我的情况。

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

和功能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();
}

2

我认为“相反”是模拟事件。你可以用.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');

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

现在,通过使用命名空间,您可以添加多个此类事件,并能够根据需要删除这些事件。.虽然提交不是最好的示例,但单击或按键等操作可能会派上用场。


1

这不是问题的直接答案,但可能会对某人有所帮助。我的观点是,仅根据某些条件调用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

});


0

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

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

var defaultEvent=evt.target;

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

if("true")
{
//activate default event..
location.href(defaultEvent);
}

0

您始终可以在脚本中的某些click事件上使用此附件:

location.href = this.href;

用法示例为:

jQuery('a').click(function(e) {
    location.href = this.href;
});

-1

在我使用以下代码后,该代码为我重新实例化了该事件:

event.preventDefault(); to disable the event.


event.preventDefault = false;

-2

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

$('a').bind('click', function(e) {
  e.stopPropagation();
});

2
如jQuery API文档中所述,这可以防止事件使DOM树冒泡,从而防止任何父处理程序收到该事件的通知。这与/的相反或相反event.preventDefault()
2015年

2
这也不是问题所要问的。
马特·弗莱彻
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.