8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

替换正文中的单词

BJonas88 2月前

284 0

有没有办法替换 HTML 主体内的表格元素内的普通文本?比如将“hello”替换为“hi”?请仅使用 JavaScript,不要使用 jQuery。

有没有办法可以替换 HTML 主体内的表格元素内的普通文本?

比如将 \'hello\' 替换为 \'hi\'?

请仅使用 JavaScript ,不带 jQuery .

帖子版权声明 1、本帖标题:替换正文中的单词
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由BJonas88在本站《string》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 这不是一个新问题,我通过提供一个有效的例子来扩展 funky-future 的答案。不得不发布一个新答案,因为我缺乏对他的评论。

  • 如果您有新问题,请点击“提问”按钮提出。如果有助于提供背景信息,请添加此问题的链接。- 来自评论

  • funky-future 的答案 中添加一个示例, 因为我一直收到此错误:

    Uncaught TypeError: element.childNodes is not iterable
    

    像这样使用:

    replaceInText(document.body,"search term","replacement");
    

    jQuery 选择器对我来说不起作用。

  • 我是新手 Javascript ,刚刚开始学习这些技能。请检查下面的方法是否有助于替换文本。

    <script>
    
        var txt=document.getElementById("demo").innerHTML;
        var pos = txt.replace(/Hello/g, "hi")
        document.getElementById("demo").innerHTML = pos;
    
    </script>
    
  • 尝试将上述建议的解决方案应用于相当大的文档,替换可能存在于 innerHTML 甚至 innerText 中的相当短的字符串,您的 html 设计充其量会被破坏

    因此,我首先通过 HTML DOM 节点仅拾取文本节点元素,如下所示

    function textNodesUnder(node){
      var all = [];
      for (node=node.firstChild;node;node=node.nextSibling){
        if (node.nodeType==3) all.push(node);
        else all = all.concat(textNodesUnder(node));
      }
      return all;
    };
    
    var textNodes=textNodesUnder(document.body);
    textNodes.forEach((textNode) => {
        textNode.nodeValue = textNode.nodeValue.replace(/hello/g, 'hi');
    });
    

    `然后我循环对所有它们应用替换

  • 上述内容可以写成一行,即 document.body.innerHTML = document.body.innerHTML.replace(/hello/g, \'hi\'); 并且将以区分大小写的方式替换所有 \'hello\' 实例。

  • 使用默认的 javascript 字符串替换函数

    var curInnerHTML = document.body.innerHTML;
    curInnerHTML = curInnerHTML.replace("hello", "hi");
    document.body.innerHTML = curInnerHTML;
    
  • 虽然这是一个相对较旧的答案,但如果有人打算按原样使用它,就会出现几个问题;injectIntoString 没有定义,而且它不是 Javascript 的本机方法,因此这个 replaceInNodes 函数将不起作用。

  • 虽然使用 innerHTML.replace 会起作用并且速度相当快,但这会破坏 DOM 状态。

    在输入字段上进行设置然后在主体上进行更改来 "autofocus" 复制此操作 innerHTML ,它将失去焦点。

    一种破坏性较小的方法是:

    // retrives all childNodes of body
    var childNodes = document.body.childNodes;
    
    // start replacing
    replaceInNodes(childNodes, "search", "replace");
    
    function replaceInNodes(nodes,search,replace) {
        // iterate through all nodes
        for (var i = 0; i < nodes.length; i++) { 
            var curNode = nodes[i];
            // if the node has attributes, let us look at those
            // i.e. we want to change "John" in the input placeholder to "Peter" - <input type="text" value="John">
            if (curNode.attributes !== undefined) {
                var curNodeAttributes = curNode.attributes;
                for (var ii = 0; ii < curNodeAttributes.length; ii++) {
                    // replace attribute values
                    curNodeAttributes[ii].nodeValue = curNodeAttributes[ii].nodeValue.replace(search, replace);
                }   
            }
            // It is a "TEXT_NODE"
            // i.E. <span>John</span>
            if (curNode.nodeType === Node.TEXT_NODE) {
                curNode.data = this.injectIntoString(curNode.data);
            }
            // It is a "ELEMENT_NODE", meaning we need to go deeper
            if (curNode.nodeType === Node.ELEMENT_NODE) {
                this.replaceInNodes(curNode.childNodes);
            }
        }
    }
    

    更多信息可以在这里找到: https://zgheb.com/i?v=blog&pl=71#12.11.2020_-_Unobstrusively_replace_text_with_JavaScript

    注: 我是该链接的作者

  • 引用 11

    我试图替换一个非常大的字符串,但由于某种原因,正则表达式引发了一些错误/异常。

    所以我找到了这个正则表达式的替代方案,它的运行速度也相当快。至少对我来说足够快了:

    var search = "search string";
    var replacement = "replacement string";
    
    document.body.innerHTML = document.body.innerHTML.split(search).join(replacement)
    

    src: 如何替换 JavaScript 中所有出现的字符串?

  • 这是唯一能解决我的问题的解决方案。我需要使用 REGEX 在整个网站上查找和替换电话号码,而这里的其他答案会破坏我的 DOM 事件。

  • 我也遇到了同样的问题。我使用 innerHTML 上的 replace 编写了自己的函数,但它会搞砸锚链接等。

    为了使其正常工作,我使用了一个来完成此操作。

    该库具有出色的 API。包含脚本后,我这样调用它:

    findAndReplaceDOMText(document.body, {
      find: 'texttofind',
      replace: 'texttoreplace'
      }
    );
    
  • 这无法正常工作。考虑一下:

    你好 世界

    . hello does not get replaced.
  • 只需将标签名称添加到第一个输入参数,例如 replaceText('p,span', 'hello', 'hi')

  • 如何替换特定标签中的所有文本(例如

    )包含其他文本?

  • 下面的功能对我来说非常有效:

    // Note this *is* JQuery, see below for JS solution instead
    function replaceText(selector, text, newText, flags) {
      var matcher = new RegExp(text, flags);
      $(selector).each(function () {
        var $this = $(this);
        if (!$this.children().length)
           $this.text($this.text().replace(matcher, newText));
      });
    }
    

    以下是一个使用示例:

    function replaceAllText() {
      replaceText('*', 'hello', 'hi', 'g');
    }
    
    $(document).ready(replaceAllText);
    $('html').ajaxStop(replaceAllText);
    

    您也可以像这样直接替换:

    document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');
    

    但要小心,因为它也可能会影响标签、CSS 和脚本。

    编辑: 对于纯 JavaScript 解决方案,请改用此方法:

    function replaceText(selector, text, newText, flags) {
      var matcher = new RegExp(text, flags);
      var elems = document.querySelectorAll(selector), i;
    
      for (i = 0; i < elems.length; i++)
        if (!elems[i].childNodes.length)
          elems[i].innerHTML = elems[i].innerHTML.replace(matcher, newText);
    }
    
  • 引用 18

    有时更改 document.body.innerHTML 元素 text 内容的版本

    function replaceRecursively(element, from, to) {
        if (element.childNodes.length) {
            element.childNodes.forEach(child => replaceRecursively(child, from, to));
        } else {
            const cont = element.textContent;
            if (cont) element.textContent = cont.replace(from, to);
        }
    };
    
    replaceRecursively(document.body, new RegExp("hello", "g"), "hi");
    
  • 太棒了!node.textContent.replace() 是进行简单搜索还是基于正则表达式的搜索,以及(如何)将其用于跨越多行的模式?我的目标是从表单(phpbb 论坛回复编辑器)中删除 2 个按钮。

  • @B.Mr.W. 我不记得为什么我要把这些情况说得这么清楚。对于这个问题,这些类型就足够了。请注意,有些类型是 xml 特定的。

返回
作者最近主题: