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

如何为jQuery.Marquee复制元素重新初始化悬停效果类?

解决动态生成元素的悬停效果失效问题

你的问题核心在于:jQuery.Marquee插件会动态复制原始元素,但这些新生成的元素没有被初始化HoverImgFx4实例——你一开始只在页面加载时执行了一次初始化代码,只能处理当时已存在的元素,后续复制出来的元素自然没法触发悬停效果。

下面是两种可靠的解决方案,按推荐程度排序:


方案1:利用jQuery.Marquee的created回调(推荐)

jQuery.Marquee自带一个created回调事件,会在插件完成元素复制(也就是生成滚动的重复元素)后触发。我们可以把悬停效果的初始化逻辑封装成函数,在页面加载和created回调里分别调用,同时避免重复初始化已处理过的元素。

步骤1:封装初始化函数

先把原来的初始化代码改成可复用的函数,并且给已初始化的元素打标记,防止重复创建实例:

function initHoverImgFx() {
  // 选择所有未被初始化的目标元素
  const targetLinks = document.querySelectorAll(
    '[data-fx="4"] > a:not([data-hover-init]), a[data-fx="4"]:not([data-hover-init])'
  );
  
  targetLinks.forEach(link => {
    // 初始化悬停效果
    new HoverImgFx4(link);
    // 添加标记,避免重复处理
    link.setAttribute('data-hover-init', 'true');
  });
}

步骤2:结合Marquee初始化调用函数

在页面加载时先处理原始元素,然后在Marquee的created回调里处理新生成的复制元素:

// 页面加载完成后先初始化已有元素
document.addEventListener('DOMContentLoaded', () => {
  initHoverImgFx();
  
  // 初始化Marquee插件,添加created回调
  $('.marquee-left').marquee({
    // 这里放你的Marquee配置项(比如duration、direction等)
    direction: 'left',
    duplicated: true,
    duration: 6000,
    // 关键:元素复制完成后触发的回调
    created: () => {
      initHoverImgFx();
    }
  });
});

方案2:用MutationObserver监听DOM变化(备选)

如果Marquee的created回调因为版本问题不生效,可以用原生JS的MutationObserver监听滚动容器的DOM变化,一旦有新元素被添加,就自动初始化悬停效果:

document.addEventListener('DOMContentLoaded', () => {
  initHoverImgFx();
  
  // 监听滚动容器的子元素变化
  const marqueeContainer = document.querySelector('.marquee-left');
  const observer = new MutationObserver(mutations => {
    mutations.forEach(mutation => {
      // 当有新元素被添加到容器中时
      if (mutation.addedNodes.length > 0) {
        initHoverImgFx();
      }
    });
  });
  
  // 配置观察选项:监听子元素和后代元素的变化
  observer.observe(marqueeContainer, { childList: true, subtree: true });
  
  // 初始化Marquee
  $('.marquee-left').marquee({
    // 你的配置项
  });
});

为什么你之前的尝试没用?

你写的$( '.marquee-left').hover(function(link) { new HoverImgFx4(link) });逻辑不对:

  • .hover()是绑定鼠标悬停的事件处理器,但HoverImgFx4是需要在元素创建时就实例化的类,不是事件回调函数
  • 这个代码只会给.marquee-left容器绑定悬停事件,不会处理容器内部的动态元素

内容的提问来源于stack exchange,提问作者Jens Nielsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:26:12