单击启用/禁用touchmove

时间:2015-10-19 11:42:30

标签: javascript jquery html css

我目前正在建立一个覆盖效果非常简单的网站 - 我有一个汉堡包' (.mobilemenu)菜单图标,单击该图标可切换导航覆盖(.mobile-nav)上的伪类。我希望添加一些代码,这些代码在初始点击时也会停用touchmove,再次点击(.mobilemenu)时,会恢复默认行为。

这是我的代码:

jQuery('.mobilemenu').click(function(e) {
    jQuery(this).toggleClass('is-active');
    jQuery('.mobile-nav').toggleClass('active');


    e.preventDefault();
});

我尝试了以下内容:

jQuery('.mobilemenu').click(function(e) {
    jQuery(this).toggleClass('is-active');
    jQuery('.mobile-nav').toggleClass('active');
    if('.mobile-nav').hasClass('active') {
        $(body).on('touchmove', function(e) {
        e.preventDefault();
        }};

    e.preventDefault();
});

这显然不起作用!

坦率地说Javascript / JQuery对我来说很新,所以我确定这里的语法不正确。我是否可以切换禁用触摸移动的body类?或者我是否必须以某种方式重写代码并使用bind

编辑:根据@John R的建议,我稍微改变了我的代码语法 - 这是一个小提琴:JS fiddle

我的代码现在看起来如下:

jQuery('.mobilemenu').click(function(e) {
  jQuery(this).toggleClass('is-active');
   jQuery('.mobile-nav').toggleClass('active');
     if(jQuery('.mobile-nav').hasClass('active')) {
     $(body).on('touchmove', function(e) {
     e.preventDefault();
  }};

e.preventDefault();
});

然而,这似乎完全杀死了叠加层!我猜测虽然行if(jQuery('.mobile-nav').hasClass('active')) {等现在是正确的,但以下位可能不是?

编辑2 :所以经过一段时间的游戏,我已经更新了语法,叠加层再次正常工作,但我仍然可以在iPhone上覆盖后面滚动页面正文: http://jsfiddle.net/jameshenry/bzau0jaz/1/ - 如果有人有任何想法,我真的很感激!

jQuery('.mobilemenu').click(function(e) {
    jQuery(this).toggleClass('is-active');
    jQuery('.mobile-nav').toggleClass('active');

    if(jQuery('.mobile-nav').hasClass('active')) {
        $(body).on('touchmove', function(e){
            e.preventDefault()}
                  )};
});

编辑3 :在玩完结构和语法之后,我终于得到了“触摸移动”,“虚假”和“#39;点击时工作。唯一的问题是它没有切换,所以滚动永久禁用!

jQuery('.mobilemenu').click(function(e) {
    jQuery(this).toggleClass('is-active');
    jQuery('.mobile-nav').toggleClass('active');

    if(jQuery('.mobile-nav').hasClass('active')) {
        $('body').on('touchmove', false);
    };
});

我认为其他声明是可行的,但我尝试添加以下内容:

jQuery('.mobilemenu').click(function(e) {
    jQuery(this).toggleClass('is-active');
    jQuery('.mobile-nav').toggleClass('active');

    if(jQuery('.mobile-nav').hasClass('active')) {
        $('body').on('touchmove', false);
    };
    else { $('body').on('touchmove', true);};
});

但这似乎只是阻止叠加工作 - 有没有办法切换触摸移动'什么时候关闭?这是一个小提琴http://jsfiddle.net/jameshenry/bzau0jaz/2/

3 个答案:

答案 0 :(得分:1)

更改此

if('.mobile-nav').hasClass('active'){
  //...
}

if(jQuery('.mobile-nav').hasClass('active')){
   //...
}

答案 1 :(得分:1)

在jQuery中选择所有元素之前不要忘记$或“jQuery”...要使If语句工作,它需要

if (true) { ...something };

所以对你的       jQuery('。mobile-nav')。hasClass('active')=== true

所以你需要将它封装在括号中,所以

jQuery('.mobile-nav').hasClass('active') 需要在括号中......

if(jQuery('.mobile-nav').hasClass('active')){
    //doSomething
}

答案 2 :(得分:0)

好的解决方案(经过大量的试验和错误以及花费了太多时间在这上面!)非常简单 - 使用.on()绑定并通过.off取消绑定 - 这是最终的jQuery代码:

jQuery('.mobilemenu').click(function(e) {
    jQuery(this).toggleClass('is-active');
    jQuery('.mobile-nav').toggleClass('active');
        if(jQuery('.mobile-nav').hasClass('active')) {
            $('body').on('touchmove', false);
        } else  {
            $('body').off('touchmove', false);
        }
});

如果任何人都能看到这种方法中存在任何缺陷,或者有什么方法可以解决这个问题,那就太棒了。好像虽然工作得很好!