Gövde metnindeki kelimeleri değiştirin


94

HTML gövdesine yerleştirilen bir tablo öğesi içindeki normal metni değiştirmenin bir yolu var mı?

"Merhaba" yı "merhaba" ile değiştirmek gibi mi?

Lütfen jQuery olmadan yalnızca JavaScript kullanın .


Lütfen daha açık konuşur musunuz? Neyi değiştirmek istiyorsun, vücudun
neresinde

gövdenin bir div'i ve içinde bir tablo varsa, o zaman ("merhaba") yerine ("merhaba") gibi bir kod yerine normal bir metni değiştirmek istiyorum
Wahtever

3
Aşağıdaki çözümlerin çoğu, değiştirilen kelime sınıf adı, etiket adı veya
html'de

Görünüşe göre hem soru hem de cevaplar yanlış. Karakterlerin değil kelimelerin nasıl değiştirileceğini sorar. Bunun değiştirilmesi gibi hello, this is a text randomTexthelloolması gerekir hi, this is a text randomTexthello. Bununla birlikte, buradaki diğer tüm cevaplar sözcükler yerine karakterleri değiştirir.
Orhun Alp Oral

Yanıtlar:


139

HTML'nizdeki bir dizeyi başka bir dizeyle değiştirmek için , innerHTML'de değiştirme yöntemini kullanın :

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

Bunun hello, HTML kodunuzdaki tüm örnekler de dahil olmak üzere gövde genelinde ilk örneğinin yerini alacağını unutmayın (örneğin, sınıf adları vb.), Bu nedenle dikkatli kullanın - daha iyi sonuçlar için, kodunuzu kullanarak kodunuzu hedefleyerek değiştirme işleminizin kapsamını kısıtlamayı deneyin. document.getElementById veya benzeri.

Hedef dizenin tüm örneklerini değiştirmek için, global bayrağıyla basit bir normal ifade kullanın :

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

1
benim için işe yaramadı burada kullandım <script type="text/javascript"> window.onload = clear(); function clear() { document.body.innerHTML = document.body.replace('ü', 'n'); } </script>
Wahtever

Genişletilmiş karakterlerle daha karmaşık olabilir - belgeniz hangi kodlamada? Karakterin ü olduğundan ve & # 252; olmadığından emin misiniz? Örneğin..?
Dexter

2
kodumu doğru bir şekilde kopyalamadınız ;-) ifadenin her iki tarafında da innerHTML bulunduğundan emin olun, yani: document.body.innerHTML = document.body.innerHTML.replace ('ü', 'n');
Dexter

3
Bilginize - İlk açıklamadaki hata: window.onload = clear;parantez "()" olmadan ayarlayın . Eğer yazarken clear()o zaman aslında işlevini yürütmek, ancak yalnızca onLoad-işleyici işlevi atamak istediğiniz
Philipp


13

Aşağıdaki işlev benim için mükemmel çalışıyor:

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

İşte bir kullanım örneği:

function replaceAllText() {
  replaceText('*', 'hello', 'hi', 'g');
}

$(document).ready(replaceAllText);
$('html').ajaxStop(replaceAllText);

Bunun gibi doğrudan bir değiştirme de kullanabilirsiniz:

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

Ancak etiketleri, css'leri ve komut dosyalarını da etkileyebileceğinden dikkatli olun.

DÜZENLEME: Saf bir JavaScript çözümüne gelince, bunun yerine şu yöntemi kullanın:

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

Belirli bir etiketteki tüm metni (<p> veya <span> gibi) başka bir metinle değiştirmek nasıl olur?
GJZ

Etiket adlarını ilk girdi parametresine eklemeniz yeterlidir, örneğin replaceText ('p, span', 'merhaba', 'hi')
Ziad

Bu doğru çalışmıyor. Şunu düşünün: <p> merhaba <strong>dünya</ </strong> </p>. merhaba değiştirilmez.
David Vielhuber

Merhaba, kodlamada acemiyim. AppleScript ile biraz iyilik yapabilirim. Ama tüm bildiğim bu. Lütfen bana bazı önerilerde bulunabilir misiniz, ne ile başlayayım, amacım javascript kullanarak veri tabanlarını, resimleri, videoları toplamayı otomatikleştirmek, web formlarını doldurmak, yüklemek, excel ile çalışmak olabilir. Applescript buna uygun, ancak java tamamen yeni bir seviye ve çok daha iyi görünüyor. Amaçlarıma ulaşmak için ne ile başlamalıyım? JavaScript hakkında 0 biliyorum ve yukarıdaki betiğinizi nasıl çalıştıracağımı bile bilmiyorum! Nereye yapıştırmalıyım? Size çok teşekkür ederim!
Duy Duy

12

