Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解除调用event.preventDefault()的侦听器的绑定(使用jQuery)?_Javascript_Jquery_Events_Preventdefault_Event Bubbling - Fatal编程技术网

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

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

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


是否可以还原默认处理程序?

在某些情况下*您可以先
返回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();
    }
});