很多站点的导航、卡片和列表标题在浏览器里点得动,但查看网页源代码时却找不到对应的链接地址。蜘蛛抓取页面时,主要依据 HTML 中可解析的 a 标签和 href 属性。如果入口只写在 click 事件里,蜘蛛在解析阶段看不到它,这个地址就等于没有出现在页面上。对用户来说也有影响:无法右键新窗口打开、不能复制链接、不方便收藏,读屏软件也难以识别。
哪些写法容易出问题
- 用 div、span、li 加 onclick 或事件监听跳转,源码里没有 href。
- 按钮元素配合 location.href,看起来像链接按钮,实际不是链接。
- 下拉菜单、折叠面板的内容由脚本在交互后才插入 DOM,初始 HTML 中没有地址。
- 卡片整块用绝对定位遮罩点击,“查看更多”的标题却没有链接。
- 分页和“加载更多”只触发请求,不留下可访问的下一页地址。
- 链接写成 javascript:void(0) 或 href 为空,再靠脚本跳转。
自查怎么做
- 在浏览器里查看页面源代码,或抓取一次 HTML,搜索 href,核对重要入口是否都在。
- 禁用 JavaScript 后再打开页面,看导航、列表、分页还能不能正常跳转。
- 用抓取工具对比“原始 HTML”和“渲染后 HTML”,如果大量链接只出现在渲染后,就要提高警惕。
- 重点检查:主导航、栏目入口、面包屑、列表页标题、分页、相关阅读、页脚重点链接。
- 抽查移动端和桌面端,确认两套模板都没有把链接换成点击事件。
修复的基本思路
把链接还原成链接:使用 a 标签,href 指向真实可访问的地址。需要额外交互时,在脚本里做增强,但要保留默认跳转能力。例如阻止默认行为前,先确认 href 是有效地址;即使脚本失效,用户仍然可以跳转。
列表卡片整块可点,可以让标题包在 a 标签里,再用样式把可点区域扩展到卡片范围,而不是反过来用 div 模拟链接。
下拉菜单和标签页的内容,尽量在初始 HTML 中就有对应链接,脚本只负责显示与隐藏,不要等到点击后才向服务器请求链接结构。
无限滚动和“加载更多”建议保留一个可用的分页地址,让蜘蛛和无法使用滚动的用户都有入口继续往下走。
上线前的小清单
- 重要入口在禁用 JavaScript 的情况下能否跳转?
- 原始 HTML 里是否能搜到目标地址?
- 是否存在 href 为空或 javascript:void(0) 的链接?
- 分页与“加载更多”是否有静态地址?
- 移动端模板是否同样保留链接?
能不能点,是用户体验问题;href 在不在,是能否被发现的问题。两者都要顾,但不要用前者替代后者。
把入口链接放回 a 标签,通常不需要大改版,只需要在模板层面调整一次,之后生成的页面都会受益。