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).
To zastąpi kod HTML wszystkich zakresów na stronie. Zamiast tego należy użyć 'each' na przęsłach. – Reid
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
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