检测链接的前端代码
##任务1在WEB前端中提取所有图片URL和图片绑定的响应跳转链接。##任务2在WEB前端中提取所有外站链接的地址。##任务3在WEB前端中提取所有带文字描述的内部链接及其对应的文字标题。##任务4在WEB前端中除上述3个任务中的元素以外提取出内部链接和对应的元素类型如button、icon等。void(function() { const currentHost window.location.hostname; // 获取当前域名用于判断内外站 const extractedLinks new Set(); // 记录已提取的链接用于任务4的去重 const results { task1_images: [], // 图片及跳转链接 task2_externalLinks: [], // 外站链接 task3_internalTextLinks: [],// 内部文字链接 task4_otherInternalLinks: []// 其他内部链接(按钮/图标等) }; // 辅助函数判断是否为外站 const isExternal (url) { try { return new URL(url, window.location.origin).hostname ! currentHost; } catch { return false; } }; // 辅助函数判断元素是否包含图标通过类名或属性 const isIconElement (el) { const classStr el.className?.toString().toLowerCase() || ; const roleStr el.getAttribute(role)?.toLowerCase() || ; return classStr.includes(icon) || roleStr.includes(icon) || roleStr.includes(button); }; // 任务 1提取所有图片URL和绑定的跳转链接 document.querySelectorAll(img).forEach(img { const imgUrl img.src || img.dataset.src || img.dataset.original; if (!imgUrl || imgUrl.startsWith(data:)) return; const linkTag img.closest(a); const redirectUrl linkTag ? linkTag.href : null; results.task1_images.push({ imageUrl: imgUrl, redirectUrl: redirectUrl || 无跳转链接, tagName: linkTag ? linkTag.tagName.toUpperCase() : IMG // 增加标签名称 }); if (redirectUrl) extractedLinks.add(redirectUrl); // 记录已处理的链接 }); // 遍历所有 a 标签处理任务 2 3 4 document.querySelectorAll(a[href]).forEach(link { const href link.href; const text link.innerText?.trim(); const hasText text text.length 0; const tagName link.tagName.toUpperCase(); // 获取标签名 // 任务 2提取外站链接 if (isExternal(href)) { results.task2_externalLinks.push({ url: href, text: hasText ? text : 无文字描述, tagName: tagName }); } // 内部链接处理 else { extractedLinks.add(href); // 只要是内部链接都记录到已提取集合中 // 任务 3带文字描述的内部链接 if (hasText) { results.task3_internalTextLinks.push({ url: href, title: text, tagName: tagName }); } // 任务 4除上述任务外提取其他内部链接及元素类型 else { // 判断该链接是否已经被任务1图片处理过避免重复 const hasImg link.querySelector(img) ! null; if (!hasImg) { let elementType Link; // 默认类型 if (link.getAttribute(role) button) { elementType Button; } else if (isIconElement(link)) { elementType Icon; } results.task4_otherInternalLinks.push({ url: href, elementType: elementType, tagName: tagName }); } } } }); // 任务 4 补充提取非 a 标签的内部按钮/图标 document.querySelectorAll(button, [rolebutton], [class*icon], [roleicon]).forEach(el { // 排除已经是 a 标签且被处理过的元素 if (el.tagName.toLowerCase() a extractedLinks.has(el.href)) return; let elementType Unknown; if (el.tagName.toLowerCase() button) elementType Button; else if (isIconElement(el)) elementType Icon; // 尝试获取按钮/图标的文字或 aria-label const text el.innerText?.trim() || el.getAttribute(aria-label) || 无文字描述; results.task4_otherInternalLinks.push({ url: el.onclick?.toString() || 无跳转链接, elementType: elementType, description: text, tagName: el.tagName.toUpperCase() // 增加标签名称 }); }); // 格式化输出结果 const resultDiv document.createElement(div); resultDiv.id web-asset-extractor-result; const oldDiv document.getElementById(web-asset-extractor-result); if (oldDiv) oldDiv.remove(); let html b 网页资产提取完成 (含标签名)/bhr; html b️ 任务1 - 图片及跳转 (${results.task1_images.length})/bbr; results.task1_images.slice(0, 3).forEach(i html • [${i.tagName}] ${i.imageUrl} ➔ ${i.redirectUrl}br); if (results.task1_images.length 3) html ... 等共 ${results.task1_images.length} 项br; html brb 任务2 - 外站链接 (${results.task2_externalLinks.length})/bbr; results.task2_externalLinks.slice(0, 3).forEach(i html • [${i.tagName}] ${i.url} (${i.text})br); if (results.task2_externalLinks.length 3) html ... 等共 ${results.task2_externalLinks.length} 项br; html brb 任务3 - 内部文字链接 (${results.task3_internalTextLinks.length})/bbr; results.task3_internalTextLinks.slice(0, 3).forEach(i html • [${i.tagName}] ${i.title} ➔ ${i.url}br); if (results.task3_internalTextLinks.length 3) html ... 等共 ${results.task3_internalTextLinks.length} 项br; html brb 任务4 - 其他内部元素 (${results.task4_otherInternalLinks.length})/bbr; results.task4_otherInternalLinks.slice(0, 3).forEach(i html • [${i.tagName} / ${i.elementType}] ${i.description || i.url}br); if (results.task4_otherInternalLinks.length 3) html ... 等共 ${results.task4_otherInternalLinks.length} 项br; resultDiv.style.cssText position:fixed;top:10px;left:10px;z-index:999999;background:#fff;border:1px solid #ccc;padding:15px;max-height:500px;overflow:auto;font-size:12px;box-shadow:0 4px 15px rgba(0,0,0,0.15);color:#333;max-width:600px;word-break:break-all;line-height:1.6;; resultDiv.innerHTML html; document.body.appendChild(resultDiv); // 在控制台输出完整的 JSON 数据方便复制使用 console.log( 完整提取数据 (JSON), results); })();

