Comment remplacer du texte à l’aide de jQuery (ou JS simple) sans rompre aucun événement?

Je me bats depuis un certain temps avec la question suivante (qui a l’air si simple). Je veux changer les mots entre accolades doubles sans rompre aucun événement.

La difficulté réside dans le fait que je ne sais pas quels événements sont programmés. Ainsi, la background-color sur l’ span n’est qu’un exemple, mais pourrait être n’importe quoi.

C’est mon html:

 
foo bar {{ baz }}

C’est mon JS:

 $("span"). css('background-color', 'red'). click(function(){ alert('Clicked bar!'); }); $( ".test" ). contents(). each(function(){ if( $(this).text().indexOf('{{') !== -1 ) { $(this). text(). replace(/{{\s?([^}]*)\s?}}/, "HOW DO I CHANGE {{ baz }} FOR SOMETHING ELSE WITHOUT BREAKING THE EVENT? THIS DOESN'T WORK"); } }); 

Faire quelque chose comme l’exemple ci-dessous ne fonctionnerait pas car cela briserait l’action.

 $('.test'). html( $('.test'). html(). replace(/{{\s?([^}]*)\s?}}/, 'baq') ); 

Pour conserver les éléments, vous souhaitez remplacer uniquement le texte à l’intérieur des éléments. Vous pouvez créer une fonction qui parcourt les nœuds de l’élément, remplace le texte des nœuds de texte et s’appelle avec tous les éléments. De cette façon, vous pouvez remplacer le texte autour des éléments que vous souhaitez conserver, et même du texte à l’intérieur de ces éléments:

 $("span"). css('background-color', 'red'). click(function(){ alert('Clicked bar!'); }); function replace(el) { var c = el.childNodes; for (var i = 0; i < c.length; i++) { if (c[i].nodeType == 3) { c[i].textContent = c[i].textContent.replace(/{{\s?([^}]*)\s?}}/, "Something else"); } else { replace(c[i]); } } } replace($('.test')[0]); 
  
foo {{ baz }} bar bar {{ baz }} foo foo {{ baz }} foo

Ce que vous pouvez faire c’est:

 
foo bar {{ baz }}

jQuery

 $("span").css('background-color', 'red') $(".test") .on("click", "span", function(){ alert('Clicked bar!'); }); $('.test') .html( $('.test') .html() .replace(/{{\s?([^}]*)\s?}}/, 'baq') ); 

Cependant, vous feriez mieux de faire un remplacement plus ciblé avec un élément spécifique pour baz, span.baz ?