【发布时间】:2013-12-20 08:31:19
【问题描述】:
背景
大多数questions关于从HTML中提取文本(即stripping标签)使用:
jQuery( htmlString ).text();
虽然这会抽象出浏览器的不一致(例如 innerText 与 textContent),但函数调用也会忽略块级元素的语义含义(例如 li)。
问题
在各种浏览器中保留块级元素的换行符(即语义意图)需要不小的努力,如 Mike Wilcox describes。
一个看似简单的解决方案是模拟将 HTML 内容粘贴到 <textarea> 中,这会在保留块级元素换行符的同时剥离 HTML。但是,当用户将内容粘贴到 <textarea> 时,基于 JavaScript 的插入不会触发浏览器使用的相同的 HTML 到文本例程。
我还尝试集成 Mike Wilcox 的 JavaScript code。该代码适用于 Chromium,但不适用于 Firefox。
问题
使用 jQuery(或 vanilla JavaScript)从 HTML 中提取文本同时保留 block-level elements 的语义换行符的最简单的跨浏览器方法是什么?
示例
考虑:
- 选择并复制整个问题。
- 打开textarea example page。
- 将内容粘贴到文本区域。
文本区域为有序列表、标题、预格式化文本等保留换行符。这就是我想要达到的结果。
进一步澄清,给定任何 HTML 内容,例如:
<h1>Header</h1>
<p>Paragraph</p>
<ul>
<li>First</li>
<li>Second</li>
</ul>
<dl>
<dt>Term</dt>
<dd>Definition</dd>
</dl>
<div>Div with <span>span</span>.<br />After the <a href="...">break</a>.</div>
你将如何生产:
标题 段落 第一的 第二 学期 定义 带跨度的 div。 休息后。注意:缩进和非标准化空格都不相关。
【问题讨论】:
-
这听起来是个有趣的问题。我期望一种迭代元素和节点的方法,在它进入或离开具有块计算样式的元素的任何地方插入新行(但如果没有中间文本节点,则不会加倍)或导致新行的元素(也许BR,人力资源,TR)。处理表格是另一个问题。
-
我得到了一些工作,但它依赖于 HTML 格式:jsfiddle.net/jLpCT。如果您真的想根据块级事件获得缩进文本,则必须检查每个元素并根据元素是否为块级做出决定(并且可能还以不同的方式对待不同的块级元素)。如您所见,我发布了一个答案但删除了它,因为我不确定这是否是您想要的方向。
标签: javascript jquery html text strip