2011-01-06 1 views
2

Je me suis demandé s'il y a un moyen de définir des chaînes multilignes en JavaScript comme vous pouvez le faire dans des langues comme PHP:Strings multilignes JavaScript et modèles?

var str = "here 
goes 
another 
line"; 

Apparemment, ce décompose l'analyseur. Je trouve que placer une barre oblique inverse \ devant l'alimentation en ligne permet de résoudre le problème:

var str = "here\ 
goes\ 
another\ 
line"; 

Ou je pouvais fermer et rouvrir la chaîne de citations encore et encore.

La raison pour laquelle je demande parce que je fais des widgets d'interface utilisateur basés sur JavaScript qui utilisent des modèles HTML écrits en JavaScript. Il est pénible de taper le HTML dans les chaînes, surtout si vous avez besoin d'ouvrir et de fermer des citations tout le temps. Quel serait un bon moyen de définir des modèles HTML dans JavaScript? J'envisage d'utiliser des fichiers HTML séparés et un système de compilation pour rendre le tout plus facile, mais la bibliothèque est distribuée parmi les autres développeurs afin que les modèles HTML soient faciles à inclure pour les développeurs.

Répondre

1

Non ce qui est fondamentalement ce que vous devez faire pour faire des chaînes multilignes.

Mais pourquoi définir les modèles en javascript anwyay? pourquoi ne pas simplement les mettre dans un fichier et avoir un appel ajax les charger dans une variable quand vous en avez besoin?

Pour instantce (utilisant jquery)

$.get('/path/to/template.html', function(data) { 
    alert(data); //will alert the template code 
}); 
+1

Parce qu'il faut du temps pour faire un XHR pour chaque modèle? Ou avez-vous des moyens de contourner cela ou d'autres suggestions? – Tower

+0

À moins que les modèles ne soient énormes, et que le serveur soit extrêmement ralenti, le temps devrait être négligeable (500ms à 2 secondes devrait être la norme) et vous ne le faites que lorsque vous avez besoin du modèle, pas tous en même temps. Après avoir récupéré le modèle, il suffit de le stocker dans une variable javascript pour pouvoir l'utiliser lorsque vous en avez besoin. –

+0

@rFactor: Voir ma réponse pour savoir comment j'ai contourné ce problème. – slebetman

0

Il existe plusieurs systèmes structurants en javascript. Cependant, mon préféré est celui que j'ai développé en utilisant ajax pour récupérer des templates XML. Les modèles sont des fichiers XML qui le rend facile à intégrer proprement HTML et il ressemble à ceci:

<title>This is optional</title> 
<body><![CDATA[ 
    HTML content goes here, the CDATA block prevents XML errors 
    when using non-xhtml html. 

    <div id="more"> 
     $CONTENT$ may be substituted using replace() before being 
     inserted into $DOCUMENT$. 
    </div> 
]]></body> 
<script><![CDATA[ 
    /* javascript code to be evaled after template 
    * is inserted into document. This is to get around 
    * the fact that this templating system does not 
    * have its own turing complete programming language. 
    * Here's an example use: 
    */ 
    if ($HIDE_MORE$) { 
     document.getElementById('more').display = 'none'; 
    } 
]]></script> 

Et le code javascript pour traiter le modèle ressemble à ceci:

function insertTemplate (url_to_template, insertion_point, substitutions) { 
    // Ajax call depends on the library you're using, this is my own style: 
    ajax(url_to_template, function (request) { 
    var xml = request.responseXML; 
    var title = xml.getElementsByTagName('title'); 
    if (title) { 
     insertion_point.innerHTML += substitute_strings(title[0],substitutions); 
    } 
    var body = xml.getElementsByTagName('body'); 
    if (body) { 
     insertion_point.innerHTML += substitute_strings(body[0],substitutions); 
    } 
    var script = xml.getElementsByTagName('script'); 
    if (script) { 
     eval(substitute_strings(script[0],substitutions)); 
    } 
    }); 
} 

function substitute_strings (str, substitutions) { 
    for (var n in substitutions) { 
    str.replace(n,substitutions[n]); 
    } 
    return str; 
} 

La façon de appeler le modèle serait:

insertTemplate('http://path.to.my.template', myDiv, { 
    '$CONTENT$' : "The template's content", 
    '$DOCUMENT$' : "the document", 
    '$HIDE_MORE$' : 0 
}); 

le signe $ pour les chaînes substituées est simplement une convention, vous pouvez utiliser % de # ou quels que soient les délimiteurs que vous préférez. C'est juste là pour rendre le rôle à substituer sans ambiguïté.

Un grand avantage à utiliser des substitutions du côté javascript au lieu du traitement côté serveur du modèle est que cela permet au modèle d'être des fichiers statiques. L'avantage de cela (autre que de ne pas avoir à écrire du code côté serveur) est que vous pouvez ensuite définir la stratégie de mise en cache pour le modèle pour être très agressif afin que le navigateur n'ait besoin de récupérer le modèle que la première fois. L'utilisation ultérieure du modèle proviendrait du cache et serait très rapide.

En outre, ceci est un exemple très simple de l'implémentation pour illustrer le mécanisme. Ce n'est pas ce que j'utilise. Vous pouvez modifier cela pour faire des choses comme la substitution multiple, une meilleure gestion du bloc de script, gérer plusieurs blocs de contenu en utilisant une boucle for au lieu d'utiliser simplement le premier élément retourné, gérer correctement les entités HTML, etc ...

comme ceci est que le HTML est simplement HTML dans un fichier de texte brut.Cela évite de citer des problèmes de performances de concaténation de chaînes et d'enfer horribles que vous trouverez généralement si vous intégrez directement des chaînes HTML en javascript.

0

Je pense avoir trouvé une solution que j'aime. Je vais stocker des modèles dans des fichiers et les récupérer en utilisant AJAX. Cela fonctionne uniquement pour le stade de développement. Pour la phase de production, le développeur doit exécuter un compilateur une fois qu'il compile tous les modèles avec les fichiers source. Il compile également JavaScript et CSS pour être plus compact et les compile en un seul fichier.

Le plus gros problème est maintenant de savoir comment éduquer d'autres développeurs en faisant cela. J'ai besoin de le construire pour qu'il soit facile de faire et de comprendre pourquoi et ce qu'ils font.

0

Vous pouvez également utiliser \ n pour générer des retours à la ligne. Le html serait cependant sur une seule ligne et difficile à éditer. Mais si vous générez le JS en utilisant PHP ou quelque chose, il pourrait être une alternative

1

@slebetman, Merci pour l'exemple détaillé. Commentaire rapide sur la fonction substitute_strings. je devais réviser

str.replace(n,substitutions[n]); 

être

str = str.replace(n,substitutions[n]); 

pour le faire fonctionner. (Version jQuery 1.5 - il est pur javascript bien?.)

Aussi quand j'avais ci-dessous la situation dans mon modèle:

$CONTENT$ repeated twice $CONTENT$ like this 

je devais faire un traitement supplémentaire pour le faire fonctionner.

str = str.replace(new RegExp(n, 'g'), substitutions[n]); 

Et je devais ne pas $ (char spécial regex) comme séparateur et utilisé # à la place. Je pensais partager mes conclusions.