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

jQuery点击事件多选择器失效,使用.merge()仅前两个选择器生效

解决jQuery点击事件多选择器失效的问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是**$.merge()方法只能接受两个参数**,第三个参数会被直接忽略,所以你的代码里只有infoTag和navLink被合并到了一起,sideIco根本没被加入到事件绑定的集合里,这就是为什么只有前两个选择器生效的原因。

正确的解决方案有两种,选哪种都可以:

方案1:直接用jQuery多选择器一次性获取所有元素

这是最简洁的方式,jQuery原生支持逗号分隔的多选择器,直接把三个选择器写在同一个$()里就行:

// 一次性获取所有需要绑定点击事件的元素
var allScrollLinks = $("#carbonNavbar ul li a[href^='#'], #sideIcons a[href^='#'], a.scrl[href^='#']");

allScrollLinks.on('click', function(e) {
    e.preventDefault();
    var hash = this.hash;
    $('html, body').animate({
        scrollTop: $(hash).offset().top
    }, 1000, function(){
        // 完成动画后添加哈希到URL
        window.location.hash = hash;
    });
});

方案2:用.add()方法链式合并多个元素集合

如果你需要分开定义每个元素集合,就用jQuery的.add()方法,它可以链式添加多个集合,比$.merge()更适合处理多个集合的合并:

var navLink = $("#carbonNavbar ul li a[href^='#']");
var sideIco = $("#sideIcons a[href^='#']");
var infoTag = $("a.scrl[href^='#']");

// 链式.add()合并所有集合
var allScrollLinks = infoTag.add(navLink).add(sideIco);

allScrollLinks.on('click', function(e) {
    e.preventDefault();
    var hash = this.hash;
    $('html, body').animate({
        scrollTop: $(hash).offset().top
    }, 1000, function(){
        window.location.hash = hash;
    });
});

补充说明:为什么$.merge()不行?

$.merge()的官方语法是$.merge(first, second),它的作用是把第二个数组/元素集合合并到第一个里面,只接受两个参数。你传了三个参数的话,第三个会被完全忽略,所以sideIco并没有被合并到最终的集合里,自然不会触发点击事件。

这样修改后,三个选择器对应的元素就都会正常触发点击滚动的逻辑啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:15:10