Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从DOM保留换行符中提取未格式化文本的最佳方法?_Javascript_Dom - Fatal编程技术网

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

Javascript 从DOM保留换行符中提取未格式化文本的最佳方法?,javascript,dom,Javascript,Dom,假设我在HTML中有以下元素TEXT: <div id="TEXT"> <p>First <strong>Line</strong></p> <p>Seond <em>Line</em></p> </div> 第一行 第一线 如何从这个元素中提取原始文本,没有HTML标记,但保留换行符 我知道以下两种选择,但它们似乎都不完美: document.getEleme

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

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

第一行

第一线

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


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

  • document.getElementById(“TEXT”).textContent
    • 返回
      • 第一行第二行
    • 问题:忽略段落之间应包含的换行符
  • document.getElementById(“文本”).innerText
    • 返回
      • 第一行
        第二行
    • 问题:不是W3C标准的一部分,也不能保证在所有浏览器中都能工作

  • 这是一个方便的函数,用于获取任何元素的文本内容,它在所有平台上都能很好地工作,并且可以保留换行符

    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;
    }
    
    函数文本(e){
    var t=“”;
    e=e.childNodes | | e;
    
    对于(var i=0;i,您可以检查jQuery是如何实现的。它使用了。下面是您可以使用的函数

    <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>
    
    
    第一行

    第一线

    var getText=函数(elem){ 变量节点, ret=“”, i=0, nodeType=elem.nodeType; if(!nodeType){ //如果没有节点类型,则应为数组 while((node=elem[i++])){ //不要遍历注释节点 ret+=getText(节点); } }else if(节点类型===1 | |节点类型===9 | |节点类型===11){ //对元素使用文本内容 //为了新行的一致性,删除了innerText用法(jQuery#11153) if(元素的类型。文本内容==“字符串”){ 返回elem.textContent; }否则{ //遍历其子对象 for(elem=elem.firstChild;elem;elem=elem.nextSibling){ ret+=getText(elem); } } }else if(节点类型===3 | |节点类型===4){ 返回elem.nodeValue; } //不包括注释或处理指令节点 返回ret; }; log(getText(document.getElementById('TEXT'));
    比textContent有更多的支持,IE8不能满足这一点——还有这个:还有这个