如何解除调用event.preventDefault()(使用jQuery)的侦听器?

jQuery的切换调用preventDefault()默认情况下,所以默认值不起作用。 你不能点击checkbox,你不能点击链接等

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

在我的情况下:

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

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

在这里看到: https : //stackoverflow.com/a/1673570/211514

它相当简单

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

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

现在恢复到原来的情况,做下面…

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

从这个网站 。

这是不可能恢复一个preventDefault()但你可以做的就是欺骗它:)

 <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> 

如果你想更进一步,你甚至可以使用触发button触发一个事件。

在某些情况下*你可以初始化return false而不是e.preventDefault() ,然后当你想恢复默认值时return true

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

也看到类似的问题 (也在堆栈溢出)

或在checkbox的情况下,你可以有这样的事情:

 $(element).toggle(function(){ $(":checkbox").attr('disabled', true); }, function(){ $(":checkbox").removeAttr('disabled'); }) 
 function DoPrevent(e) { e.preventDefault(); e.stopPropagation(); } // Bind: $(element).on('click', DoPrevent); // UnBind: $(element).off('click', DoPrevent); 

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

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

禁用:

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

启用:

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

testing这个代码,我想解决你的问题:

 event.stopPropagation(); 

参考

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

我已经创build了一个演示JS小提琴演示如何工作:

这里是JS小提琴的代码:

HTML:

 <script src="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> 

我遇到了一个问题,只有在某些自定义操作(在表单上启用了其他禁用的input字段)之后,才需要默认操作。 我将默认动作(submit())封装到一个自己的recursion函数(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()}); 

通过使用名称空间来做到这一点的最好方法。 这是一个安全可靠的方法。 这里的.rb是确保解除绑定函数在特定的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

使用布尔值:

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

我在渐进式Web应用程序中使用这个function来防止在某些“页面”上滚动/缩放,同时允许在其他页面上进行滚动/缩放。

你可以设置2个class。 将JS脚本设置为其中一个脚本后,如果要禁用脚本,只需从该窗体中删除具有绑定脚本的类即可。

HTML:

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

JS

 $(document).on('submit', '.form-create', function(){ ..... ..... ..... $('.form-create-container').removeClass('form-create').submit(); }); 
 $('#my_elementtt').click(function(event){ trigger('click'); }); 

我不知道你是什么意思,但这是一个类似的(也可能是相同的)问题的解决scheme…

我经常使用preventDefault()来拦截项目。 但是:这不是唯一的拦截方法…通常情况下,您可能只需要一个“问题”,继续执行之前的行为或停止。 在最近的情况下,我使用了以下解决scheme:

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

基本上,“防止违约”是为了拦截并做一些其他的事情:“确认”是为了…确认而devise的!