如何解除调用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的!