2014-09-19 10 views
10

Ho un articolo con molte istanze della parola "colore". Ho impostato un pulsante con la classe .colour in modo che, se lo desideri, puoi fare clic su di esso e cambiare l'ortografia da "colore" a "colore" in tutta la pagina. Ho scritto alcuni jQuery per farlo, ma cambia solo un'istanza della parola colore ma non tutti. Dovresti continuare a cliccare ripetutamente sul pulsante per cambiarli tutti.Trova e sostituisci tutte le istanze di una parola con jquery

$(document).ready(function(){ 
    $(".colour").click(function(){ 
     $("body").children().each(function() {   
      $(this).html($(this).html().replace("color","colour")); 
     }); 
    }) 
}) 

C'è un modo per ripetere ripetutamente lo script finché non cambia tutte le istanze? Inoltre è possibile farlo in modo che non sia sensibile al maiuscolo/minuscolo? Sono nuovo di javascript e jquery quindi potrebbe essere una domanda noob. Grazie

Ecco un codepen di esso: http://codepen.io/patrickaltair/pen/vcdmy

risposta

16

avere il vostro sostituire l'uso di un'espressione regolare con una sostituzione globale.

Cambio:

$(this).html().replace("color","colour") 

a:

$(this).html().replace(/color/g,"colour"); 

codepen example

+0

Considerare l'utilizzo di http://blog.stackoverflow.com/2014/09/introducing-runnable-javascript-css-and-html-code-snippets/?cb=1 –

+0

@JuanMendes - Sì, lo so. Un'abitudine difficile da risolvere però) – j08691

+0

Un problema con questo è se si dispone di un attributo in linea usando 'color' Vedi [risposta di Arun] (http://stackoverflow.com/a/25938737/227299) –

0

trovare tutte e sostituire

$(this).html().split('color').join("colour"); 
+1

È carino, ma rende il codice difficile da leggere perché non è quello per cui normalmente utilizzi la divisione. È anche più lento della risposta esistente –

+0

Non trovo altra soluzione – AvrilAlejandro

+1

È una cattiva pratica dell'utilizzo dello split. Non un buon suggerimento, direi – andrex

7

Io per primo non sono un grande fan di utilizzare .html() in questi casi, in modo

$(document).ready(function(){ 
 
    $(".colour").click(function(){ 
 
    $("body *").contents().each(function() { 
 
     if(this.nodeType==3){ 
 
     this.nodeValue = this.nodeValue.replace(/color/g, 'colour') 
 
     } 
 
    }); 
 
    }) 
 
})
h2.colour, h2.color{ 
 
    font-size:16px; 
 
    max-width: 200px; 
 
    margin: 1em auto; 
 
    text-align: center; 
 
    padding:0.4em; 
 
    color: #999; 
 
    background-color: #ccc; 
 
    @include border-top-radius(5px); 
 
    @include border-bottom-radius(5px); 
 
    @include transition (all 0.3s ease-in-out); 
 
} 
 

 
h2.colour:hover, h2.color:hover{ 
 
    color: #000; 
 
    background-color: #aaa; 
 
} 
 

 

 

 
p{ 
 
    max-width: 400px; 
 
    margin: 1em auto; 
 
    margin-top: 5em; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<p class="text"> 
 
    Seasonal Colors: Some colors are more appropriate at certain times of year than others. Pastels are usually associated with spring/summer, while autumn colors are rust, <span style="color:brown">brown</span>, <span style="color:green">green</span>, and <span style="color:firebrick">burgundy</span>. Wearing rust in the summer, or light yellow in the fall looks out of place. That color's place in society. Second lower case color. 
 
</p> 
 

 
<h2 class="colour">Colour</h2>

2 problemi che vedo quando si utilizza html() sono

  1. Sarà sostituire il dom che significa che tutti i gestori di eventi/dati jQuery allegati a tali elementi andranno persi

  2. Sarà sostituisci anche gli attributi che potrebbero non essere quello che vuoi. Si noti che ho aggiunto un po 'di colore per il testo ma non è perso dopo la sostituzione di "colore" con "colore"

+2

Cosa c'è di sbagliato con '$(). Html()'? Sarebbe bello sottolineare quali sono i vantaggi dell'utilizzo di questo. Non toccare i gestori di eventi esistenti è ciò che riesco a pensare. Aiuta gli altri a capire perché si dovrebbe usare questo –

+0

@JuanMendes che sostituisce gli elementi dom ... tutti i gestori di eventi usati con quegli elementi andranno persi ... potresti non voler sostituire gli attributi, usando html lo sostituiremo anch'io –

+0

I d'accordo con te in linea di principio sulla parte del gestore di eventi, tuttavia in questo esempio non penso si applichi. – j08691

0

uso questo:

// ricerca globale nella stringa

str = str. sostituire (/ trovare/g,”sostituire”);

// o globale e la cassa ricerca maiuscole nella stringa

str = str.replace (/ trovare/gi,”sostituire”);

Problemi correlati