You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过jQuery在移动端初始化Marquee并在桌面端销毁?

修复jQuery.Marquee响应式场景下的崩溃问题

原代码的核心问题:

  • 窗口宽度变量width仅在页面初始化时获取,resize事件中始终使用旧值,导致响应式判断完全失效
  • 未跟踪组件激活状态,重复调用初始化/销毁方法,造成DOM元素、事件绑定冲突,引发网站崩溃
  • resize事件无防抖处理,频繁触发会产生大量冗余DOM操作,加剧性能问题

修复后的代码:

<script src="//cdn.jsdelivr.net/npm/jquery.marquee@1.6.0/jquery.marquee.min.js" type="text/javascript" defer></script>
<script>
window.onload = function () {
  if (window.jQuery) {
    $(function () {
      const $marqueeEl = $('.tt-services-listing');
      let isMarqueeActive = false;
      let resizeTimer;

      // 封装marquee控制逻辑
      const handleMarquee = function() {
        const currentWidth = $(window).width();
        
        // 移动端:初始化组件(仅未激活时执行)
        if (currentWidth <= 767 && !isMarqueeActive) {
          $marqueeEl.marquee({
            duration: 20000,
            duplicated: true,
            delayBeforeStart: 0,
            startVisible: true,
          });
          isMarqueeActive = true;
        } 
        // 桌面端:销毁组件(仅激活时执行)
        else if (currentWidth >= 768 && isMarqueeActive) {
          $marqueeEl.marquee('destroy');
          isMarqueeActive = false;
        }
      };

      // 页面加载时执行一次
      handleMarquee();

      // 防抖处理resize事件,避免频繁触发
      $(window).on('resize', function () {
        clearTimeout(resizeTimer);
        resizeTimer = setTimeout(handleMarquee, 250);
      });
    });
  }
};
</script>

关键修复说明:

  • 实时获取窗口宽度:每次执行判断时重新获取当前窗口宽度,确保响应式逻辑准确
  • 状态跟踪:用isMarqueeActive变量记录组件状态,避免重复初始化/销毁
  • 防抖处理:通过setTimeout延迟执行逻辑,减少resize事件的触发频率,降低DOM操作压力
  • 元素缓存:提前缓存目标DOM元素$marqueeEl,避免重复查询DOM提升性能

内容的提问来源于stack exchange,提问作者Teik Cheah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:05:10