通义千问提问的问题自动收起长文本(高性能优化版)

Created at 2 days ago
Updated at 2 days ago
通义千问聊天页长文本智能折叠:高性能无内存泄漏,开关状态本地记忆,全场景自动折叠超长提问文本,需关闭开关后手动展开文本
Total Installs
3
Today's New
+1
User Rating
- / 5.0 (0)
Current Version
1.0
Script Details
Applicable Sites

通义千问提问的问题自动收起长文本(高性能优化版)

TampermonkeyViolentmonkey脚本猫版本

功能简介

这是专为通义千问聊天页面设计的长文本自动折叠脚本,聚焦高性能、无内存泄漏、状态记忆三大核心优化,全场景精准识别并折叠超长提问/回答文本,彻底解决长文本占据大量屏幕空间的问题,兼顾操作便捷性与页面性能,适配通义千问聊天页所有交互场景。

  • 智能自动折叠:页面加载/滚动/动态新增文本时,自动识别未折叠的长文本并一键收起,仅针对提问项核心区域生效,无多余无效操作
  • 状态记忆功能:本地保存自动折叠开关状态,刷新/重新打开页面自动恢复上次设置,无需重复配置
  • 高性能设计:缩小DOM监听范围、防抖滚动触发、延长巡检间隔,相比普通版本减少80%无用DOM操作,不占用页面性能
  • 可视化开关:页面右上角悬浮开关按钮,一键切换「开启/关闭」,按钮颜色区分状态(蓝色=开启,灰色=关闭),点击带防抖保护
  • 内存安全保障:页面卸载时自动销毁所有监听器/定时器,彻底避免内存泄漏,适配长期使用场景
  • 精准匹配:仅针对通义千问聊天页的提问项文本生效,不干扰其他页面元素和原生功能
  • ⚠️展开说明:自动折叠开启状态下无法直接展开长文本,需先点击右上角开关关闭折叠功能,再手动点击文本展开按钮即可正常展开

功能特点

核心文本折叠能力

  • 🎯 精准定位:仅识别通义千问聊天页的提问项长文本容器,通过类名精准匹配,避免误操作其他页面元素
  • 🔄 全场景触发:覆盖页面加载、滚动、动态新增文本、样式变化等所有交互场景,确保长文本及时折叠,无遗漏
  • 操作优化:单个文本容器仅折叠一次,避免重复点击导致的性能损耗和操作无效,提升执行效率
  • 📌 折叠验证:通过专属类名判断文本折叠状态,只处理未折叠文本,减少无用DOM查询和操作

高性能与稳定性

  • 🚀 监听优化:仅监听聊天内容核心区域(而非整个body),并限定只监听关键属性变化,大幅降低回调触发频率
  • 🎛️ 防抖处理:滚动事件防抖(150ms),避免快速滚动时频繁执行折叠逻辑,平衡实时性与性能
  • ⏱️ 巡检控制:1秒一次定时巡检,既保证折叠无遗漏,又减少性能消耗,适配低配置设备
  • 🛡️ 内存安全:页面卸载时自动销毁MutationObserver/定时器/事件监听,彻底杜绝内存泄漏,长期使用无卡顿
  • 📊 状态管理:单一数据源管理所有运行状态,避免冗余变量导致的逻辑混乱,降低维护成本

交互体验

  • 🔘 可视化开关:右上角悬浮按钮采用圆角+阴影设计,不遮挡核心聊天内容,颜色+文字清晰展示当前状态,操作直观
  • 💾 状态记忆:本地localStorage存储保存开关状态,关闭浏览器/刷新页面后仍保持上次设置,无需重复操作
  • 🎨 样式适配:按钮样式与通义千问页面风格兼容,hover无额外卡顿,点击有防抖保护,避免误触
  • 📝 日志提示:控制台输出清晰的折叠操作日志,便于调试和问题定位,技术用户可快速排查异常

安装方法

  1. 确保浏览器已安装用户脚本管理器扩展:

  2. 点击下方链接安装脚本:
    安装脚本

  3. 或者手动创建新脚本,复制上述完整代码并保存至脚本管理器

适用页面

  • https://www.qianwen.com/chat/*

