☰
jQuery基础:用事件驱动做电影排行榜与Tab选项卡,TaoToken统一Key接入AI辅助调试
2026/10/7 14:42:43 网站建设 项目流程

1. 从两个经典案例说起:jQuery 事件驱动到底解决什么问题

jQuery 事件驱动是前端入门阶段最容易「一看就会、一写就废」的知识点。它要解决的问题很具体:页面上有一堆元素,用户点了、移入了、移出了,页面要跟着变。电影排行榜要的是鼠标悬停展开简介、移开收起;Tab 选项卡要的是点谁谁亮、对应内容跟着换。这两个案例几乎覆盖了 jQuery 事件绑定的全部基础动作:mouseenter、mouseleave、hover、click、index()、siblings()、addClass/removeClass/toggleClass。

它适合谁?适合刚学完 jQuery 选择器、准备把「静态页面」变成「能交互的页面」的同学;也适合已经能写但总遇到「事件不触发」「选择器选错」「切换后样式残留」这类问题的开发者。我实测下来,这两个案例的价值不在于代码多复杂,而在于它们把「事件绑定 → 状态切换 → DOM 更新」这条链路压缩到了几十行里,任何一环写错都会立刻暴露。

本文会给出可直接复制的 HTML/CSS/JS 结构,电影排行榜用三种 hover 写法对照,Tab 选项卡用「有 bug 版」和「siblings 修正版」对照,最后演示怎么通过 TaoToken 统一 Key 接入 AI 工具,把控制台里的报错和「点了没反应」翻译成能直接改的代码。核心检索词就是 jQuery 事件绑定、电影排行榜、Tab 选项卡、事件委托、选择器调试。

先说一个我踩过的坑:很多人写$("li").mouseenter(...)时,页面里其实有两组li(导航一组、内容一组),结果事件绑到了错误的元素上,表现就是「鼠标移上去没反应」。这不是事件的问题,是选择器范围的问题。后面排障章节会专门拆这类情况。

2. TaoToken 前置:统一 Key 接入 AI 辅助调试的准备工作

在写代码之前,先把「AI 辅助调试」这条通道搭好。TaoToken 的作用是提供一个统一的 API 入口和 Key,让你在排查 jQuery 事件问题时,可以把控制台报错、DOM 结构、选择器片段直接丢给模型,让它帮你定位是选择器写错、事件绑错元素,还是 CSS 类名不匹配。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。

你需要准备三样东西,这三样在后面所有配置里都会反复出现,我把它叫「三件套」:

配置项说明示例值
Base URLAPI 请求根地址https://taotoken.net/api
API Key控制台生成的密钥sk-xxxxxxxx
Model ID调用的模型标识按控制台可选列表填写

获取 Key 的路径是:进入控制台 → API Keys → 新建密钥。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API Keys 页面是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。如果你只是想先验证模型能不能通,可以用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 直接发一条消息测试。

这里要强调一点:TaoToken 是统一的 API 通道,不是让你绕过任何本地开发流程。你依然是在本地写 HTML、开浏览器控制台、看报错,只是把「看不懂的报错」交给模型解释。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,配置细节以文档为准。

如果你用的是 Claude Code 这类编码工具,它的配置需要 Base URL、Key、Model ID 三件套齐全,缺一个都会报认证或模型不存在。对应的接入说明在 https://taotoken.net/claudecode?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。长期做编码和 Agent 任务的话,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

准备工作做完,你手里应该有一个可用的 Key 和一个能调通的模型。接下来进入代码部分。

3. 可复制配置:电影排行榜与 Tab 选项卡的完整结构与事件绑定

这一节给的是可以直接落地的代码。我建议你新建一个index.html,把 CSS 放<style>,JS 放<script>,图片路径换成你本地的images/07.jpg或任意占位图。

3.1 电影排行榜:静态结构 + 三种 hover 写法

先看 CSS,重点是.content默认display: none,.current .content才显示:

