Javascript 如何解除调用event.preventDefault()的侦听器的绑定(使用jQuery)?
默认情况下,jquery toggle调用preventDefault(),因此默认值不起作用。 你不能点击复选框,不能点击链接等等Javascript 如何解除调用event.preventDefault()的侦听器的绑定(使用jQuery)?,javascript,jquery,events,preventdefault,event-bubbling,Javascript,Jquery,Events,Preventdefault,Event Bubbling,默认情况下,jquery toggle调用preventDefault(),因此默认值不起作用。 你不能点击复选框,不能点击链接等等 是否可以还原默认处理程序?在某些情况下*您可以先返回false而不是e.preventDefault(),然后在希望将默认值还原为时返回true *这意味着当您不介意事件冒泡并且不将e.stopPropagation()与e.preventDefault()一起使用时 另请参见(也在堆栈溢出中) 或者在复选框的情况下,您可以有如下内容: $(element).to
是否可以还原默认处理程序?在某些情况下*您可以先
返回false
而不是e.preventDefault()
,然后在希望将默认值还原为时返回true
*这意味着当您不介意事件冒泡并且不将e.stopPropagation()
与e.preventDefault()一起使用时
另请参见(也在堆栈溢出中)
或者在复选框的情况下,您可以有如下内容:
$(element).toggle(function(){
$(":checkbox").attr('disabled', true);
},
function(){
$(":checkbox").removeAttr('disabled');
})
无法还原preventDefault()
,但您可以做的是:
切换
$('#t1')。单击(函数(e){
if($(this).hasClass('prevented')){
e、 预防默认值();
$(this.removeClass('prevented');
}否则{
$(this.addClass('prevented');
}
});
如果您想更进一步,您甚至可以使用触发器按钮来触发事件。这相当简单
假设你做了类似的事情
document.ontouchmove = function(e){ e.preventDefault(); }
现在要恢复到原来的状态,请执行以下操作
document.ontouchmove = function(e){ return true; }
从这里。我不确定你是什么意思:但这里有一个类似(可能是相同)问题的解决方案
我经常使用preventDefault()截取项目。然而:这不是唯一的拦截方法。。。通常情况下,您可能只需要一个“问题”,然后行为会像以前一样继续或停止。
在最近的一个案例中,我使用了以下解决方案:
$(“#内容”)。在('单击','替换',(函数(事件){
return confirm('您确定要这样做吗?')
}));代码>
基本上,“防止默认”是指拦截和做其他事情:“确认”是为在。。。好的,确认一下 就我而言:
$('#some_link').click(function(event){
event.preventDefault();
});
$('some#u link')。解除绑定('click')代码>是恢复默认操作的唯一方法
如图所示:禁用:
document.ontouchstart = function(e){ e.preventDefault(); }
启用:
document.ontouchstart = function(e){ return true; }
通过执行以下操作,可以恢复默认操作(如果是HREF follow):
window.location=$(this.attr('href')代码>测试此代码,我认为可以解决您的问题:
event.stopPropagation();
我遇到了一个问题,在某些自定义操作(启用表单上禁用的输入字段)结束后,我才需要默认操作。我将默认操作(submit())包装到自己的递归函数(dosubmit())中
最好的方法是使用名称空间。这是一种安全可靠的方式。rb是一个名称空间,它确保unbind函数在特定的keydown上工作,但在其他keydown上不工作
$(document).bind('keydown.rb','Ctrl+r',function(e){
e.stopImmediatePropagation();
return false;
});
$(document).unbind('keydown.rb');
参考文献1:
参考2:如果它是一个链接,那么$(这个)。解除绑定(“单击”)代码>
将重新启用链接单击,并恢复默认行为
我创建了,以演示其工作原理:
以下是JS fiddle的代码:
HTML:
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>
var计数器=1;
$(文档).ready(函数(){
$(“a”)。单击(函数(事件){
event.preventDefault();
$( "" )
.append(“默认”+事件类型+“阻止”+计数器)
.附于(“#log”);
如果(计数器==2)
{
$( "" )
.append(“现在启用单击”)
.附于(“#log”);
$(this).unbind(“click”);//----此代码解除e.preventDefault()的绑定并恢复链接单击行为
}
其他的
{
$( "" )
.append(“仍然禁用”)
.附于(“#log”);
}
计数器++;
});
});
使用布尔值:
let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) {
if (prevent_touch) event.preventDefault();
}
我在渐进式Web应用程序中使用此选项,以防止在某些“页面”上滚动/缩放,同时允许在其他页面上滚动/缩放。您可以设置为form 2类。将JS脚本设置为其中一个脚本后,如果要禁用脚本,只需从该表单中删除带有绑定脚本的类
$(document).bind('keydown.rb','Ctrl+r',function(e){
e.stopImmediatePropagation();
return false;
});
$(document).unbind('keydown.rb');
HTML:
<form class="form-create-container form-create"> </form>
事件接口的preventDefault()方法告诉用户代理,如果事件没有得到显式处理,则不应像通常那样执行其默认操作。事件继续像往常一样传播,除非它的一个事件侦听器调用StopRopagation()或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.
}
}
如果元素只有一个处理程序,那么只需使用jqueryunbind
$("#element").unbind();
这应该起作用:
$('#myform').on('submit',function(e){
if($(".field").val()==''){
e.preventDefault();
}
});
你能给出一些示例代码吗?标题中的问题非常棒!太糟糕了,实际问题不是。。。我希望在这里找到答案,在调用preventDefault
后,我们如何(如果可能的话)解除它的影响。目前,这个问题实际上是“如何使用jQuery解除事件侦听器的绑定?”。我很确定这是一个问题——我最近在一个设计中这样做了。首先,我点击一个按钮,通过在touchmove事件中添加e.preventDefault来阻止iphone中的滚动,然后在动画完成后,我返回true,它像一个符咒一样工作。想法是对的,但开箱即用的代码对我不起作用(除非它只是jquery中的语法更改),我使用了:window.location=$(this.attr('href'));此解决方案在$('#a_链接')之后不起作用。单击(函数(e){e.preventDefault();});使用解除绑定功能。您提供的链接已断开。它对我的作用是:$(document).off('touchmove')$(document).on('touchmove',function(){return true;});如果此元素有另一个单击处理程序,则将解除所有附加事件的绑定,不仅是阻止的处理程序…还必须停止在阻止默认值的处理程序之前发生的处理程序上的ropagation。
<form class="form-create-container form-create"> </form>
$(document).on('submit', '.form-create', function(){
..... ..... .....
$('.form-create-container').removeClass('form-create').submit();
});
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.
}
}
$("#element").unbind();
$('#myform').on('submit',function(e){
if($(".field").val()==''){
e.preventDefault();
}
});