แทนที่คำในเนื้อหา


94

มีวิธีแทนที่ข้อความปกติภายในองค์ประกอบตารางที่อยู่ในเนื้อหาของ HTML หรือไม่

ชอบแทนที่ "สวัสดี" ด้วย "สวัสดี"?

โปรดใช้JavaScript ที่ไม่มีjQueryเท่านั้น


คุณช่วยระบุให้ชัดเจนกว่านี้ได้ไหม คุณต้องการแทนที่อะไรมันอยู่ที่ไหนในร่างกาย ฯลฯ
Zirak

ร่างกายมี div และอยู่ภายในตารางนั้นฉันต้องการแทนที่ข้อความปกติที่ไม่ใช่โค้ดเช่นแทนที่ ("hello") ด้วย ("hi")
แล้วแต่

3
วิธีแก้ปัญหาส่วนใหญ่ด้านล่างจะทำลายเหตุการณ์ทั้งหมดและโครงสร้าง Dom ทั้งหมดหากคำที่ถูกแทนที่เกิดขึ้นเป็นชื่อคลาสชื่อแท็กหรือสิ่งใด ๆ ใน html
Muhammad Umer

ดูเหมือนทั้งคำถามและคำตอบจะผิด มันถามว่าจะแทนที่คำอย่างไรและไม่ใช่ตัวอักษร เช่นเปลี่ยนจากนี้ควรจะเป็นhello, this is a text randomTexthello hi, this is a text randomTexthelloอย่างไรก็ตามคำตอบอื่น ๆ ทั้งหมดที่นี่จะแทนที่ตัวอักษรแทนคำ
Orhun Alp Oral

คำตอบ:


140

ในการแทนที่สตริงใน HTML ของคุณด้วยสตริงอื่นให้ใช้วิธีการแทนที่ในinnerHTML :

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

โปรดทราบว่าสิ่งนี้จะแทนที่อินสแตนซ์แรกของhelloทั้งร่างกายรวมถึงอินสแตนซ์ใด ๆ ในโค้ด HTML ของคุณ (เช่นชื่อคลาส ฯลฯ .. ) ดังนั้นโปรดใช้ด้วยความระมัดระวัง - เพื่อผลลัพธ์ที่ดีกว่าให้ลอง จำกัด ขอบเขตการแทนที่ของคุณโดยกำหนดเป้าหมายโค้ดของคุณโดยใช้document.getElementByIdหรือที่คล้ายกัน

ในการแทนที่อินสแตนซ์ทั้งหมดของสตริงเป้าหมายให้ใช้นิพจน์ทั่วไปธรรมดากับgแฟล็ก lobal:

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

1
ไม่ได้ผลสำหรับฉันนี่คือสิ่งที่ฉันใช้ <script type="text/javascript"> window.onload = clear(); function clear() { document.body.innerHTML = document.body.replace('ü', 'n'); } </script>
แล้วแต่

อาจมีความซับซ้อนมากขึ้นด้วยอักขระขยาย - เอกสารของคุณอยู่ในการเข้ารหัสอะไร คุณแน่ใจหรือไม่ว่าอักขระนั้นเป็นüไม่ใช่ & # 252; ตัวอย่างเช่น..?
Dexter

2
คุณไม่ได้คัดลอกรหัสของฉันอย่างถูกต้อง ;-) ตรวจสอบให้แน่ใจว่าคุณมี innerHTML ทั้งสองด้านของคำสั่งเช่น document.body.innerHTML = document.body.innerHTML.replace ('ü', 'n');
Dexter

3
FYI - ข้อบกพร่องในความคิดเห็นแรกคือ: ตั้งค่าwindow.onload = clear;โดยไม่มีวงเล็บ "()" เมื่อคุณเขียนclear()แล้วคุณเรียกใช้ฟังก์ชันจริง แต่คุณต้องการกำหนดฟังก์ชันให้กับตัวจัดการ onload เท่านั้น
ฟิลิปป์

1
โปรดทราบว่าการใช้ innerHTML โดยทั่วไปถือว่าไม่ดีในทุกวันนี้: slideshare.net/x00mario/the-innerhtml-apocalypse
kufudo

13

ฟังก์ชันด้านล่างทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน:

// 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);
}

เราจะเปลี่ยนข้อความทั้งหมดในแท็กเฉพาะ (เช่น <p> หรือ <span>) ด้วยข้อความอื่นได้อย่างไร
GJZ

