2011-01-21 15 views

Odpowiedz

7

bardzo prosty przykład ...

jQuery

var span = $('span'); 
    span.html(function(i,html){ 
     replaceTextWithHTMLLinks(html); 
    }); // jQuery version 1.4.x 


function replaceTextWithHTMLLinks(text) { 
    var exp = /(apple)/ig; 
    return text.replace(exp,"<a class='link' href='http://www.$1.com' target='_blank' >$1</a>"); 
} 

html

<span> 
An apple a day, makes 7 apples a week! 
</span> 

demo

+1

To zastąpi kod HTML wszystkich zakresów na stronie. Zamiast tego należy użyć 'each' na przęsłach. – Reid

+0

po pierwsze, w jaki sposób 'each()' rozwiązać problem ?. po drugie, nie o to tutaj chodzi i po prostu przykład. Mogę nawet powiedzieć '$ ('body');'. PO nie wspomniał o żadnym z nich. :) – Reigel

+2

Jeśli użyjesz 'each' do iteracji wszystkich rozpiętości i zamienisz ich kod HTML indywidualnie (chociaż prawdopodobnie będziesz chciał przetestować obecność słowa kluczowego przed zrobieniem tego), to nie zastąpi on wszystkich zakresów na stronie z tą samą zawartością ... – Reid

5

Oto prosty jQuery plugin, który powinien załatwić sprawę. Będzie on wybierał tylko węzły tekstowe, więc jeśli masz element z klasą apple lub identyfikator apple, nie zostanie on wymieniony. Dodatkowo, jeśli masz link <a href="#">apple</a> to nie zostanie zastąpiony (może być trochę więcej niż trzeba, ale pomyślałem, że go pisać w każdym razie):

(function($) { 
    $.fn.replacetext = function(target, replacement) { 
     // Get all text nodes: 
     var $textNodes = this 
       .find("*") 
       .andSelf() 
       .contents() 
       .filter(function() { 
        return this.nodeType === 3 && 
         !$(this).parent("a").length; 
       }); 

     // Iterate through the text nodes, replacing the content 
     // with the link: 
     $textNodes.each(function(index, element) { 
      var contents = $(element).text(); 
      contents = contents.replace(target, replacement); 
      $(element).replaceWith(contents); 
     }); 
    }; 
})(jQuery); 

Zastosowanie:

$("body").replacetext(/apple/gi, "<a href='http://www.$&.com'>$&</a>"); 

Przykład roboczy: http://jsfiddle.net/andrewwhitaker/VmHjJ/

Należy zauważyć, że może to szybko stać się nieefektywne ze względu na użycie selektora $("*"). Jeśli to możliwe, powinieneś zamienić go na coś bardziej konkretnego (lub całkowicie usunąć część .find("*").andSelf() i przekazać wtyczce bardziej konkretny selektor).

+0

Nie, to wygląda idealnie! Wypróbuję to za chwilę. –

+0

@ Black Magic Tropical: Czy to działa dla ciebie? –

+0

Działa tutaj bardzo ładnie, z wyjątkiem selektorów, które zawierają pewne elementy iframe: _permission denied, aby uzyskać dostęp do właściwości "document" _. – Anse