JS text节点无innerHTML

在线预览

text节点无innerHTML这个属性!!!

如果直接修改text节点的属性(data,nodeValue,textContent),或者使用js原生的修改text节点的内容的方法都会将HTML的预留字符变成转义字符直接显示成文本了,解决方法有:

  1. 使用正则表达式找出pre的innerHTML字符串中的全部text节点的字符串进行修改
  2. 给text外面包裹一个标签,改包裹标签的innerHTML,把包裹标签的内容移动到外面,删除包裹标签
  3. 使用jquery的replaceWith方法,这个就非常严谨了
replaceWith: function( value ) {
  var isFunc = jQuery.isFunction( value );

  // Make sure that the elements are removed from the DOM before they are inserted
  // this can help fix replacing a parent with child elements
  if ( !isFunc && typeof value !== "string" ) {
    value = jQuery( value ).not( this ).detach();
  }

  return this.domManip( [ value ], true, function( elem ) {
    var next = this.nextSibling,
      parent = this.parentNode;

    if ( parent ) {
      jQuery( this ).remove();
      parent.insertBefore( elem, next );
    }
  });
},

例:将pre标签中的回车替换为<br>,空格替换为&ebsp;,制表符替换成双&ebsp;

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    pre,
    code {
      font-family: "Menlo", monospace;
      -webkit-text-size-adjust: 100%;
    }

    code {
      line-height: 1em;
    }

    pre {
      border-left: solid 2px #ccc;
      padding-left: 18px;
      margin: 2em 0 2em -20px;
    }

    .html .string,
    .javascript .string,
    .javascript .regexp {
      color: #756bb1;
    }

    .html .tag,
    .css .tag,
    .javascript .keyword {
      color: #3182bd;
    }

    .comment {
      color: #636363;
    }

    .html .doctype,
    .javascript .number {
      color: #31a354;
    }

    .html .attr,
    .css .attr,
    .javascript .class,
    .javascript .special {
      color: #e6550d;
    }
  </style>
