【问题标题】:jquery window resize function only triggering once instead of at every resizejquery窗口调整大小功能仅触发一次而不是每次调整大小
【发布时间】:2016-06-27 18:25:00
【问题描述】:

我正在尝试设置一个 jquery 函数来检查窗口宽度,以便导航栏正常工作。我想要发生的是:如果屏幕宽度大于 大于 949 像素,则启动一个功能,使悬停在 .dropdown 锚链接上打开一个下拉子菜单;如果屏幕宽度小于或等于 949px,请删除该功能,以便必须单击 .dropdown 锚链接才能打开下拉子菜单(下拉链接默认打开时单击它们-我认为这是一个引导组件)。

我根据在 stackoverflow 上找到的一些类似示例创建了一些函数,但发现该函数仅在屏幕宽度超过 949 像素时触发,因此在较小的宽度下,.dropdown 锚仍然通过悬停打开子菜单,这就是我不要。

var width = $(window).width();
$(window).resize(function(){
  if($(this).width()>949){
    $(".dropdown").hover(function(){
      $(this).addClass("open");
    },
    function(){
      $(this).removeClass("open");
    });
  }
});

如何改进此功能,使 .dropdown 悬停功能在 949 像素以上添加并在 949 像素及以下移除?

【问题讨论】:

  • 只想确定:var a - b;那个语法是正确的还是只是一个错字?
  • 我看到您在大小大于 949 时将悬停事件添加到 .dropdown 框,但是您不想在大小小于 949 时删除该侦听器吗?我不太习惯 jquery 方式,但我确定它具有删除事件侦听器的功能:看看 on() 和 off()
  • 嘿-你是对的,这是一个已经编辑过的错字。我不完全确定如何根据您的建议修改我的脚本......我的想法是这两个功能(添加悬停或删除悬停)都依赖于“on”更改事件。

标签: jquery html resize window


【解决方案1】:

与其添加和删除绑定,不如在做任何事情之前建立事件绑定并检查大小:

$(".dropdown").hover(function() {
    if ($(window).width() > 949) {
        $(this).addClass("open");
    }
}, function() {
    if ($(window).width() > 949) {
        $(this).removeClass("open");
    }
});

如果您添加和删除事件处理程序,您需要防止这样做两次(例如,它们调整为 980,然后调整为 1050)。

var hover_added = false;

$(window).resize(function() {
    var width = $(this).width();
    if (width > 949 && !hover_added) {
        $(".dropdown").on({
            mouseenter: function () {
                $(this).addClass("open");
            },
            mouseleave: function () {
                $(this).removeClass("open");
            }
        });
        hover_added = true;
    } else if (width <= 949 && hover_added) {
        $(".dropdown").off("mouseenter mouseleave");
        hover_added = false;
    }
});

【讨论】:

  • 您好,感谢您对 Barmar 的回复。这段代码很接近,但只要我将屏幕宽度从小于 950 像素更改为 950 像素及以上,悬停功能就会停止工作。
  • 删除处理程序时忘记清除hover_added
【解决方案2】:

可能并不完美,因为 jquery 不是我的强项,但它可以胜任:

var width = $(window).width();
$(window).resize(function(){
  if($(this).width()>949){
    $(".dropdown").on({
        mouseenter: function () {
            $(this).addClass("open");
        },
        mouseleave: function () {
            $(this).removeClass("open");
        }
    });
  }
  else{
    $(".dropdown").off("mouseenter");
    $(".dropdown").off("mouseleave");
  }
});

请注意,此实现还将删除 .dropdown 元素上的任何其他现有 mouseenter 和 mouseleave 事件处理程序。

【讨论】:

  • 感谢您的回复 elfwyn。这似乎工作得更好,我会看看我是否可以在此基础上进行构建。
  • 采用 Barmars 代码,因为它可以防止开销并且比我的解决方案更精致。
【解决方案3】:

我的建议是(为了避免多次绑定同一个事件):

var width = $(window).width();

$(window).on('resize', function(e) {
  doResize(e);
});

function doResize(e) {
  if ($(this).width()>949) {
    var isOpenOnHover = $('.dropdown-toggle').data('isOpenOnHover');
    if (isOpenOnHover) {
      return;
    }
    $('.dropdown-toggle').data('isOpenOnHover', true);
    $('.dropdown-toggle').hover(function () {
      $('.dropdown-toggle').trigger('click.bs.dropdown');
    });
  } else {
    $('.dropdown-toggle').data('isOpenOnHover', false);
    $('.dropdown-toggle').off('mouseenter mouseleave');
  }
}

$(function () {
  $('.dropdown-toggle').data('isOpenOnHover', false);
  doResize();
});
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-1.12.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>



<div class="bs-example">
    <div class="dropdown">
        <a href="#" data-toggle="dropdown" class="dropdown-toggle">Dropdown <b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
        </ul>
    </div>
</div>

【讨论】:

  • 嘿,感谢您的回复,但我选择了上述答案,因为我已经可以使用它了。
猜你喜欢
  • 2021-08-14
  • 2023-03-22
  • 1970-01-01
  • 2014-01-14
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多