从DOM中提取无格式文本的最佳方法是保留换行符?

时间:2016-07-10 11:53:32

标签: javascript dom

假设我在HTML中有以下元素TEXT

<div id="TEXT">
  <p>First <strong>Line</strong></p>
  <p>Seond <em>Line</em></p>
</div>

如何从这个元素中提取原始文本,不使用HTML标记,但保留换行符?

我知道以下两个选项,但它们似乎都不完美:

  1. document.getElementById("TEXT").textContent
    • 返回
      • First LineSecond Line
    • 问题:忽略段落之间应包含的换行符
  2. document.getElementById("TEXT").innerText
    • 返回
      • First Line Second Line
    • 问题:不属于W3C标准,不保证可以在所有浏览器中使用

2 个答案:

答案 0 :(得分:0)

这里有一个方便的功能,用于获取任何元素的文本内容,它在所有平台上运行良好,是的,它保留了换行符。

function text(e){
    var t = "";
    e = e.childNodes || e;
    for(var i = 0;i<e.length;i++){
        t+= e[i].nodeType !=1 ? e[i].nodeValue : text(e[i].childNodes);
    }
    return t;
}

答案 1 :(得分:0)

你可以检查jQuery是如何做到的。它使用sizzle js。这是您可以使用的功能。

<div id="TEXT">
  <p>First <strong>Line</strong></p>
  <p>Seond <em>Line</em></p>
</div>
<script>
var getText = function( elem ) {
    var node,
        ret = "",
        i = 0,
        nodeType = elem.nodeType;

    if ( !nodeType ) {
        // If no nodeType, this is expected to be an array
        while ( (node = elem[i++]) ) {
            // Do not traverse comment nodes
            ret += getText( node );
        }
    } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
        // Use textContent for elements
        // innerText usage removed for consistency of new lines (jQuery #11153)
        if ( typeof elem.textContent === "string" ) {
            return elem.textContent;
        } else {
            // Traverse its children
            for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
                ret += getText( elem );
            }
        }
    } else if ( nodeType === 3 || nodeType === 4 ) {
        return elem.nodeValue;
    }
    // Do not include comment or processing instruction nodes

    return ret;
};
console.log(getText(document.getElementById('TEXT')));
<script>