jQuery dizeyi bul ve değiştir


86

Web sitesinde bir yerde belirli bir metin var, diyelim ki "lolipoplar" ve bu dizenin tüm oluşumlarını "şekerleme" ile değiştirmek istiyorum. Sorun şu ki, metnin tam olarak nerede olduğunu bilmiyorum. Şunun gibi bir şey yapabileceğimi biliyorum:

$(body).html($(body).html().replace('lollypops', 'marshmellows'));

Bu muhtemelen işe yarardı, ancak olabildiğince az HTML yazmam gerekiyor, bu yüzden şöyle bir şey düşünüyorum:

  1. dizeyi ara
  2. en yakın ana öğeyi bul
  3. sadece en yakın ana öğeyi yeniden yaz
  4. bunu özniteliklerde bile değiştirin, ancak hepsinde değil, örneğin yerine koyun class, ancak içinde değilsrc

Örneğin, böyle bir yapıya sahip olurdum

<body>
    <div>
        <div>
            <p>
               <h1>
                 <a>lollypops</a>
               </h1>
            </p>
            <span>lollypops</span>
        </div>
    </div>
    <p>
       <span class="lollypops">Hello, World!</span>
       <img src="/lollypops.jpg" alt="Cool image" />
    </p>
<body>

Bu örnekte, her "lolipop" oluşumu değiştirilecek, sadece <img src="...aynı kalacak ve gerçekten işlenecek olan tek eleman <a>ve her ikisi de olacak <span>.
Birileri bunun nasıl yapıldığını biliyor mu?


Metni değiştirmek için mükemmel iyi yazılmış bir eklenti var. jquery-replaceetext-eklentisi . Eklenti, tüm etiketlere ve niteliklere dokunulmadan bırakılan metni değiştirir. Ayrıca spotlight-jquery-
Hüseyin

Yanıtlar:


156

Bunun gibi bir şey yapabilirsiniz:

$("span, p").each(function() {
    var text = $(this).text();
    text = text.replace("lollypops", "marshmellows");
    $(this).text(text);
});

Tüm etiketleri uygun bir sınıf adıyla incelenmesi gereken metinle işaretlemek daha iyi olacaktır.

Ayrıca, bunun performans sorunları olabilir. jQuery veya javascript genel olarak bu tür işlemler için pek uygun değildir. Bunu sunucu tarafında yapsanız daha iyi olur.


Biliyorum, maalesef bunu sunucu tarafında yapamam. Ayrıca, dizenin tam olarak nerede olacağını bilmediğim için önerdiğiniz çözüm benim için uygun değil. İçinde olabilir <span>, içinde olabilir <h4>ve benzeri ...
cypher

O zaman $ ("*") deneyebilirsin, ama ben bunu tavsiye etmem.
kgiannakakis

14

Şu şekilde bir şeyler yapabilirsiniz:

$(document.body).find('*').each(function() {
    if($(this).hasClass('lollypops')){ //class replacing..many ways to do this :)
        $(this).removeClass('lollypops');
        $(this).addClass('marshmellows');
    }
    var tmp = $(this).children().remove(); //removing and saving children to a tmp obj
    var text = $(this).text(); //getting just current node text
    text = text.replace(/lollypops/g, "marshmellows"); //replacing every lollypops occurence with marshmellows
    $(this).text(text); //setting text
    $(this).append(tmp); //re-append 'foundlings'
});

örnek: http://jsfiddle.net/steweb/MhQZD/


7

Aşağıda, bazı metinleri renkli metinle değiştirmek için kullandığım kod var. Çok basit, metni aldı ve bir HTMLetiketle değiştirin . Bu sınıf etiketlerindeki her kelime için çalışır.

$('.hightlight').each(function(){
    //highlight_words('going', this);
    var high = 'going';
    high = high.replace(/\W/g, '');
    var str = high.split(" ");
    var text = $(this).text();
    text = text.replace(str, "<span style='color: blue'>"+str+"</span>");
    $(this).html(text);
});

2
var string ='my string'
var new_string = string.replace('string','new string');
alert(string);
alert(new_string);

1
'Değiştir' fonksiyonundaki dize değişkeninin etrafındaki tırnakların kaldırılması gerektiğini düşünüyorum.
Jason Glisson

0

Bunun gibi bir şey yapabilirsiniz:

HTML

<div class="element">
   <span>Hi, I am Murtaza</span>
</div>


jQuery

$(".element span").text(function(index, text) { 
    return text.replace('am', 'am not'); 
});

-3

Neden dize kabına bir sınıf eklemiyorsunuz ve ardından iç metni değiştirmiyorsunuz? Tıpkı bu örnekteki gibi.

HTML:

<div>
    <div>
        <p>
           <h1>
             <a class="swapText">lollipops</a>
           </h1>
        </p>
        <span class="swapText">lollipops</span>
    </div>
</div>
<p>
   <span class="lollipops">Hello, World!</span>
   <img src="/lollipops.jpg" alt="Cool image" />
</p>

jQuery:

$(document).ready(function() {
    $('.swapText').text("marshmallows");
});

2
Bu 4 yaşında ve zaten cevaplanmış bir soru, ama sorun şu ki senin önerdiğin şeyi yapamam.
cypher

Bu yanıt, OP'nin spesifikasyonunu tamamen göz ardı ediyor: "Bu dizenin tüm oluşumlarını değiştirmek istiyorum ... Sorun şu ki metnin tam olarak nerede olduğunu bilmiyorum."
Luke
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.