เพียงแค่เพิ่มชื่อแท็กในพารามิเตอร์อินพุตแรกเช่น replaceText ('p, span', 'hello', 'hi')
Ziad

สิ่งนี้ทำงานไม่ถูกต้อง พิจารณาสิ่งนี้: <p> สวัสดี <strong> โลก </strong> </p> สวัสดีไม่ได้ถูกแทนที่
David Vielhuber

สวัสดีฉันเป็นมือใหม่ในการเขียนโค้ด ฉันสามารถทำได้ดีกับ AppleScript แต่นั่นคือทั้งหมดที่ฉันรู้ คุณช่วยให้คำแนะนำฉันได้ไหมจะเริ่มต้นด้วยอะไรจุดประสงค์ของฉันคือการใช้จาวาสคริปต์เพื่อรวบรวมฐานข้อมูลรูปภาพวิดีโอการกรอกแบบฟอร์มบนเว็บการอัปโหลดโดยอัตโนมัติอาจเป็นการทำงานกับ excel Applescript ก็ใช้ได้ แต่ java ดูเหมือนจะเป็นระดับใหม่และดีกว่ามาก ฉันควรเริ่มจากอะไรเพื่อให้บรรลุวัตถุประสงค์ ฉันรู้ 0 เกี่ยวกับจาวาสคริปต์และฉันไม่รู้ด้วยซ้ำว่าจะทำให้สคริปต์ของคุณทำงานได้อย่างไร! ฉันควรวางไว้ที่ใด ขอบคุณมาก!
Duy Duy

12

ฉันลงเอยด้วยฟังก์ชันนี้เพื่อแทนที่ข้อความอย่างปลอดภัยโดยไม่มีผลข้างเคียง (จนถึงตอนนี้):

function replaceInText(element, pattern, replacement) {
    for (let node of element.childNodes) {
        switch (node.nodeType) {
            case Node.ELEMENT_NODE:
                replaceInText(node, pattern, replacement);
                break;
            case Node.TEXT_NODE:
                node.textContent = node.textContent.replace(pattern, replacement);
                break;
            case Node.DOCUMENT_NODE:
                replaceInText(node, pattern, replacement);
        }
    }
}

สำหรับกรณีที่ 16kB ของfindAndReplaceDOMTextหนักเกินไปเล็กน้อย


สวัสดีฉันเป็นมือใหม่ในการเขียนโค้ด ฉันสามารถทำได้ดีกับ AppleScript แต่นั่นคือทั้งหมดที่ฉันรู้ คุณช่วยให้คำแนะนำฉันได้ไหมจะเริ่มต้นด้วยอะไรจุดประสงค์ของฉันคือการใช้จาวาสคริปต์เพื่อรวบรวมฐานข้อมูลรูปภาพวิดีโอการกรอกแบบฟอร์มบนเว็บการอัปโหลดโดยอัตโนมัติอาจเป็นการทำงานกับ excel Applescript ก็ใช้ได้ แต่ java ดูเหมือนจะเป็นระดับใหม่และดีกว่ามาก ฉันควรเริ่มจากอะไรเพื่อให้บรรลุวัตถุประสงค์ ฉันรู้ 0 เกี่ยวกับจาวาสคริปต์และฉันไม่รู้ด้วยซ้ำว่าจะทำให้สคริปต์ของคุณทำงานได้อย่างไร! ฉันควรวางไว้ที่ใด ขอบคุณมาก!
Duy Duy

Duy Duy นั่นเป็นปัญหามากมาย ระบุรายละเอียดงานเพียงอย่างเดียวเป็นเหตุผลเพียงพอที่จะลาออกจากงาน
funky-future

9

ผมมีปัญหาเหมือนกัน. ฉันเขียนฟังก์ชั่นของตัวเองโดยใช้การแทนที่ innerHTML แต่มันจะทำให้จุดยึดเชื่อมโยงและอื่น ๆ

เพื่อให้ทำงานได้อย่างถูกต้องฉันใช้ห้องสมุดเพื่อทำสิ่งนี้ให้เสร็จ

ห้องสมุดมี API ที่ยอดเยี่ยม หลังจากรวมสคริปต์แล้วฉันเรียกมันว่า:

findAndReplaceDOMText(document.body, {
  find: 'texttofind',
  replace: 'texttoreplace'
  }
);

