132

jquery toggle 默认调用 preventDefault() ,因此默认值不起作用。你不能点击一个复选框,你不能点击一个链接等等

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

4

18 回答 18

84

就我而言:

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

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

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

于 2013-02-15T13:38:38.190 回答
59

它相当简单

让我们假设你做类似的事情

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

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

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

从这个网站

于 2011-11-14T05:21:51.400 回答
18

无法恢复 apreventDefault()但你能做的就是欺骗它:)

<div id="t1">Toggle</div>
<script type="javascript">
$('#t1').click(function (e){
   if($(this).hasClass('prevented')){
       e.preventDefault();
       $(this).removeClass('prevented');
   }else{
       $(this).addClass('prevented');
   }
});
</script>

如果您想更进一步,您甚至可以使用触发按钮来触发事件。

于 2011-01-06T17:11:54.517 回答
11
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

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

// UnBind:
$(element).off('click', DoPrevent);
于 2016-02-17T12:50:37.380 回答
9

在某些情况下*您最初可以return false代替e.preventDefault(), 然后当您想将默认值恢复为return true.

*意思是当你不介意事件冒泡并且你不使用的e.stopPropagation()时候e.preventDefault()

另见类似问题(也在堆栈溢出中)

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

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 
于 2009-10-12T20:26:38.117 回答
9

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

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

于 2014-12-04T15:43:05.290 回答
4

如果它是一个链接,那么$(this).unbind("click");将重新启用链接单击并恢复默认行为。

我创建了一个演示 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>
于 2017-02-03T12:41:55.207 回答
2

测试这段代码,我认为可以解决你的问题:

event.stopPropagation();

参考

于 2014-12-04T15:49:17.820 回答
2

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

$("#element").unbind();
于 2020-10-29T19:17:44.630 回答
2

最好的方法是使用命名空间。这是一种安全可靠的方式。这里 .rb 是确保 unbind 功能在该特定 keydown 上起作用但在其他键盘上不起作用的命名空间。

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

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

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

参考 2:http : //jqfundamentals.com/chapter/events

于 2017-01-23T09:58:27.500 回答
1

禁用:

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

使能够:

document.ontouchstart = function(e){ return true; }
于 2013-06-13T14:38:33.613 回答
1

Event 接口的 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.
    }
}
于 2020-05-08T19:47:36.727 回答
0

使用布尔值:

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

我在 Progressive Web App 中使用它来防止在某些“页面”上滚动/缩放,同时允许在其他页面上滚动/缩放。

于 2017-02-15T07:21:23.177 回答
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();

});
于 2017-08-22T10:33:10.953 回答
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()});
于 2016-04-15T15:36:29.280 回答
-2

这应该有效:

$('#myform').on('submit',function(e){
    if($(".field").val()==''){
        e.preventDefault();
    }
}); 
于 2021-06-11T19:30:13.783 回答
-3
$('#my_elementtt').click(function(event){
    trigger('click');
});
于 2016-06-30T20:26:50.643 回答
-10

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

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

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

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

于 2013-01-23T14:25:07.723 回答