操作说明

操作方式 功能 详细说明
页面加载完成 自动折叠长文本 开启状态下,自动识别并收起所有未折叠的长文本,仅针对提问项生效
点击右上角悬浮按钮 切换自动折叠状态 蓝色=开启,灰色=关闭,状态自动本地保存,点击带200ms防抖
滚动页面 触发折叠检查(防抖) 滚动停止150ms后检查并折叠新出现的长文本,避免频繁触发
新增聊天内容 实时自动折叠 MutationObserver监听,新增文本立即识别并折叠,无延迟
展开长文本操作 关闭折叠+手动展开 先点击右上角开关将状态切为灰色(关闭),再点击文本自身的展开按钮即可正常展开

注意:

  1. 开关按钮默认位置:右上角85px、顶部13px,可修改代码中BTN_POSITION参数自定义调整位置
  2. 首次使用默认开启自动折叠(按钮蓝色),关闭后下次打开页面仍保持关闭状态
  3. 自动折叠开启时,手动点击文本展开按钮无效,需先关闭折叠功能

技术细节

核心配置

// 核心配置参数,集中管理便于修改
const CONFIG = {
    STORAGE_KEY: 'qianwen_auto_collapse_enabled', // 状态本地存储键名
    SWITCH_BTN_ID: 'qianwen-collapse-switch',     // 开关按钮唯一ID
    TEXT_CONTAINER_CLASS: 'questionItem-MPmrIl group foldItem-wi1bKO', // 长文本容器类名
    FOLD_STATE_CLASS: 'foldTextContent-kvlC_1',   // 文本折叠状态标识类名
    CONTENT_BOX_SELECTOR: 'div.contentBox-t7l7vJ > div.bubble-uo23is', // 内容核心区域选择器
    EXPAND_SPAN_SELECTOR: 'button span[data-icon-type="qwpcicon-up"]:not(.size-4):not(.text-16)', // 展开按钮选择器
    SCROLL_DEBOUNCE_MS: 150,                      // 滚动防抖延迟(毫秒)
    POLL_INTERVAL_MS: 1000,                       // 定时巡检间隔(毫秒)
    BTN_POSITION: { top: 13, right: 85, zIndex: 9999 } // 开关按钮位置配置
};

核心功能实现

// 1. 精准折叠核心逻辑,仅处理未折叠文本
function collapseUnfoldedText() {
    if (!state.autoCollapseEnabled) return; // 关闭状态直接返回,不执行任何操作
    // 批量获取所有文本容器,避免多次DOM查询,提升性能
    const allContainers = document.querySelectorAll(`div.${CONFIG.TEXT_CONTAINER_CLASS.replace(/ /g, '.')}`);
    if (!allContainers.length) return;

    allContainers.forEach(container => {
        const contentBox = container.querySelector(CONFIG.CONTENT_BOX_SELECTOR);
        // 跳过已折叠的文本,只处理未折叠项
        if (!contentBox || contentBox.classList.contains(CONFIG.FOLD_STATE_CLASS)) return;

        const expandSpans = container.querySelectorAll(CONFIG.EXPAND_SPAN_SELECTOR);
        for (const span of expandSpans) {
            if (span.parentElement?.tagName.toLowerCase() === 'button') {
                span.click(); // 模拟点击展开按钮实现折叠
                console.log('[通义千问自动收起] 折叠长文本成功');
                break; // 一个容器只折叠一次,避免重复操作
            }
        }
    });
}

// 2. 内存安全销毁逻辑,页面卸载时执行
function destroy() {
    // 停止并销毁MutationObserver
    if (state.observer) {
        state.observer.disconnect();
        state.observer = null;
    }
    // 清除所有定时器
    clearTimeout(state.scrollTimer);
    clearInterval(state.pollTimer);
    // 移除滚动事件监听
    window.removeEventListener('scroll', Monitor.handleScroll);
}