相关新闻

第10章:常见问题与避坑指南

第10章:常见问题与避坑指南

第10章:常见问题与避坑指南 本章目标 汇总 Git / TortoiseGit 使用中最高频的 30 个问题:症状 → 原因 → 解决。建议遇到问题时用 CtrlF 搜索报错关键字。 1. 中文乱码问题 1.1 git log / git status 中文显示为八进制(\344\275\240&#x…

2026/9/24 17:46:43 阅读更多 →
宝塔菜农药残留检测试剂盒:国标限量、超标风险与快速检测方案

宝塔菜农药残留检测试剂盒:国标限量、超标风险与快速检测方案

宝塔菜农药残留辛硫磷、啶虫脒、腐霉利等超标风险突出。冠宇仪器制造(江苏)有限公司推出宝塔菜农药残留检测试剂盒,农药残留胶体金试剂盒能够快速检测宝塔菜中的地虫硫磷、丁硫克百威、毒虫畏、毒死蜱、对硫磷等农药残留,农药残留…

2026/9/24 17:45:42 阅读更多 →
按键为什么会乱跳:一次按下为什么变成很多次

按键为什么会乱跳:一次按下为什么变成很多次

LED 亮起来之后,我又插上了两个轻触按键。A 按键接 PB11,B 按键接 PB1;两个按键的另一端都接 GND。A 按一下,数值加一,B 按一下,数值减一,三颗外接 LED 把这个数值显示成三位二进制。 第一次测试…

2026/9/24 17:45:42 阅读更多 →

最新新闻

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

简介:基于jspmysql的JSP个人日记本源码,是一份面向Java Web初学者与课程设计场景的完整Web应用项目。资源以JSP作为视图层、Servlet处理控制逻辑,结合MySQL存储用户、日记与分类数据,覆盖用户登录、会话保持、日记增删改查、分类管…

2026/9/24 18:29:14 阅读更多 →
2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

AirPods这个品类,现在真的有点“乱花渐欲迷人眼”了。从最初只有一款标准版,到如今AirPods 4、AirPods Pro、AirPods Max三条线并行,Plus版一般、Lite版传闻满天飞,哪怕是数码圈老手,真要下手买前不花点时间做功课&…

2026/9/24 18:29:14 阅读更多 →
结构可靠性分析:验算点法与直接抽样组合实战

结构可靠性分析:验算点法与直接抽样组合实战

简介:面向结构可靠性与安全度评估的实用算法压缩包,适合结构工程专业学生、科研人员及从事可靠性分析的工程师。资源聚焦验算点法和直接抽样法,同时涉及蒙特卡洛模拟思路,用于计算结构失效概率、评估极端荷载下的安全裕度&#xf…

2026/9/24 18:29:14 阅读更多 →
前后端分离部署实战:systemd托管Java进程+Nginx反向代理

前后端分离部署实战:systemd托管Java进程+Nginx反向代理

1. 部署方案设计与总体思路1.1 为什么是“systemd Nginx”这套组合前后端分离项目的部署,说简单也简单,说麻烦也麻烦。简单在于流程是固定的——后端打成 jar 包跑起来,前端构建出静态文件扔给 Web 服务器。麻烦在于每一个环节都有坑&#x…

2026/9/24 18:29:14 阅读更多 →
腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

上个月帮一个朋友的博客站点排查访问慢的问题。他的服务器带宽只有5M,文章里全是高清截图和录屏素材,高峰期十几个人同时打开就卡得不行。我顺手看了眼他用的还是老式按量计费CDN,月底账单里光是流量费就占了一半。我说你这个站,流…

2026/9/24 18:29:14 阅读更多 →
Linux与Windows系统运维:参数查询与配置命令对照实战

Linux与Windows系统运维:参数查询与配置命令对照实战

很多时候,我们干的活儿并不是什么高深莫测的架构设计,反而是那些每天都在重复的“查一下参数、改一个配置”。尤其是当你的手头同时管着 Windows 服务器和 Linux 服务器时,这种“精神分裂”的感觉会特别明显:明明在 Windows 上用图…

2026/9/24 18:28:13 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →