一旦我触发了event . preventdefault(),我如何再次恢复默认操作?


当前回答

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

其他回答

为了执行异步调用,我不得不在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();
    });
});

我建议采用以下模式:

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/

你可以在你的脚本中使用这个附加到一些点击事件:

location.href = this.href;

用法示例如下:

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

这是我用来设置的:

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

要撤消它:

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

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

现在,通过使用命名空间,您可以添加多个这样的事件,并能够根据您的需要删除它们。虽然提交可能不是最好的例子,但这可能在点击或按键或其他方面派上用场。