【问题标题】:Why is my click() function working only on resize?为什么我的 click() 函数仅适用于调整大小?
【发布时间】:2020-04-03 18:47:30
【问题描述】:

我快疯了。正如您在下面的代码 sn-p 中看到的 - 一切正常。但不在我的项目中。在我的项目中,仅适用于 resize() 中的代码。当我调整窗口大小时 - 好的,这很好,我可以通过单击项目添加和删除“打开”类。但是如果我刷新页面而不调整窗口大小 - 我不能添加类。什么也做不了。我在这件事上花了几个小时。有人可以帮助我吗?为什么它不起作用?

(function ($) {
  $('.nav-item').on('click', function() {
    $(this).toggleClass('open');
    $(this).siblings().removeClass('open');
  });

  $(window).resize(function() {
    if($(window).width() < 1200) {
      $('.nav-item').on('click', function() {
        $(this).toggleClass('open');
        $(this).siblings().removeClass('open');
      });
    }
  });
})(jQuery);
.open {
  color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<ul class="main-menu">
  <li class="nav-item">
     <span class="nav-link">Menu item 1</span>
  </li>
  <li class="nav-item">
     <span class="nav-link">Menu item 2</span>
     <ul class="dropdown-menu">
        <li class="dropdown-item">
           <span>Menu item 2 subitem 1</span>
        </li>
        <li class="dropdown-item">
           <span>Menu item 2 subitem 2</span>
        </li>
     </ul>
  </li>
  <li class="nav-item">
     <span class="nav-link">Menu item 3</span>
     <ul class="dropdown-menu">
        <li class="dropdown-item">
           <span>Menu item 3 subitem 1</span>
        </li>
        <li class="dropdown-item">
           <span>Menu item 3 subitem 2</span>
        </li>
     </ul>
  </li>
</ul>

我使用 Drupal 8 CMS(如果它很重要的话 - 但我使用 jQuery、click() 和 Drupal 数百万次,它总是很好。

【问题讨论】:

  • 您是否在项目中动态添加.nav-items 元素?
  • 顺便说一句,在另一个事件处理程序中添加事件处理程序通常是个坏主意。每次调整窗口大小时,您都会添加额外的点击处理程序。
  • @Barmar “动态”是什么意思?站点在 Drupal CMS 上,代码是一个菜单,但我对其进行了简化(剪切链接)。我可以在管理面板中添加项目,生成代码,它不是严格的 HTML 代码。
  • 我的意思是在页面加载后添加它们,例如使用 AJAX。
  • @Barmar,所以不,我不会动态添加.nav-items

标签: javascript jquery html drupal onclick


【解决方案1】:

它在 sn-p 而不是你的代码中工作的原因是因为 SO sn-ps 自动将 jQuery 逻辑放置在 document.ready 事件处理程序中,这确保了 DOM 已经加载之前代码运行。

但是您的代码在IIFE 中运行,而不是在 document.ready 事件处理程序中运行,因此您尝试将事件绑定到尚不存在的元素。直到resize事件发生,该事件才被绑定并开始工作。

要解决此问题,请将 IIFE 替换为 document.ready 处理程序:

jQuery(function($) {
  $('.nav-item').on('click', function() {
    $(this).toggleClass('open').siblings().removeClass('open');
  });
})
.open {
  color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<ul class="main-menu">
  <li class="nav-item">
    <span class="nav-link">Menu item 1</span>
  </li>
  <li class="nav-item">
    <span class="nav-link">Menu item 2</span>
    <ul class="dropdown-menu">
      <li class="dropdown-item">
        <span>Menu item 2 subitem 1</span>
      </li>
      <li class="dropdown-item">
        <span>Menu item 2 subitem 2</span>
      </li>
    </ul>
  </li>
  <li class="nav-item">
    <span class="nav-link">Menu item 3</span>
    <ul class="dropdown-menu">
      <li class="dropdown-item">
        <span>Menu item 3 subitem 1</span>
      </li>
      <li class="dropdown-item">
        <span>Menu item 3 subitem 2</span>
      </li>
    </ul>
  </li>
</ul>

【讨论】:

  • 我很抱歉,但你的解决方案对我不起作用:(它在 Drupal CMS 上,也许这是一个原因......?但我用这种方式使用 jQuery:(function($){ ... }(jQuery)) 一百万时间,它一直很好。
  • 你在哪里有 JavaScript,在 HTML 的开头还是结尾?
  • @Barmar 最后。请看下面我的回答,我想我找到了解决办法。
【解决方案2】:

我又在互联网上搜索了几个小时,我找到了一个 Drupal.behaviours 的解决方案......我不知道它是如何工作的以及为什么工作,为什么在这个项目中这个简单的 jQuery 代码(来自下面和我的帖子,它是一样的)没有工作,但在另一个 Drupal 项目中运行良好......我不知道。也许有人可以告诉我。我不知道。

版本:

jQuery(function($) {
  ...
});

代替:

(function ($) {
  ...
})(jQuery);

也没有用。

所以我删除了我所有的代码:

(function ($) {
  $('.nav-item').on('click', function() {
    $(this).toggleClass('open');
    $(this).siblings().removeClass('open');
  });

  $(window).resize(function() {
    if($(window).width() < 1200) {
      $('.nav-item').on('click', function() {
        $(this).toggleClass('open');
        $(this).siblings().removeClass('open');
      });
    }
  });
})(jQuery);

我添加了这段代码:

(function ($) {
Drupal.behaviors.navclick = {
    attach: function (context, settings) {
      $('.nav-item', context).click(function () {
        $(this).toggleClass('open').siblings().removeClass('open');
      });
    }
  };
})(jQuery);

现在它可以工作了,并且可以调整窗口大小,并且在刚刚触发页面之后(以前它在触发页面时不起作用)。为什么?我不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多