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

时间:2009-10-11 18:30:45

标签: javascript jquery events preventdefault event-bubbling

默认情况下,jquery切换调用preventDefault(),因此默认设置不起作用。 你不能点击一个复选框,你不能点击链接等等

是否可以恢复默认处理程序?

18 个答案:

答案 0 :(得分:77)

就我而言:

$('#some_link').click(function(event){
    event.preventDefault();
});

$('#some_link').unbind('click');是恢复默认操作的唯一方法。

正如此处所见:https://stackoverflow.com/a/1673570/211514

答案 1 :(得分:55)

非常简单

让我们假设你做了类似

的事情
document.ontouchmove = function(e){ e.preventDefault(); }

现在要将其恢复到原来的状态,请执行以下操作...

document.ontouchmove = function(e){ return true; }

来自website

答案 2 :(得分:16)

答案 3 :(得分:11)

function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

// Bind:
$(element).on('click', DoPrevent);

// UnBind:
$(element).off('click', DoPrevent);

答案 4 :(得分:9)

在某些情况下*您最初可以return false而不是e.preventDefault(),然后当您要将默认值恢复为return true时。

*当您不介意事件冒泡并且未将e.stopPropagation()e.preventDefault()一起使用时的含义

另见similar question(也在堆栈溢出中)

或者在复选框的情况下,您可以使用以下内容:

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 

答案 5 :(得分:8)

您可以通过执行以下操作恢复默认操作(如果是HREF跟随):

window.location = $(this).attr('href');

答案 6 :(得分:2)

测试此代码,我认为解决您的问题:

event.stopPropagation();

Reference

答案 7 :(得分:2)

使用命名空间执行此操作的最佳方法。这是一种安全可靠的方式。这里.rb是命名空间,它确保unbind函数可以在特定的keydown上运行,但不能在其他keydown上运行。

$(document).bind('keydown.rb','Ctrl+r',function(e){
            e.stopImmediatePropagation();
            return false;
        });

$(document).unbind('keydown.rb');

ref1:http://idodev.co.uk/2014/01/safely-binding-to-events-using-namespaces-in-jquery/

ref2:http://jqfundamentals.com/chapter/events

答案 8 :(得分:2)

如果是链接,则 $(this).unbind("click"); 会重新启用链接点击,系统会恢复默认行为。

我创建了 a demo JS fiddle 来演示其工作原理:

以下是JS小提琴的代码:

HTML:

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<a href="http://jquery.com">Default click action is prevented, only on the third click it would be enabled</a>
<div id="log"></div>

使用Javascript:

<script>
var counter = 1;
$(document).ready(function(){
$( "a" ).click(function( event ) {
  event.preventDefault();

  $( "<div>" )
    .append( "default " + event.type + " prevented "+counter )
    .appendTo( "#log" );

    if(counter == 2)
    {
        $( "<div>" )
    .append( "now enable click" )
    .appendTo( "#log" );

    $(this).unbind("click");//-----this code unbinds the e.preventDefault() and restores the link clicking behavior
    }
    else
    {
        $( "<div>" )
    .append( "still disabled" )
    .appendTo( "#log" );
    }
    counter++;
});
});
</script>

答案 9 :(得分:1)

如果元素只有一个处理程序,则只需使用jQuery unbind。

$("#element").unbind();

答案 10 :(得分:1)

禁用:

document.ontouchstart = function(e){ e.preventDefault(); }

启用:

document.ontouchstart = function(e){ return true; }

答案 11 :(得分:1)

事件接口的preventDefault()方法告诉用户代理,如果未明确处理事件,则不应像通常那样采取其默认操作。该事件将继续像往常一样传播,除非事件监听器之一调用stopPropagation()或stopImmediatePropagation(),它们中的任何一个都会立即终止传播。

在事件流的任何阶段调用preventDefault()都会取消事件,这意味着实现通常不会由于事件而执行任何默认操作。

您可以使用Event.cancelable检查事件是否可取消。对于不可取消的事件调用preventDefault()无效。

window.onKeydown = event => {
    /*
        if the control button is pressed, the event.ctrKey 
        will be the value  [true]
    */

    if (event.ctrKey && event.keyCode == 83) {
        event.preventDefault();
        // you function in here.
    }
}

答案 12 :(得分:0)

我遇到了一个问题,即只有在某些自定义操作(在表单上启用了其他禁用的输入字段)结束后才需要默认操作。我将默认操作(submit())包装到一个自己的递归函数中(dosubmit())。

var prevdef=true;
var dosubmit=function(){
    if(prevdef==true){
        //here we can do something else first//
        prevdef=false;
        dosubmit();
    }
    else{
        $(this).submit();//which was the default action
    }
};

$('input#somebutton').click(function(){dosubmit()});

答案 13 :(得分:0)

您可以设置为2个类。将JS脚本设置为其中一个后,如果要禁用脚本,只需从此表单中删除带有绑定脚本的类。

HTML:

<form class="form-create-container form-create"> </form>   

JS

$(document).on('submit', '.form-create', function(){ 
..... ..... ..... 
$('.form-create-container').removeClass('form-create').submit();

});

答案 14 :(得分:0)

使用布尔值:

let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) { 
    if (prevent_touch) event.preventDefault(); 
}

我在渐进式网络应用程序中使用它来防止滚动/缩放某些页面&#39;允许其他人。

答案 15 :(得分:-2)

这应该有效:

$('#myform').on('submit',function(e){
    if($(".field").val()==''){
        e.preventDefault();
    }
}); 

答案 16 :(得分:-3)

let helperPath = (NSBundle.mainBundle().pathForResource("App Helper", ofType: "app"))!

let task = NSTask()
task.launchPath = "/usr/bin/open"
task.arguments = ["-a", helperPath, --args", "-admin_url", site.url, "-login", site.login, "-pass", site.password]

task.launch()

答案 17 :(得分:-10)

我不确定你是什么意思:但这是一个类似(可能是同样的)问题的解决方案......

我经常使用preventDefault()拦截项目。但是:它不是唯一的拦截方法......通常你可能只想要一个“问题”,然后继续像以前那样行为,或者停止。 在最近的一个案例中,我使用了以下解决方案:

$("#content").on('click', '#replace', (function(event){ return confirm('Are you sure you want to do that?') }));

基本上,“防止默认”意味着拦截并做其他事情:“确认”旨在用于...确认!