</head>
<body>
<pre><code class="javascript hljs">d3.selectAll(<span class="string">"circle"</span>).transition()
    .duration(<span class="number">750</span>)
    .delay(<span class="function"><span class="keyword">function</span>(<span class="params">d, i</span>) </span>{ <span class="keyword">return</span> i * <span class="number">10</span>; })
    .attr(<span class="string">"r"</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{ <span class="keyword">return</span> <span class="built_in">Math</span>.sqrt(d * scale); });</code></pre>
  <button onclick="pre_replace()">Replace all line breaks,blanks and tabs.</button>
  <p>innerHTML of pre: </p>
  <p id="html-of-pre"></p>
  <script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.js"></script>
  <script>
    //引入jquery仅仅为了使用jquery的replaceWith方法
    ‘use strcat‘
    var pre = document.querySelector(‘pre‘)
    var p = document.querySelector(‘#html-of-pre‘)
    p.innerText = pre.innerHTML

    /** 递归获取子节点
      1   Element                 代表元素
      2   Attr                    代表属性
      3   Text                    代表元素或属性中的文本内容
      4   CDATASection            代表文档中的 CDATA 部分(不会由解析器解析的文本)
      5   EntityReference         代表实体引用
      6   Entity                  代表实体
      7   ProcessingInstruction   代表处理指令
      8   Comment                 代表注释
      9   Document                代表整个文档(DOM 树的根节点)
      10  DocumentType            向为文档定义的实体提供接口
      11  DocumentFragment        代表轻量级的 Document 对象,能够容纳文档的某个部分
      12  Notation                代表 DTD 中声明的符号
    */
    var allChildNodes = function(node, type){
      // 1.创建全部节点的数组
      var allCN = [];

      // 2.递归获取全部节点
      var getAllChildNodes = function(node, type, allCN){
        // 获取当前元素所有的子节点nodes
        var nodes = node.childNodes;
        // 获取nodes的子节点
        for (var i = 0; i < nodes.length; i++) {
            var child = nodes[i];
            // 判断是否为指定类型节点
            if(child.nodeType == type){
                allCN.push(child);
            }
            getAllChildNodes(child, type, allCN);
        }
      }
      getAllChildNodes(node, type, allCN);
      // 3.返回全部节点的数组
      return allCN;
    }

    var pre_replace = function(){
      var keys = Object.keys || function(obj) {
          obj = Object(obj)
          var arr = []
          for (var a in obj) arr.push(a)
          return arr
      }
      var replace_map = {
        ‘\n‘: "<br/>",
        ‘ ‘: "&ensp;",
        ‘\t‘: "&ensp;&ensp;"
      }
      var allTextNodes = allChildNodes(pre, 3);
      /*
        text节点无innerHTML这个属性!!!
        如果直接修改text节点的属性(data,nodeValue,textContent),或者使用js原生的修改text节点的内容的方法都会将HTML的预留字符变成转义字符直接显示成文本了,解决方法有:
        1. 使用正则表达式找出pre的innerHTML字符串中的全部text节点的字符串进行修改
        2. 给text外面包裹一个标签,改包裹标签的innerHTML,把包裹标签的内容移动到外面,删除包裹标签
        3. 使用jquery的replaceWith方法,这个就非常严谨了
        replaceWith: function( value ) {
          var isFunc = jQuery.isFunction( value );

          // Make sure that the elements are removed from the DOM before they are inserted
          // this can help fix replacing a parent with child elements
          if ( !isFunc && typeof value !== "string" ) {
            value = jQuery( value ).not( this ).detach();
          }

          return this.domManip( [ value ], true, function( elem ) {
            var next = this.nextSibling,
              parent = this.parentNode;

            if ( parent ) {
              jQuery( this ).remove();
              parent.insertBefore( elem, next );
            }
          });
        },
      */
      allTextNodes.forEach(function(textNode){
        $(textNode).replaceWith(()=>{
          return textNode.data.replace(RegExp(‘[‘ + keys(replace_map).join(‘‘) + ‘]‘, ‘g‘), function(match){
            // console.log(match, replace_map[match])
            return replace_map[match]
          })
        })
      });
      p.innerText = pre.innerHTML
    }
  </script>
</body>
</html>

原文地址:https://www.cnblogs.com/jffun-blog/p/8448306.html

时间: 2024-10-14 22:10:46

JS text节点无innerHTML的相关文章

JS-text节点模拟innerHTML属性

# [在线预览](https://jsfiddle.net/1010543618/mz7ybu8g/2/) text节点无innerHTML这个属性!!! 如果直接修改text节点的属性(data,nodeValue,textContent),或者使用js原生的修改text节点的内容的方法都会将HTML的预留字符变成转义字符直接显示成文本了,解决方法有: 1. 使用正则表达式找出pre的innerHTML字符串中的全部text节点的字符串进行修改 2. 给text外面包裹一个标签,改包裹标签的i

js实现节点(div)名称编辑

节点html代码如下: <div class="img_1" id="img_1" > <input type="image" class="img_1" src="img/cump.png"></input> <div class="noteText" id="noteTxt" type="text" o

原生JS的使用,包括jquery和原生JS获取节点、jquery和原生JS修改属性的比较

一.前言 相比于JS这条直达终点.满是荆棘的小路,jquery无疑是康庄大道了,足够的简洁.易用给了它辉煌的地位.然而,毕竟是绕着道的插件,当小路走着走着变成大路的时候,曾经的大路也就失去了他自身的优势了. 原生JS虽然没有jquery那么的好用.便捷,或者说没有jquery那样让我们使用的如此顺手,甚至是无法舍弃的依赖.可是我们依然不得不扔掉手中这根陪伴我们多年的拐杖,我们不是瘸子,我们不曾腐朽,我们还可以独立前行. 二.正文 1. jquery和原生JS获取节点的比较 //这是HTML代码,

原生js添加节点的高级简便写法

insertAdjacentHTML()        原生js添加节点element.insertAdjacentHTML(position,text); var obj = document.getElementById("btn1"); obj.insertAdjacentHTML("afterEnd","<br><input name="txt1">"); 原文地址:https://www.cn

Text节点

Text节点为文本节点 nodeType为3 nodeName为“#Text” nodeValue为文本节点的内容,nodeValue也可以用data表示,都代表文本节点的内容 <div>hello</div> 设取得的div的对象为div 则div.firstChild就是一个文本节点 var a=div.firstChild; a有如下的方法 a.appendData("hhhhh") a.deleteData a.insertData a.substrin

JS添加节点方法与JQuery添加节点方法的比较及总结

原生JS添加节点方法与JQuery添加节点方法的比较及总结 一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div1</div> <div id="div2">div2 <span id="span1">span1</span> <span id="span2">span2</span> <

js 获取节点

var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode; //得到s的父节点 var ns=s.nextSbiling; //获得s的下一个兄弟节点 var ps=s.previousSbiling; //得到s的上一个兄弟节点 var fc=s.firstChild; //获得s的第一个子节点 var lc=s.lastChile; //获得s的最后一个子节点 js 获取节点

java DOM解析xml文件出现#text节点解决方案

java DOM解析xml文件出现#text节点解决方案 原生java解析xml的方法提供了两个,DocumentBuilder 和 SAXParser. 试了第一个DOM方法,在解析输出节点过程中,getNodeName()输出节点名发现多出了几个#text节点. text.xml <?xml version="1.0" encoding="UTF-8"?> <!-- xml解析测试文件 --> <LData> <ldat

javascript读取xm子节点,无刷新例子(javascript,xml,php)

下面这个javascript 函数是用来做无刷新判断用户名和密码是否正确 <script language= "javascript"> function login_sussess(){ var flag = false; var user,psw; user = form1.user.value; psw =form1.psw.value; coder = form1.coder.value; form1.submit2.disabled ="false&qu