【问题标题】:Unbinding preventDefault in click event?在点击事件中取消绑定preventDefault?
【发布时间】:2017-08-03 11:46:58
【问题描述】:

我目前在创建移动导航时遇到问题。这是一个简单的汉堡图标,当你点击它时,它会打开一个全屏菜单。问题是我试图在覆盖可见时禁用滚动。现在我想我可以通过添加来实现这一点;

$('body').bind('touchmove', function(e){e.preventDefault()});

这工作一次,但是当您再次关闭菜单时 preventDefault 仍然处于活动状态,我不知道如何解除绑定,因为汉堡图标用于打开和关闭菜单。

我已经添加了我在下面使用的完整 js 脚本;

$(document).ready(function () {
  $(".icon").click(function () {
    $('body').bind('touchmove', function(e){e.preventDefault()}); 
    $(".mobilenav").fadeToggle(500);
    $(".top-menu").toggleClass("top-animate");
    $(".mid-menu").toggleClass("mid-animate");
    $(".bottom-menu").toggleClass("bottom-animate");
  }); 
});

感谢您的帮助!

【问题讨论】:

    标签: javascript jquery mobile scroll nav


    【解决方案1】:

    使用.on().off() jQuery 方法很容易实现!

    $(document).on('touchmove', 'body', function(e){e.preventDefault()});
    $(document).off('touchmove', 'body', function(e){e.preventDefault()});
    

    但是还有一个unbind()函数!

    $('body').unbind('touchmove', function(e){e.preventDefault()});
    

    代码示例:

    $(document).ready(function () {
    
      var cancelScroll = function(e) { e.preventDefault(); }
    
      $(".icon").click(function () {
        if ($(".mobilenav").is(":visible")) {
          $('body').unbind('touchmove', cancelScroll); 
        } else {
          $('body').bind('touchmove', cancelScroll); 
        }
        $(".mobilenav").fadeToggle(500);
        $(".top-menu").toggleClass("top-animate");
        $(".mid-menu").toggleClass("mid-animate");
        $(".bottom-menu").toggleClass("bottom-animate");
      }); 
    });
    

    注意:从处理程序返回false 等效于在事件对象上同时调用.preventDefault().stopPropagation()

    所以它可能只是:

    var cancelScroll = function() { return false; }
    

    【讨论】:

    • 我知道这些功能,但我必须知道在我的脚本中添加它们的位置。所以我不确定在哪里取消绑定阻止默认值。
    • 感谢您的快速回复,但我遇到了与其他答案相同的问题。解绑部分不起作用。
    • 尝试改用 .on() 和 .off() 函数!
    • 而不是绑定和解除绑定?
    • 啊。我想起了为什么。您需要绑定和取消绑定完全相同的功能。但不是同一个定义的函数。我的意思是-您需要将函数放入变量中。我会在 1 分钟内更新答案
    【解决方案2】:

    添加一个标志来区分和解除绑定,

     $(document).ready(function () {
      var isClose = false;
      $(".icon").click(function () {
    
        if(isClose){
          $('body').unbind('touchmove', function(e){e.preventDefault()}); 
          isClose = false;
        }else{
          $('body').bind('touchmove', function(e){ e.preventDefault();});
          isClose = true; 
        }
        $(".mobilenav").fadeToggle(500);
        $(".top-menu").toggleClass("top-animate");
        $(".mid-menu").toggleClass("mid-animate");
        $(".bottom-menu").toggleClass("bottom-animate");
      }); 
    });
    

    【讨论】:

    • 不幸的是,这不起作用。我确实知道创建变量的想法。我对js的经验不是很丰富,所以我看不出哪里出错了。
    • 如果你能加个fiddle,我可以看看。
    • 问题出在移动设备上,我可以给你它托管的链接吗? epicconcepts.nl
    • 如果你能把上面代码的链接分享给我(答案),我可以调试告诉你。
    • 啊,我看到问题已在其他答案中得到解决,仍然感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2010-12-20
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多