Metni yan etkiler olmadan güvenli bir şekilde değiştirmek için bu işlevi kullandım (şimdiye kadar):

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'nin findAndReplaceDOMTextbiraz fazla ağır olduğu durumlar içindir .


Merhaba kodlamada acemiyim. AppleScript ile biraz iyilik yapabilirim. Ama tüm bildiğim bu. Lütfen bana tavsiyelerde bulunur musunuz, ne ile başlayayım, amacım javascript kullanarak veri tabanlarını, resimleri, videoları toplamayı otomatikleştirmek, web formlarını doldurmak, yüklemek, excel ile çalışmak olabilir. Applescript buna uygun, ancak java tamamen yeni bir seviye ve çok daha iyi görünüyor. Amaçlarıma ulaşmak için neyle başlamalıyım? JavaScript hakkında 0 biliyorum ve yukarıdaki betiğinizi nasıl çalıştıracağımı bile bilmiyorum! Nereye yapıştırmalıyım? Size çok teşekkür ederim!
Duy Duy

Duy Duy, bu çok fazla sorun. Tek başına görev tanımı verildiğinde, işi bırakmak için yeterli bir nedendir.
funky-gelecek

9

Ben de aynı sorunu yaşadım. InternalHTML'de replace kullanarak kendi işlevimi yazdım, ancak bağlantı bağlantılarını falan bozardı.

Doğru çalışmasını sağlamak için bunu yapmak için bir kütüphane kullandım .

Kitaplığın harika bir API'si var. Senaryoyu ekledikten sonra şöyle adlandırdım:

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

Sorunum için işe yarayan tek çözüm buydu. Bir sitenin tamamında telefon numaralarını bulmak ve değiştirmek için REGEX'i kullanmam gerekiyordu ve buradaki diğer yanıtlar DOM etkinliklerimi bozuyordu.
DavyH

3

Gerçekten büyük bir dizgeyi değiştirmeye çalışıyordum ve nedense normal ifadeler bazı hatalar / istisnalar atıyordu.

Bu yüzden, oldukça hızlı çalışan normal ifadelere bir alternatif buldum. En azından benim için yeterince hızlıydı:

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

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

src: JavaScript'teki bir dizenin tüm tekrarlarını nasıl değiştirebilirim?


2

Varsayılan javascript dizesi değiştirme işlevini kullanın

var curInnerHTML = document.body.innerHTML;
curInnerHTML = curInnerHTML.replace("hello", "hi");
document.body.innerHTML = curInnerHTML;

1

Yukarıdaki önerilen çözümü çok büyük bir belgeye uygulamaya çalışın, innerHTML veya hatta innerText'te bulunabilecek oldukça kısa dizeleri değiştirin; html tasarımınız en iyi ihtimalle bozulur.

Bu nedenle, öncelikle bunun gibi HTML DOM düğümleri aracılığıyla yalnızca metin düğümü öğelerini alıyorum

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');    

Followingve daha sonra, dönüşümde hepsine değiştirmeyi uyguladım


1

Bu hatayı almaya devam ederken funky-Future'ın cevabına bir örnek eklemek istedim:

Uncaught TypeError: element.childNodes is not iterable

bunun gibi kullanın:

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

jQuery seçicilerle benim için çalışmadı.


1
Yeni bir sorunuz varsa, lütfen Soru Sor butonuna tıklayarak sorunuz . Bağlam sağlamaya yardımcı oluyorsa bu soruya bir bağlantı ekleyin. - Yorumdan
SilverNak

1
Bu yeni bir soru değil, işe yarayan bir örnek vererek funky-Future'ın cevabını genişletiyordum. yeni bir cevap göndermek zorunda kaldı bc Onun hakkında yorum yapacak temsilcim yok.
Y Stroli

1

Bazen değiştirmek document.body.innerHTML, sayfadaki bazı JS komut dosyalarını bozar. İşte yalnızca textöğelerin içeriğini değiştiren sürüm :

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

İnnerHTML.replace kullanılması işe yarayacak ve oldukça hızlı olsa da, bu DOM durumunu bozacaktır. Bunu, bir giriş alanında "otomatik odaklama" ayarlayarak ve ardından gövde üzerindeki internalHTML'yi değiştirerek çoğaltabilirsiniz, odağı kaybedecektir.

Daha az yıkıcı bir yaklaşım:

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

Daha fazla bilgiyi burada bulabilirsiniz: https://zgheb.com/i?v=blog&pl=71#12.11.2020_-_Unobstrusively_replace_text_with_JavaScript Not: Ben söz konusu bağlantının yazarıyım


0

Ben yeniyim Javascriptve bu becerileri öğrenmeye yeni başladım. Lütfen aşağıdaki yöntemin metni değiştirmek için yararlı olup olmadığını kontrol edin.

<script>

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

</script>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.