นี่เป็นทางออกเดียวที่ใช้ได้กับปัญหาของฉัน ฉันจำเป็นต้องใช้ REGEX เพื่อค้นหาและแทนที่หมายเลขโทรศัพท์ทั่วทั้งไซต์และคำตอบอื่น ๆ ที่นี่อาจทำให้เหตุการณ์ DOM ของฉันเสียหาย
DavyH

3

ฉันพยายามแทนที่สตริงที่มีขนาดใหญ่มากและด้วยเหตุผลบางประการนิพจน์ทั่วไปทำให้เกิดข้อผิดพลาด / ข้อยกเว้น

ฉันจึงพบทางเลือกนี้แทนนิพจน์ทั่วไปซึ่งทำงานได้ค่อนข้างเร็ว อย่างน้อยมันก็เร็วพอสำหรับฉัน:

var search = "search string";
var replacement = "replacement string";

document.body.innerHTML = document.body.innerHTML.split(search).join(replacement)

src: จะแทนที่สตริงทั้งหมดใน JavaScript ได้อย่างไร



1

ลองใช้วิธีแก้ปัญหาที่แนะนำข้างต้นกับเอกสารขนาดใหญ่โดยแทนที่สตริงสั้น ๆ ที่อาจมีอยู่ใน 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;
}

textNodes=textNodesUnder(document.body)
for (i in textNodes) { textNodes[i].nodeValue = textNodes[i].nodeValue.replace(/hello/g, 'hi');    

`และต่อไปนี้ฉันใช้การแทนที่ทั้งหมดในวงจร


1

ต้องการเพิ่มตัวอย่างให้กับคำตอบของอนาคตที่ขี้ขลาดเนื่องจากฉันได้รับข้อผิดพลาดนี้:

Uncaught TypeError: element.childNodes is not iterable

ใช้แบบนี้:

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

มันไม่ได้ผลสำหรับฉันกับตัวเลือก jQuery


1
หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม ใส่ลิงก์ไปยังคำถามนี้หากช่วยให้บริบท - จากรีวิว
SilverNak

1
นี่ไม่ใช่คำถามใหม่ฉันกำลังขยายคำตอบของอนาคตที่ขี้ขลาดโดยให้ตัวอย่างที่ใช้งานได้ ต้องโพสต์คำตอบใหม่ bc ฉันไม่มีตัวแทนที่จะแสดงความคิดเห็นเกี่ยวกับเขา
Y Stroli

1

บางครั้งการเปลี่ยนdocument.body.innerHTMLสคริปต์ JS บางส่วนในหน้าเว็บ นี่คือเวอร์ชันที่เปลี่ยนแปลงเฉพาะเนื้อหาของtextองค์ประกอบ:

function replace(element, from, to) {
    if (element.childNodes.length) {
        element.childNodes.forEach(child => replace(child, from, to));
    } else {
        const cont = element.textContent;
        if (cont) element.textContent = cont.replace(from, to);
    }
};

replace(document.body, new RegExp("hello", "g"), "hi");

1

แม้ว่าการใช้ innerHTML.replace จะใช้งานได้และค่อนข้างเร็ว แต่จะทำให้สถานะ DOM เสียหาย คุณสามารถจำลองสิ่งนี้ได้โดยการตั้งค่า "โฟกัสอัตโนมัติ" บนช่องป้อนข้อมูลจากนั้นเปลี่ยน 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 == 3){
                curNode.data = this.injectIntoString(curNode.data);
            }
            // It is a "ELEMENT_NODE", meaning we need to go deeper
            if(curNode.nodeType == 1){
                this.replaceInNodes(curNode.childNodes);
            }
        }
}

สามารถดูข้อมูลเพิ่มเติมได้ที่นี่: https://zgheb.com/i?v=blog&pl=71#12.11.2020_-_Unobstrusively_replace_text_with_JavaScript หมายเหตุ: ฉันเป็นผู้เขียนลิงก์ดังกล่าว


0

ฉันยังใหม่Javascriptและเพิ่งเริ่มเรียนรู้ทักษะเหล่านี้ โปรดตรวจสอบว่าวิธีการด้านล่างนี้มีประโยชน์ในการแทนที่ข้อความหรือไม่

<script>

    var txt=document.getElementById("demo").innerHTML;
    var pos = txt.replace(/Hello/g, "hi")
    document.getElementById("demo").innerHTML = pos;

</script>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.