* { margin: 0; padding: 0; } .box { width: 300px; height: 450px; margin: 50px auto; border: 1px solid #000; cursor: pointer; } .box > h1 { font-size: 20px; line-height: 35px; color: deeppink; padding-left: 10px; border-bottom: 1px dashed #ccc; } ul > li { list-style: none; padding: 5px 10px; border: 1px dashed #ccc; } ul > li:nth-child(-n+3) span { background: deeppink; } ul > li > span { display: inline-block; width: 20px; height: 20px; background: #ccc; text-align: center; line-height: 20px; margin-right: 10px; } .content { overflow: hidden; margin-top: 5px; display: none; } .content > img { width: 85px; height: 120px; float: left; } .content > p { width: 180px; height: 120px; float: right; font-size: 12px; line-height: 20px; } .current .content { display: block; }

HTML 结构如下,注意每个li里都包了一个.content:

<div class="box"> <h1>电影排行榜</h1> <ul> <li><span>1</span>电影名称 <div class="content"> <img src="images/07.jpg" alt=""> <p>简介:测试内容</p> </div> </li> <li><span>2</span>电影名称 <div class="content"> <img src="images/07.jpg" alt=""> <p>简介:测试内容</p> </div> </li> <li><span>3</span>电影名称 <div class="content"> <img src="images/07.jpg" alt=""> <p>简介:测试内容</p> </div> </li> <li><span>4</span>电影名称 <div class="content"> <img src="images/07.jpg" alt=""> <p>简介:测试内容</p> </div> </li> <li><span>5</span>电影名称 <div class="content"> <img src="images/07.jpg" alt=""> <p>简介:测试内容</p> </div> </li> <li><span>6</span>电影名称 <div class="content"> <img src="images/07.jpg" alt=""> <p>简介:测试内容</p> </div> </li> </ul> </div>

三种 hover 写法,效果一样,但语义不同:

// 写法一:mouseenter + mouseleave,最直白 $("li").mouseenter(function () { $(this).addClass("current"); }); $("li").mouseleave(function () { $(this).removeClass("current"); }); // 写法二:hover 传两个函数,等价于上面两句 $("li").hover(function () { $(this).addClass("current"); }, function () { $(this).removeClass("current"); }); // 写法三:hover 传一个函数 + toggleClass,最简洁 $('li').hover(function () { $(this).toggleClass('current'); });

写法三最短,但要注意:toggleClass依赖「进入和离开各触发一次」这个前提,如果元素本身已经有current类,第一次进入反而会把它去掉。所以写法三适合初始状态一定没有current的场景。

3.2 Tab 选项卡:有 bug 版与 siblings 修正版

CSS 关键点是.nav > .current和.content > .show:

* { margin: 0; padding: 0; } .box { width: 440px; height: 298px; border: 1px solid #000; margin: 50px auto; cursor: pointer; } .nav > li { list-style: none; width: 110px; height: 50px; background: orange; text-align: center; line-height: 50px; float: left; } .nav > .current { background: #ccc; } .content > li { list-style: none; display: none; } .content > .show { display: block; }

HTML 里导航和内容是两个独立的ul,靠索引对应:

<div class="box"> <ul class="nav"> <li class="current">独傲松鼠</li> <li>功夫花栗鼠</li> <li>飞翔松鼠</li> <li>蹦迪松鼠</li> </ul> <ul class="content"> <li class="show"><img src="images/1.jpg" width="440" height="248"></li> <li><img src="images/2.jpg" width="440" height="248"></li> <li><img src="images/3.jpg" width="440" height="248"></li> <li><img src="images/4.jpg" width="440" height="248"></li> </ul> </div>

第一种写法,只加不减,会有残留:

$(".nav>li").mouseenter(function () { $(this).addClass("current"); var index = $(this).index(); var $li = $(".content>li").eq(index); $li.addClass("show"); }); $(".nav>li").mouseleave(function () { $(this).removeClass("current"); var index = $(this).index(); var $li = $(".content>li").eq(index); $li.removeClass("show"); });

问题在于:移入第二个时,第一个的current没被清掉,多个选项卡同时高亮。修正版用siblings():

$(".nav>li").mouseenter(function () { $(this).addClass("current"); $(this).siblings().removeClass("current"); var index = $(this).index(); var $li = $(".content>li").eq(index); $li.siblings().removeClass("show"); $li.addClass("show"); });

siblings()的作用是在 DOM 树里找兄弟节点,把「除我之外的同级元素」一次性处理掉。这一步是 Tab 选项卡不残留的关键。

3.3 用 TaoToken 三件套接入 AI 辅助调试

如果你用 Cline、Claude Code 或 Codex 这类工具,配置里必须写全 Base URL、API Key、Model ID。以常见的 JSON 配置为例:

{ "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的Key", "model": "你的ModelID" }

Codex 的auth.json也是同样的三件套逻辑,缺 Model ID 会报模型不存在,缺 Key 会报 401。配置完成后,你可以把控制台报错直接贴给模型,比如「$ is not defined」「Cannot read properties of undefined (reading 'addClass')」,让它给出修改建议。

4. 验证请求与成功结果:控制台里确认点击和切换行为

代码写完,不要靠肉眼猜。打开浏览器控制台(F12),用几个命令验证。

第一步,确认 jQuery 已加载:

console.log(typeof $); // 期望输出 "function"

如果输出undefined,说明 jQuery 没引入或引入顺序错了,$未定义,后面所有事件都不会绑定。

第二步,确认选择器选到了元素:

console.log($(".nav>li").length); // 期望 4 console.log($(".content>li").length); // 期望 4 console.log($("li").length); // 注意:这个会把两组 li 都算进去

第三步,手动触发事件,看类名变化:

$(".nav>li").eq(1).trigger("mouseenter"); console.log($(".nav>li").eq(1).hasClass("current")); // 期望 true console.log($(".nav>li").eq(0).hasClass("current")); // 修正版期望 false

第四步,验证内容切换:

console.log($(".content>li").eq(1).hasClass("show")); // 期望 true console.log($(".content>li").eq(0).hasClass("show")); // 修正版期望 false

如果这四步都符合预期,说明事件绑定、索引对应、类名切换全部正确。实测下来,trigger是最省事的验证方式,不用真的用鼠标去移。

如果你想把这段调试过程交给 AI 辅助,可以把控制台输出和你的选择器一起发过去,让它判断是「选择器范围过大」还是「事件绑到了错误的 li」。模型对话入口是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

5. 本篇常见错误排查:401、选择器失效、事件不触发

这一节按真实报错来对照。

报错一:$ is not defined。原因通常是 jQuery 引入失败或<script>顺序反了。检查<script src="jquery.min.js"></script>是否在业务代码之前。如果用的是 CDN,确认网络能加载。

报错二:Cannot read properties of undefined (reading 'addClass')。说明$li是空集合,.eq(index)没选到元素。常见原因是导航li和内容li数量不一致,或者index()取到了包含文本节点的索引。用console.log($li.length)确认。

报错三:401 Unauthorized。这是 AI 通道的认证问题,不是 jQuery 的问题。检查三件套:Base URL 是否为https://taotoken.net/api,API Key 是否完整复制(注意前后空格),Model ID 是否与控制台一致。三者缺一都会 401 或模型不存在。

报错四:local proxy failed。这类报错通常出现在本地代理配置环节,检查你的工具配置里 Base URL 是否写成了带路径的完整地址,以及网络是否能正常访问 API 入口。配置以接入文档为准。

报错五:reading choices相关报错。一般是响应结构不符合预期,可能是 Model ID 写错导致返回了错误对象。回到控制台核对模型标识。

报错六:OAuth 相关报错。如果你用的是需要 OAuth 的编码工具,确认授权流程走完,且配置里的 Key 与授权账号匹配。

报错七:事件绑定了但没反应。最常见的是选择器写错,比如页面里有两组li,你写$("li").mouseenter,结果绑到了内容区的li上。改成$(".nav>li")限定范围即可。另一个原因是元素是动态生成的,绑定发生在生成之前,这时要用事件委托:

$(".nav").on("mouseenter", "li", function () { $(this).addClass("current").siblings().removeClass("current"); });

事件委托把监听挂在父元素上,子元素后生成也能触发,这是动态渲染列表场景的标准做法。

报错八:切换后样式残留。就是第 3 节说的「只加不减」,用siblings().removeClass()修正。

排查顺序建议:先看控制台有没有红色报错,再确认$和选择器长度,最后用trigger手动触发。这三步能覆盖九成以上的问题。

6. 继续深入:把这两个案例用起来

电影排行榜和 Tab 选项卡看起来简单,但它们是事件驱动的最小闭环。你把mouseenter换成click,就是点击切换;把addClass换成slideDown,就是动画展开;把静态li换成 AJAX 返回的数据,就是动态渲染列表。事件委托那一行$(".nav").on("mouseenter", "li", ...)在动态列表里几乎是必写项。

如果你在排查过程中遇到看不懂的报错,可以把控制台输出、HTML 片段、选择器一起整理好,通过 TaoToken 的模型对话入口发过去,让它帮你定位。需要长期做编码和 Agent 任务的话,Coding Plan 的入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。API Key 在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,接入细节看 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

最后留一个我常用的验证习惯:每写完一个事件,先在控制台用trigger跑一遍,确认类名变化符合预期,再去用鼠标点。这样能把「事件没绑上」和「样式没生效」两类问题分开,省掉大量来回改代码的时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询