簡體   English   中英

菜單隱藏和切換奇怪的行為

[英]menu hide and toggle strange behavior

$(function(){
    $(".OpenTopMenu").click(function (e) {
        $("#top_menu").slideToggle("fast");
        e.stopPropagation();
    });
    $(document).click(function() {
        $("#top_menu").hide();
    });
    $(document).on("touchend", function (event) {
        if (!$(event.target).closest("#top_menu").length) {
            $("#top_menu").hide();
        }
    });
});

大家好,我在切換和隱藏時遇到了一個奇怪的問題。

如您在我的代碼中所見。 如果我觸摸菜單按鈕(.OpenTopMenu),則菜單(#top_menu)切換。

這就是問題所在。 如果#top_menu是可見的,那么當我觸摸.OpenTopMenu時,#top_menu將隱藏,然后再次切換為可見。 所以我真的不能在觸摸菜單按鈕(.OpenTopMenu)時隱藏#top_menu。

有人可以幫我弄這個嗎?

謝謝

嘗試通過$(".OpenTopMenu").blur()類的東西來更改$(document).click() $(".OpenTopMenu").blur() 這可能不適用於舊的瀏覽器。

您的觸摸和點擊基本上都在做同樣的事情。 對於移動設備用途,總是很高興知道“點擊”實際上可以看作是兩個彼此迅速跟隨的事件,即“ mousedown”和“ mouseup”事件,最后一個觸發“ click”。 在移動設備上,“點擊”與“觸摸端”同時觸發。 現在還有一個名為“ touchstart”的事件,當用戶將他/她的手指放在玻璃上時會觸發該事件。

您現在想知道所有這些與您的問題有關。 好吧,這與您的文檔單擊有關。

我個人將通過以下方式解決您的問題;

var userClick = function(){
   //you will need something that determines whether your user is 
   //using a mobile device or not.
   return (Browser.isMobile)? "touchend" : "click";
};

var menu = {
   isOnMenu:false,
   isOnMenu_reset:null,
   attachEvents:function(){
      $('#top_menu').on('mouseenter',function(){
          menu.isOnMenu = true;
      }).on('mouseleave',function(){
          menu.isOnMenu = false;
      }).on('touchstart',function(){
          clearTimeout(menu.isOnMenu_reset);
          menu.isOnMenu = true;
      }).on('touchend',function(){
          menu.isOnMenu_reset = setTimeout(function(){
              menu.isOnMenu = false;
          },30);
      });

      $('.OpenTopMenu').on(userClick(),function(){
          $("#top_menu").slideToggle("fast");
      });

      $(document).on(userClick(),function(){
          if(!menu.isOnMenu){
             $('#top_menu').slideToggle("fast");
          }
      });
   },
   init:function(){
       menu.attachEvents();
   }
};
$(function(){
    menu.init();
});

我只想單擊並觸摸即可進行測試。

但這僅需與touchend一起使用。 這是我最后使用的工作代碼。 謝謝。

$(document).ready(function(){
    $(".OpenTopMenu").click(function(){
        $("#top_menu").slideToggle("fast");
    });
});
$(document).on("touchend", function(event){
    var $trigger = $(".OpenTopMenu");
    if($trigger !== event.target && !$trigger.has(event.target).length){
        $("#top_menu").slideUp("fast");
    }            
});

我之前嘗試過

!event.target.hasClass('OpenTopMenu')代替$ trigger!== event.target

在if條件下,但不起作用。 有人可以告訴我為什么上層代碼有效,而這個無效嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM