• 搜索
  • 夜间模式
    ©2026  王较瘦?【Since 2006】 Theme by OneBlog
    搜索
    标签
    # 生活碎片/灵感时刻 # 瞎折腾/主题制作 # 生活碎片/摄影生活 # 生活碎片/游山玩水 # 贵阳市 # 生活碎片/游戏 # 重庆市 # 三亚 # 成都市 # 崇左市
  • 首页>
  • 日志>
  • 正文
  • Typecho 文档:文章(日志)段落的点评(评论)功能

    2025年02月20日 79 阅读 0 评论 4627 字

    工作原理:Typecho 默认有 autoP 功能,以此作为段落的划分,这样就能对每个 <p> 添加 id 标记,用于引用和定位,另外,功能实现上也加入常用的引用元素 <blockquote> #瞎折腾/主题制作

    原文:文章(日志)段落的点评(评论)功能-link

    主要功能:

    1. 点击段落后,将该段落的截断内容(或图片)插入评论内容中,并跳至评论区。
    2. 提交评论后,点击点评时引用的段落,也会跳至文章对应的段落。
    3. 要注意的是,使用段落点评功能后,文章请勿再新增段落,否则,已提交引用且点评的段落会和编辑后文章段落的 id 对不上。当然,可以在保持段落位置和数量不变的情况下,对文章内容文字做编辑。

    改造文件

    1. 后台》设置》评论,在(允许使用的HTML标签和属性)项里输入 <img src="">
    2. 以上操作的作用是:让评论内容解析输出图片。
    3. 打开你在用主题下的文件 footer.php 找个合适的位置添加以下代码(留意注释,以及按需修改)

    [details 代码如下:]

     <script>
        const container = document.querySelector('.post-content'); // 获取文章内容的容器元素 post-content(根据自己的主题修改)
        const paragraphs = container.querySelectorAll('p'); // 获取文章内容所有的 <p> 元素(依据 Typecho 默认的 autoP 功能)
        const blockquotes = container.querySelectorAll('blockquote'); // 获取文章内容所有的 <blockquote> 元素(即:引用)
        const comments = document.querySelectorAll('.comment-content p'); // 获取评论内容所有的 <p> 元素(根据自己的主题修改,通常为 .comment-content p)
        const textarea = document.getElementById('textarea'); // 获取评论内容的表单 <textarea> (根据自己的主题修改,通常为 textarea)
    
        paragraphs.forEach((p, index) => { // 遍历文章内容所有 <p> 元素,并分配 id
            const id = `p${index + 1}`; // 自定义 p 为前缀
            p.setAttribute('id', id); // 添加 id
    
            const imgElement = p.querySelector('img'); // 查找 <p> 元素中的 <img> 元素
    
            if (imgElement) { // 如果 <p> 包含 <img> 元素,则将图片信息添加到 <textarea>
                const imageSrc = imgElement.getAttribute('src'); // 获取图片的 src 属性
                const imageAlt = imgElement.getAttribute('alt'); // 获取图片的 alt 属性
    
                p.addEventListener('click', () => { // 添加点击事件处理程序
                    const imgTag = `<img src="${imageSrc}" alt="${imageAlt}" />`; // 添加到 <textarea> 的内容结构,如果不想显示图片,则改为 `${imageAlt}`(即:只显示 alt 部分)
                    addToTextarea(id, imgTag); // 添加标记信息,并传递给 addToTextarea 函数
                    focusTextarea(); // 调用 focusTextarea() 方法,使 <textarea> 获取焦点
                    textarea.scrollIntoView({ behavior: 'smooth' }); // 滚动到 <textarea> 的位置
                });
            } else { // 如果 <p> 不包含 <img> 元素,则将文本内容添加到 <textarea>
                p.addEventListener('click', () => { // 添加点击事件处理程序
                    const content = p.textContent; // 定义内容
                    const maxLength = 32; // 设置截取的最大字数
                    const truncatedContent = truncateString(content, maxLength); // 截断后的内容
                    addToTextarea(id, truncatedContent); // 添加标记信息,并传递给 addToTextarea 函数
                    focusTextarea(); // 调用 focusTextarea() 方法,使 <textarea> 获取焦点
                    textarea.scrollIntoView({ behavior: 'smooth' }); // 滚动到 <textarea> 的位置
                });
            }
        });
    
        blockquotes.forEach((blockquote, index) => { // 遍历所有的 <blockquote> 元素,并分配 id
            const id = `blockquote${index + 1}`; // 自定义 blockquote 为前缀
            blockquote.setAttribute('id', id); // 添加 id
    
            blockquote.addEventListener('click', () => { // 添加点击事件处理程序
                const content = blockquote.textContent // 定义内容
                const maxLength = 32; // 设置截取的最大字数
                const truncatedBlockquote = truncateString(content, maxLength); // 截断后的内容
                addToTextarea(id, truncatedBlockquote); // 添加标记信息,并传递给 addToTextarea 函数
                focusTextarea(); // 调用 focusTextarea() 方法,使 <textarea> 获取焦点
                textarea.scrollIntoView({ behavior: 'smooth' }); // 滚动到 <textarea> 的位置
            });
        });
    
        function truncateString(str, maxLength) { // 截取字符串到指定长度
            if (str.length > maxLength) { // 截取内容
                return str.substring(0, maxLength) + '...';  // 输出内容,多出的以 ... 代替
            }
    
            return str;
        }
    
        function focusTextarea() { // 使 <textarea> 获取焦点的函数
            textarea.focus();
        }
    
        function addToTextarea(paragraphId, content) { // 添加内容到 <textarea> 同时记录标记信息
            const existingContent = textarea.value; // 获取 <textarea> 中已有的内容
            const newLine = existingContent ? '\n' : ''; // 判断是否已有内容,如果有则另起一行
            textarea.value += newLine + '\n' + `引用 [${paragraphId}]:${content} \n\n`; // 使用中括号来标记唯一标识符,并插入内容及空行
        }
    
        comments.forEach((p) => { // 遍历所有的 <comments> 元素
            p.addEventListener('click', () => { // 添加点击事件处理程序
                const targetDataId = p.textContent.match(/\[(.*?)\]/)[1]; // 只保留方括号里的 id 编码
                const targetParagraph = container.querySelector(`#${targetDataId}`); // 查找文章内容中对应的 id
                if (targetParagraph) {
                    targetParagraph.scrollIntoView({ behavior: 'smooth' }); // 滚动到文章内容对应 id 的位置
                }
            });
        });
        </script>

    [/details]

    至此,已经可以通过点击文章段落点评该段落内容(或图片)了。

    本文著作权归作者 [ 王叔书 ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    瞎折腾/主题制作
    — END —
    Copyright©2026  All Rights Reserved.  Load:0.015 s
    Theme by OneBlog V3.6.4
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。