如何(使用 jQuery)解除对正在调用 event.proventDefault()的侦听器的绑定?

Jquery 切换在默认情况下调用 proventDefault () ,因此默认值不起作用。 你不能点击复选框,你不能点击链接等等

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

254109 次浏览

在某些情况下 * 可以先用 return false代替 e.preventDefault(),然后在需要将缺省值还原为 return true时使用。

* 意思是当你不介意事件冒泡,你不使用 e.stopPropagation()e.preventDefault()一起

也请参见 类似的问题(也在堆栈溢出中)

或者在复选框的情况下,你可以有这样的东西:

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

恢复一个 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>

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

很简单

让我们假设你做了类似于

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

现在把它恢复到原来的情况,做下面的..。

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

从这个 网站

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

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

$(“ # content”) . on (‘ click’,’# place’,(function (event){ 返回确认(‘你确定要这样做吗?’) }) ;

基本上,“防止默认”意味着拦截和做其他事情: “确认”被设计用于... ... 良好确认!

就我而言:

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

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

从这里可以看到: https://stackoverflow.com/a/1673570/211514

残疾:

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

启用:

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

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

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

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

event.stopPropagation();

参考文献

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


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


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

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

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()});
$('#my_elementtt').click(function(event){
trigger('click');
});

实现这一点的最佳方法是使用名称空间。这是一种安全可靠的方法。给你。Rb 是一个名称空间,它确保 unbind 函数只能在特定的 keydown 上工作,而不能在其他键上工作。

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


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

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

Ref 2: http://jqfundamentals.com/chapter/events

如果它是一个链接,那么 $(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>

使用布尔值:

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

我在一个渐进式 Web 应用程序中使用这个功能,以防止在某些“页面”上滚动或缩放,同时允许其他页面滚动或缩放。

您可以设置为形式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();


});

Event 接口的 proventDefault ()方法告诉用户代理,如果事件没有得到显式处理,那么它的默认操作就不应该按照正常的方式执行。事件继续像往常一样传播,除非其中一个事件侦听器调用 stop  或 stop 立即传播() ,其中任何一个都会立即终止传播。

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

您可以使用 Event.Cancelable 来检查事件是否可取消。

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

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

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

这应该会奏效:

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

在 javaccript 中,你可以简单地喜欢这个

const form = document.getElementById('form');
form.addEventListener('submit', function(event){
event.preventDefault();


const fromdate = document.getElementById('fromdate').value;
const todate = document.getElementById('todate').value;


if(Number(fromdate) >= Number(todate)) {
alert('Invalid Date. please check and try again!');
}else{
event.currentTarget.submit();
}


});

作为还原默认操作的唯一方法使用。

$(’# some _ link’) . unbind () ;