2011-10-31 10 views
19

C'è un modo per fare qualcosa di simile a ruby ​​gsub in javascript? Ho un file html locale che voglio elaborare e sostituire determinate variabili di template con il contenuto ma non riesco a capire come sostituire le variabili di template con il nuovo contenuto. Il HTML contiene frammenti come di seguito:Esiste qualcosa di simile a gsub in javascript?

<div id="content"> 
    <h1>{{title}}</h1> 
    {{content}} 
</div> 

Ora, se mi avvolgo ogni variabili di modello in un div chiamato allora posso usare qualcosa come il metodo replaceAll di jQuery per sostituire la variabile di modello con il suo contenuto, ma Non riesco a capire come fare senza avvolgere ogni variabile in un div.

Voglio solo fare qualcosa come $ ('documento'). Gsub ("{{title}}", "I am a title").

Qualcuno ha qualche idea?

Grazie per il vostro aiuto!

+0

Un motore di template in jQuery? Dai un'occhiata a http://api.jquery.com/jquery.tmpl/ –

risposta

5

È possibile accedere al codice HTML grezzo tramite proprietà innerHTML di un elemento DOM, o utilizzando la proprietà di JQuery html avvolgendolo, e quindi eseguire la sostituzione:

var html = $(document).html(); 
$(document).html(html.replace('{{title}}', 'I am a title'); 

EDIT:

Come sottolineato da Antti Haapala , sostituendo l'intero documento HTML può avere effetti collaterali che non vuoi gestire, come gli script che vengono ricaricati. Pertanto, si dovrebbe drill-down per l'elemento più specifica DOM possibile prima di eseguire la sostituzione, cioè .:

var element = $('#content'); 
var html = element.html(); 
element.html(html.replace('{{title}}', 'I am a title'); 
+0

Questo potrebbe fallire male con gli script;) –

+0

In effetti. Solitamente localizzo un elemento specifico e sostituisco solo il contenuto, lasciando intatto il resto del documento. – gnab

3

Beh, è ​​possibile utilizzare String.replace con un'espressione regolare, ma in realtà, quello che si potrebbe usare jQuery sei modelli.

http://api.jquery.com/category/plugins/templates/

+0

Grazie Antti. Queste sembrano un'ottima opzione, ma il mio caso d'uso è piuttosto semplice e serve solo la semplice opzione di sostituzione che in qualche modo è riuscita a sfuggirmi. – Nick

+1

Mentre quattro anni dopo questa risposta, l'opzione di sostituzione delle stringhe è ancora attuale e praticabile, i modelli jQuery sono stati nel frattempo deprecati e sostituiti con JsRender e JsViews. – haslo

1

Recentemente ho usato Handlebars di prendere un attributo di dati (modello) da una tabella e iniettare un altro valore (record di id) da uno dei suoi file:

// data-row-url="http://example.com/people/{{id}}" 

var table = $(this).closest('.data_grid table');       

if(table.attr('data-row-url')) {           
    var record_id = $(this).data('record-id')       
    var show_url_template = table.data('row-url');      
    var url_template = Handlebars.compile(show_url_template)    
    var url = url_template({ id: record_id });       
    $.getScript(url);             
} 

per il contesto di questo codice viene eseguito dall'interno di un evento onclick per gli elementi tr della tabella e recupera il record cliccato tramite ajax.

30

Se gli altri erano alla ricerca di un equivalente gsub in generale, questo sostituisce solo la prima partita:

"aa".replace("a", "b") // "ba" 

//g sostituisce tutti gli incontri:

"aa".replace(/a/g, "b") // "bb" 
"aa".replace(new RegExp("a", "g"), "b"); // "bb" 
1

Credo che potrebbe essere un modello di baffi . Potresti voler controllare mustache.js. Penso che potresti essere in grado di compilarlo in JS.

Problemi correlati