【问题标题】:Execute function only if window width is greater than something else don't仅当窗口宽度大于其他值时才执行函数
【发布时间】:2015-07-06 18:34:36
【问题描述】:
 function dropdownHover() {
   jQuery('ul.nav li.dropdown').hover(function() {
   jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
 }, function() {
   jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
 });
}


$(window).on('resize', function(event){
   var windowSize = $(window).width(); 
   if(windowSize > 992){
      dropdownHover();
   } 
});

我需要这个函数 dropdownHover() 仅在窗口大于 992 像素时触发,无论是加载还是调整大小,否则如果窗口

编辑:最终工作版本

$('.dropdown').on('mouseenter', function(){
  if(!$(this).is('.open') && $(window).data('wide'))
     $('.dropdown-menu', this).dropdown('toggle').hide()
        .stop(true, true)
        .delay(200)
        .fadeIn(function(){
            this.style.display = '';
        }).find('a').on('touchstart click', function (e) {
          e.stopPropagation(); 
      });
}).on('mouseleave', function(){
if($(this).is('.open') && $(window).data('wide'))
    $('.dropdown-menu', this).dropdown('toggle');
});

$('.dropdown').on('click', function(e){
  if( $(window).data('wide')) {
      $('.dropdown-menu', this).dropdown('toggle');
} else {
    $('.dropdown-menu', this)
        .stop(true, true).slideToggle()
        .closest('.dropdown').removeClass('open');
  }
});

// not entirely necessary.  Not sure which is faster: this or just checking the width in all three places.
$(window).on('resize', function(){
  $(window).data('wide', $(window).width() > 992);

// reset the open menues
$('.dropdown').removeClass('open');
$('.dropdown-menu').css({
    display: '',
    left: '',
    position: '',
 });

// because we are checking the width of the window, this should probably go here although this really should be a media query style
$('.dropdown-menu.pull-center').each(function() {
    var menuW = $(this).outerWidth();
    if ($(window).width() > 1000) {
        $(this).css({
            left: - menuW / 2 + 60 + 'px',
            position: 'absolute'
        });
    } else {
        $(this).css({
            left: '',
            position: ''
        });
    }
 });
 }).trigger('resize');

【问题讨论】:

    标签: javascript jquery twitter-bootstrap drop-down-menu


    【解决方案1】:

    初步解决方案

    你的问题是双重的。首先,您需要它不显示较小尺寸的菜单。为此,您检查调整窗口宽度的大小。问题是它只能工作一次。它会触发hover 的事件侦听器,并且如果屏幕在某个时候更大,它不会杀死这些事件侦听器。为此,您可以设置一个标志。有很多方法可以做到这一点,但对于我的回答,我选择使用 jQuery .data() 方法。

    $(window).on('resize', function(event){
        var windowSizeWide = $(window).width() > 600; // reduced for testing purposes
        jQuery('ul.nav li.dropdown').data('dropdown-enabled', windowSizeWide);
    }).trigger('resize');
    

    然后当我们监听悬停事件(即mouseentermouseleave 事件)时,如果屏幕太小,我们就简单地退出函数。

    jQuery('ul.nav li.dropdown').on('mouseenter', function() {
        if(!jQuery(this).data('dropdown-enabled')) return;
        jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
    }).on('mouseleave', function() {
        if(!jQuery(this).data('dropdown-enabled')) return;
        jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
    }).find('.dropdown-menu').hide();
    

    最后,您还希望事件在加载时触发。您可以通过简单地添加 .trigger('resize') 来做到这一点,如第一个 sn-p 所示。你可以在这里看到一个功能演示:http://jsfiddle.net/jmarikle/xw9Ljshu/

    可能的替代解决方案

    或者,您也可以使用 CSS 来处理媒体查询。最简单的方法是在较小的屏幕上强制display: none。我不建议完全隐藏该元素,因为此时它变得无法访问,但这是一般的想法:

    @media(max-width: 600px) {
        ul.dropdown-menu {
            display:none !important;
        }
    }
    

    注意!important被使用是因为当你fadeInfadeOut时jQuery会添加内联样式。

    第二次演示:http://jsfiddle.net/jmarikle/xw9Ljshu/1

    【讨论】:

    • 哇,谢谢,这很好用,但只有一件事。而不是在小窗口上被杀死的悬停功能,我需要现在不起作用的常规引导下拉功能。或者,也许我可以在 CLICK 上添加其他 slideToggle 功能。重要的是它必须点击。请注意下拉菜单位于主导航栏中,在切换按钮上触发。
    • @NenadVracar 好的。这更有意义。那么,您真的希望在悬停时打开下拉菜单以获取桌面视图吗?
    • 是的,基本上窗口 > 992 在悬停时打开,窗口
    • @NenadVracar 很抱歉我昨天无法重温这个。我有点太忙了。是this the kind of functionality you're after? Dropdown 有点时髦。它不允许您显式隐藏或显示。你只能切换。这使得更改其功能有点困难。在我链接的演示中,我最终不得不在锚点停止传播。它会让锚点仍然有效,但不允许点击事件在树的上方。否则它会导致菜单闪烁进出。可能无法解决您的问题,但另一种选择。
    • 首先让我说声谢谢,你给我的代码很棒,对我帮助很大。我用新代码编辑了我的原始问题(它是你的代码,我添加了一些修改),如果问的不是太多,你可以看看并说出你的想法。我也无法从上面的评论中打开该链接,我收到此消息(应用程序中发生错误,无法提供您的页面。请稍后再试。)
    【解决方案2】:

    window.screen.availWidth 获取窗口大小。我还没有测试你的代码。但我认为这没问题。

            function dropdownHover() {
            jQuery('ul.nav li.dropdown').hover(function() {
                jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
            }, function() {
                jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
            });
        }     
    
        $(document).ready(function(){
            $(window).on('resize', function(event){
                var windowSize = window.screen.availWidth; 
                if(windowSize > 992){
                    dropdownHover();
                } 
            });
    
        })
    

    【讨论】:

    • 这行不通。 OP已经有了这个。如果窗口被调整为更小的宽度,这不会终止事件处理程序。它也不会在加载时触发调整大小事件。因此,这段代码很可能永远不会运行。
    • @JosephMarikle 我用 $(document).ready(function(){ ... }) 进行了测试,我认为它的工作原理。请你试试?
    • 您提供的代码功能,但它没有按照原始海报指定的方式执行。它的功能与问题中的代码完全相同。您可以通过首先在屏幕宽于 992 像素时加载代码、将其缩小并注意到出现悬停菜单来复制该问题。它不应该出现在较小的屏幕尺寸上。请注意,原始发布者希望它检查“loadresize
    • 它不工作,如果窗口> 992,我需要这个函数来运行文档加载,当我调整窗口大小时我需要杀死它。现在它不适用于文档加载,但是当我调整窗口大小时。也许如果我在 else{} 中创建另一个函数 click-slide 你认为这会起作用吗?
    • 我在函数 dropdownHover() 中使用警报进行了测试。当屏幕根据条件调整大小时,警报就会出现。 :( 稍等一下,我正在尝试其他部分。
    猜你喜欢
    • 2016-07-14
    • 2012-11-20
    • 1970-01-01
    • 2022-11-23
    • 2016-02-16
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多