Ce que je veux faire, c'est utiliser jQuery pour trouver un morceau de texte dans un paragraphe et ajouter du CSS pour le mettre en gras. Je n'arrive pas à comprendre pourquoi cela ne fonctionne pas:
$(window).load(function() {
// ADD BOLD ELEMENTS
$('#about_theresidency:contains("cross genre")').css({'font-weight':'bold'});
});
Le texte de "about_theresidency" est tiré dynamiquement, ce qui me permet de l'exécuter après le chargement de la fenêtre.
Vous pouvez utiliser replace()
avec html()
:
var html = $('p').html();
$('p').html(html.replace(/world/gi, '<strong>$&</strong>'));
Edit:http://jsbin.com/AvUcElo/1/edit
Je l'ai transformé en un plugin, ici:
$.fn.wrapInTag = function(opts) {
var tag = opts.tag || 'strong'
, words = opts.words || []
, regex = RegExp(words.join('|'), 'gi') // case insensitive
, replacement = '<'+ tag +'>$&</'+ tag +'>';
return this.html(function() {
return $(this).text().replace(regex, replacement);
});
};
// Usage
$('p').wrapInTag({
tag: 'em',
words: ['world', 'red']
});
J'ai eu un problème similaire et j'ai essayé d'utiliser la solution proposée par elclanrs. Cela fonctionne très bien, mais seulement si le texte que vous souhaitez modifier ne contient aucun élément HTML. S'il y avait des balises dans le texte, elles auraient été perdues après l'exécution de la fonction wrapInTag
.
Voici ma solution au problème interne aux nœuds internes (j'ai inclus des liens vers les ressources avec lesquelles j'ai écrit le code).
// http://stackoverflow.com/a/9795091
$.fn.wrapInTag = function (opts) {
// http://stackoverflow.com/a/1646618
function getText(obj) {
return obj.textContent ? obj.textContent : obj.innerText;
}
var tag = opts.tag || 'strong',
words = opts.words || [],
regex = RegExp(words.join('|'), 'gi'),
replacement = '<' + tag + '>$&</' + tag + '>';
// http://stackoverflow.com/a/298758
$(this).contents().each(function () {
if (this.nodeType === 3) //Node.TEXT_NODE
{
// http://stackoverflow.com/a/7698745
$(this).replaceWith(getText(this).replace(regex, replacement));
}
else if (!opts.ignoreChildNodes) {
$(this).wrapInTag(opts);
}
});
};
Exemple: http://jsbin.com/hawog/1/edit
Essayer:
$(window).load(function() {
// ADD BOLD ELEMENTS
$('#about_theresidency:contains("cross genre")').each(function(){
$(this).html(
$(this).html().replace(/cross genre/g,'<strong>$&</strong>')
);
});
});
Besoin d'une méthode plus sécurisée, qui pourrait s'échapper. Voici une solution à la vanille
var str = 'The world is big <b onclick="alert(false)">world</b> red. the world is also small'
var words = ['world', 'is']
var reg = RegExp(words.join('|'), 'gi')
var p = document.createElement('p')
p.innerText = str
p.innerHTML = p.innerHTML.replace(reg, '<u>$&</u>')
document.body.appendChild(p)
console.log(p.outerHTML)