【问题标题】:$(window).resize only triggered on browser refresh?$(window).resize 仅在浏览器刷新时触发?
【发布时间】:2014-01-01 04:02:37
【问题描述】:

我已经阅读了 SO 中关于 jQuery 窗口大小调整事件和使其工作的方法的大量条目 - 即,

    $(window).on('resize',function(),
    $(window).bind('resize',function(),
    $(window).resize(function()

无论出于何种原因,它只在页面刷新时才对我有用。

这是我的代码:

$(function() {
  function checkWinSize() {
    if ($(window).width() >= 1120) {
      //Enable Click Handler
      $('#menu-top-inner nav > ul > li').click(function () {
        $(this).not('.menu-title').addClass('menu-on');
        $(this).children('.top-items').show();
      }).mouseleave(function () {
        $(this).removeClass('menu-on');
        $(this).children('.top-items').hide();
      });
      $('#top-eg').click(function () {
        loadTopMenu(this, '/eyeglasses/all-prescription-eyeglasses.aspx #alphaLinks + div');
      });
      $('#top-sg').click(function () {
        loadTopMenu(this, '/sunglasses/all-sunglasses.aspx #alphaLinks + div');
      });
      $('#top-ps').click(function () {
        loadTopMenu(this, '/prescription-sunglasses/all-prescription-sunglasses.aspx #alphaLinks + div');
      });
      $('#top-cl').click(function () {
        loadTopMenu(this, '/contact-lenses/all-contact-lenses.aspx #alphaLinks + div');
      });
    } else {
      //Disable Click Handler
      $('#menu-top-inner nav > ui > li').click(false);
    }
  }
  checkWinSize();

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

编辑:这是 HTML

<!-- MENU TOP START ++ -->
<div id="menu-top">
  <!-- MENU TOP INNER START ++ -->
  <div id="menu-top-inner">
    <!-- NAV START ++ -->   
    <nav role="navigation">
      <ul>
        <li id="top-men"><span>Men</span>
          <div class="top-items">
            <asp:Literal ID="ltrlTopMenuMen" runat="server" />
          </div>
        </li>
        <li id="top-women"><span>Women</span>
          <div class="top-items">
            <asp:Literal ID="ltrlTopMenuWomen" runat="server" />
          </div>
        </li>
        <li id="top-eg"><span>Eyeglasses</span>
          <div class="top-items">
            <asp:Literal ID="ltrlTopMenuEyeglasses" runat="server" />
          </div>
        </li>
        <li id="top-sg"><span>Sunglasses</span>
          <div class="top-items">
            <asp:Literal ID="ltrlTopMenuSunglasses" runat="server" />
          </div>
        </li>
        <li id="top-ps"><span>Prescription Sunglasses</span>
          <div class="top-items">
            <asp:Literal ID="ltrlTopMenuRxSunglasses" runat="server" />
          </div>
        </li>
        <li id="top-cl"><span>Contact Lenses</span>
          <div class="top-items">
            <asp:Literal ID="ltrlTopMenuContactLenses" runat="server" />
          </div>
        </li>
        <li id="top-help"><span>Help</span>
          <div class="top-items">
            <asp:Literal ID="ltrlTopMenuHelp" runat="server" />
          </div>
        </li>
      </ul>
    </nav>
    <!-- NAV END xx -->
  </div>
  <!-- MENU TOP INNER END xx -->
</div>
<!-- MENU TOP END xx -->

如果我调整窗口大小,菜单会保留其在文档加载时设置的点击状态。但是,如果我刷新页面,则会激活正确的点击处理程序设置。

对这里可能发生的事情的想法?

更新:当我想禁用鼠标点击时,我将点击处理程序更改为使用 .bind('click', function() 以与对 .unbind('click') 的更改保持一致。但是,如果单击未绑定,则不会重新绑定单击。这是新脚本(没有对 HTML 进行更改)。此外,我必须指定要取消绑定的确切点击处理程序 ID(之前不知道这一点)。此外,我检查以确保没有 $(window).resize('off') 的实例或其他可能对抗调整大小的代码。

var eventsBound = false;
function checkWinSize() {
  if ($(window).width() >= 1120 && !eventsBound) {
    eventsBound = true;
    $('#menu-top-inner nav > ul > li').bind('click', function () {
      $(this).not('.menu-title').addClass('menu-on');
      $(this).children('.top-items').show();
    }).mouseleave(function () {
      $(this).removeClass('menu-on');
      $(this).children('.top-items').hide();
    });
    $('#top-eg').bind('click', function () {
      loadTopMenu(this, '/eyeglasses/all-prescription-eyeglasses.aspx #alphaLinks +    div');
    });
    $('#top-sg').bind('click', function () {
      loadTopMenu(this, '/sunglasses/all-sunglasses.aspx #alphaLinks + div');
    });
    $('#top-ps').bind('click', function () {
      loadTopMenu(this, '/prescription-sunglasses/all-prescription-sunglasses.aspx #alphaLinks + div');
    });
    $('#top-cl').bind('click', function () {
      loadTopMenu(this, '/contact-lenses/all-contact-lenses.aspx #alphaLinks + div');
    });
  } else {
    eventsBound = false;
    $('#menu-top-inner nav > ul > li,#top-eg,#top-sg,#top-ps,#top-cl').unbind('click');
  }
}
$(window).on('resize', checkWinSize);

已解决:

我能够通过调整绑定检查的条件来解决最后一个问题。在 } else { 中,我将其更改为 } else if ($(window).width() &lt; 1120 &amp;&amp; eventsBound) {,因为即使窗口大小高于 1120 但已调整大小且 eventsBound 为 true,另一个正在处理所有内容。

【问题讨论】:

  • ('#menu-top-inner nav &gt; ui &gt; li').click(false); 到“禁用点击处理程序” - 你能解释一下吗?你的意思是.off('click') 还是.unbind('click')
  • @popnoodles,我把它改成了.unbind('click');。 @matewka,我添加了 HTML。
  • 你的控制台告诉你什么?如果您已按照 matewka 的回答进行了修复,则可能是某些 JS 由于错误而简单地阻止了 JS 工作。在 Chrome 中,按 F12,然后单击控制台。
  • @popnoodles,控制台没有报告任何错误。但是,解除绑定似乎失败了。例如,当我完全打开窗口时,点击被绑定并且菜单正常工作。当我将窗口大小调整到 1120 像素以下时,它仍然会激活菜单。但是,当我以较小的尺寸刷新时,菜单现在被绑定,直到我将窗口调整为更大的尺寸。重新调整大小不会取消绑定点击。
  • 一旦点击被解除绑定,它就不会被重新绑定。因此,当从全屏开始并现在缩小尺寸时它可以工作,但反之则不行。我将编辑上面的问题以包含新的更改。

标签: javascript jquery


【解决方案1】:

我不认为你的解除绑定逻辑是正确的。要取消绑定 jQuery 中的事件处理程序,您应该使用

$('#menu-top-inner nav > ui > li').off('click');

补充:

您不必用匿名函数包装checkWinSize 函数。你可以简单地做

$(window).on('resize', checkWinSize);

那么一般来说,您的代码是不合适的,因为您每次调整窗口大小时都会绑定另一个 click 事件处理程序。假设您的窗口是 1920 像素宽。处理程序在页面加载时绑定。然后将其调整为 1600 像素。处理程序再次被绑定。这样,当事件发生时,它们将被调用两次。我建议使用旗帜。像这样:

$(function() {
    var eventsBound = false; //the flag
    function checkWinState() {
        if ($(window).width() >= 1120 && !eventsBound) {
            eventsBound = true;
            //bind the clicks
        } else {
            eventsBound = false;
            //unbind everything
        }
    }
    //...
});

【讨论】:

  • 感谢您的快速响应。但是,这行不通。我确实使用.unbind('click') 而不是.click(false) 调整了取消绑定事件。我也从窗口调整大小中删除了匿名函数。它仍然只在刷新而不是调整大小时触发。
  • +1 matewka 和 +1 @popnoodles,在这里感谢你们的帮助。它帮助我解决了这个问题,我已经在上面发布了我更新的代码和解决方案。
  • 也祝您新年快乐! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多