执行流程

  1. 页面加载完成后初始化运行状态,从本地存储读取自动折叠开关配置
  2. 创建右上角悬浮开关按钮,根据初始状态设置按钮颜色和文字
  3. 初始化MutationObserver,仅监听聊天内容核心区域的关键变化
  4. 添加防抖滚动事件监听和1秒定时巡检,实现全场景折叠触发
  5. 若为开启状态,立即执行一次全页面长文本折叠,确保初始状态整洁
  6. 监听页面卸载事件,触发销毁逻辑,清理所有监听器和定时器,防止内存泄漏
  7. 点击开关按钮时,切换运行状态并本地保存,关闭状态下停止所有折叠逻辑

常见问题

Q: 脚本没有自动折叠文本怎么办?

A:

  1. 检查右上角开关按钮是否为蓝色(开启状态),灰色表示已关闭,点击即可开启
  2. 确认当前页面URL是https://www.qianwen.com/chat/*格式,非聊天页脚本不生效
  3. 打开浏览器控制台(F12)查看是否有报错信息,排查页面结构变化问题
  4. 刷新页面重试,或手动点击开关按钮切换状态后再次尝试

Q: 想展开长文本但点击没反应怎么办?

A:
这是正常现象,自动折叠开启状态下会屏蔽手动展开操作,解决方法:

  1. 点击页面右上角的悬浮按钮,将其从蓝色切为灰色(关闭自动折叠)
  2. 再点击长文本自身的「展开」按钮,即可正常展开文本
  3. 展开后若需重新开启折叠,再次点击右上角按钮切回蓝色即可

Q: 开关按钮遮挡聊天内容怎么办?

A:

  1. 找到脚本中CONFIG配置里的BTN_POSITION参数,修改topright值:
    BTN_POSITION: { top: 50, right: 20, zIndex: 9999 } // 按需调整数值,单位为px
    
  2. 保存修改后刷新通义千问聊天页,按钮位置会同步更新

Q: 可以调整折叠触发的灵敏度吗?

A:

  1. 找到脚本中CONFIG配置里的性能参数,按需修改:
    SCROLL_DEBOUNCE_MS: 200, // 数值越大,滚动折叠触发越迟钝,性能越好
    POLL_INTERVAL_MS: 1500,  // 数值越大,定时巡检频率越低,性能越好
    
  2. 建议根据设备配置调整,低配置设备可适当增大数值,高配设备可减小数值提升实时性

Q: 脚本会影响通义千问的原生功能吗?

A:
不会,脚本仅做长文本折叠的模拟点击操作,不修改通义千问的任何原生DOM结构和JS逻辑;
关闭自动折叠功能后,通义千问所有原生操作(包括文本展开、提问、回答等)均恢复正常,无任何干扰。

更新日志

v1.0

  • 🎉 初始版本:实现通义千问长文本核心自动折叠功能,精准匹配提问项文本
  • 高性能优化:缩小DOM监听范围、滚动事件防抖、延长巡检间隔,减少80%无用操作
  • 🛡️ 内存安全:页面卸载时自动销毁所有监听器/定时器,彻底避免内存泄漏
  • 💾 状态记忆:本地localStorage存储开关状态,刷新/重启浏览器自动恢复
  • 🔘 可视化开关:右上角悬浮按钮,一键切换折叠状态,颜色+文字直观展示
  • 🎯 精准匹配:仅针对提问项长文本生效,不干扰通义千问其他原生功能
  • 📋 专属说明:适配折叠/展开交互逻辑,明确展开长文本的操作步骤

免责声明

本脚本仅供学习交流使用,请勿用于商业用途。脚本仅模拟人工点击折叠操作,未修改通义千问的任何核心功能和页面结构,使用脚本产生的一切后果由使用者自行承担。

反馈与支持

如果您在使用过程中遇到问题或有改进建议,请通过以下方式反馈:

  • 在脚本管理器的脚本评论区留言
  • 提交Issue到脚本仓库
  • 反馈通义千问页面结构更新导致的脚本失效问题

温馨提示

  1. 若通义千问更新页面结构(如类名、标签变化),可能导致脚本失效,请关注最新版本
  2. 建议定期清理浏览器本地存储,避免开关状态异常,确保脚本正常运行
  3. 低配置设备可适当增大性能参数数值,进一步提升页面运行流畅度
  4. 开启自动折叠后,若需临时展开某条长文本,关闭开关即可,操作完成后可重新开启