jQuery tìm và thay thế chuỗi


86

Tôi có ở đâu đó trên trang web một đoạn văn bản cụ thể, giả sử "lollypops" và tôi muốn thay thế tất cả các lần xuất hiện của chuỗi này bằng "marshmellows". Vấn đề là tôi không biết chính xác văn bản ở đâu. Tôi biết tôi có thể làm điều gì đó như:

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

Điều này có thể sẽ hiệu quả, nhưng tôi cần viết lại ít HTML nhất có thể, vì vậy tôi đang nghĩ một điều gì đó như:

  1. tìm kiếm chuỗi
  2. tìm phần tử mẹ gần nhất
  3. chỉ viết lại phần tử cha gần nhất
  4. thay thế điều này ngay cả trong các thuộc tính, nhưng không phải tất cả, chẳng hạn như thay thế nó trong class, nhưng không thay thế trongsrc

Ví dụ, tôi sẽ có cấu trúc như thế này

<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>

Trong ví dụ này, mọi sự xuất hiện của "vòng lặp" sẽ được thay thế, chỉ <img src="...giữ nguyên và các phần tử duy nhất thực sự được thao tác sẽ là <a>và cả hai <span>.
Có ai biết làm thế nào để làm điều này?


Có một plugin được viết tốt để thay thế văn bản. jquery-Replacetext-plugin . Trình cắm thay thế văn bản để lại tất cả các thẻ và thuộc tính không bị ảnh hưởng. Bạn cũng có thể tìm thấy một hướng dẫn tốt đẹp cho plug-in này tại ánh đèn sân khấu-jquery-replacetext
Hussein

Câu trả lời:


153

Bạn có thể làm điều gì đó như sau:

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

Sẽ tốt hơn nếu đánh dấu tất cả các thẻ bằng văn bản cần được kiểm tra bằng một tên lớp phù hợp.

Ngoài ra, điều này có thể có vấn đề về hiệu suất. jQuery hoặc javascript nói chung không thực sự thích hợp cho loại hoạt động này. Tốt hơn là bạn nên làm điều đó ở phía máy chủ.


Tôi biết, rất tiếc là tôi không thể thực hiện việc này ở phía máy chủ. Ngoài ra, giải pháp bạn đề xuất không phù hợp với tôi, vì tôi không biết chính xác chuỗi sẽ ở đâu. Nó có thể ở trong <span>, nó có thể ở trong <h4>và như vậy ...
cypher

Sau đó, bạn có thể thử $ ("*"), nhưng tôi không khuyên bạn nên dùng nó.
kgiannakakis

14

Bạn có thể làm điều gì đó theo cách này:

$(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'
});

ví dụ: http://jsfiddle.net/steweb/MhQZD/


7

Dưới đây là đoạn mã tôi đã sử dụng để thay thế một số văn bản, bằng văn bản màu. Nó đơn giản, lấy văn bản và thay thế nó trong một HTMLthẻ. Nó hoạt động cho từng từ trong thẻ lớp đó.

$('.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
Tôi nghĩ rằng các dấu ngoặc kép xung quanh biến chuỗi trong hàm 'thay thế' cần được loại bỏ.
Jason Glisson

0

Bạn có thể làm điều gì đó như sau:

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

Tại sao bạn không thêm một lớp vào vùng chứa chuỗi và sau đó thay thế văn bản bên trong? Giống như trong ví dụ này.

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
Đây là một câu hỏi 4 tuổi và đã được trả lời, nhưng vấn đề là tôi không thể làm những gì bạn đang đề nghị.
cypher

Câu trả lời này hoàn toàn bỏ qua thông số kỹ thuật của OP: "Tôi muốn thay thế tất cả các lần xuất hiện của chuỗi này ... Vấn đề là tôi không biết chính xác văn bản ở đâu."
Luke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.