Ecco un semplice plugin per jQuery che dovrebbe fare il trucco. Selezionerà solo i nodi di testo in modo che se si ha un elemento con una classe apple
o id apple
non verrà sostituito. Inoltre, se si dispone di un collegamento <a href="#">apple</a>
non otterrà sostituito (potrebbe essere un po 'più del necessario, ma ho pensato di postare comunque):
(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);
Usage:
$("body").replacetext(/apple/gi, "<a href='http://www.$&.com'>$&</a>");
Esempio di lavoro: http://jsfiddle.net/andrewwhitaker/VmHjJ/
Si noti che questo potrebbe diventare inefficiente piuttosto rapidamente a causa dell'uso del selettore $("*")
. Se possibile, dovresti sostituirlo con qualcosa di più specifico (o rimuovere completamente la porzione .find("*").andSelf()
e passare al plugin un selettore più specifico).
fonte
2011-01-21 01:48:37
che andrà a sostituire il codice HTML di tutte le campate sulla pagina. Usa invece 'each' sugli span per evitare quello. – Reid
prima di tutto, come sarebbe 'each()' a risolvere il tuo problema ?. secondo, non è questo il punto qui e solo un esempio. Potrei anche dire '$ ('body');'. L'OP non ne ha parlato. :) – Reigel
Se si utilizza 'each' per scorrere tutte le span e sostituire singolarmente il codice HTML (anche se probabilmente si vorrebbe testare la presenza della parola chiave prima di farlo), allora non sostituirà tutte le span nella pagina con lo stesso contenuto ... – Reid