#ifndef en javascript
Je suis à la recherche d'une solution à seulement définir une fonction une fois en Javascript à l'aide de quelque chose exactement comme #ifndef dans les langages compilés. J'ai trouvé un couple de bibliothèques qui étaient censés imiter cette fonctionnalité, mais ils n'ont pas de travail.
Je suis en train de travailler avec MVC 3 Rasoir et ont défini le contenu html helpers ne mettez ce sont essentiellement des commandes de l'utilisateur sur la page.
Chaque contrôle possède un ensemble de fonctions javascript qui définissent des fonctionnalités spécifiques pour le contrôle, donc c'est ici que réside le problème: les fonctions se défini plusieurs moments où l'aide est appelée plusieurs fois sur une seule page.
Je suis l'espoir de trouver un moyen de garder la très petite quantité de javascript définies au sein de l'aide et ne pas avoir à diviser javascript pour chacun de ces petits lutins dans un fichier séparé.
Exemple:
@helper CmsImage(int id)
{
var Html = ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html;
<text>
<input type="button" class="editor_function" style="display: none;" onclick="editImage(@id); return false;" />
<script>
function editImage(id) {
$('#alt_text' + id).attr('value', $('#' + id).attr('alt'));
$('#image_url' + id).attr('value', $('#' + id).attr('src'));
}
function saveImage(button, id) {
$(button).parent().parent().removeClass('color-yellow').addClass('color-red');
$(button).parent().siblings('div.widget-content').html('<img alt="' + $('#alt_text' + id).val() + '" src="' + $('#image_url' + id).val() + '" id="' + id + '" />');
}
#endif
</script>
Image Url:
<input type="text" id="image_url@{id.ToString();}" /><br />
Alt Text:
<input type="text" id="alt_text@{id.ToString();}" /><br />
<input type="button" value="save" onclick="saveImage(this, @{id.ToString();});" />
@Html.Raw(GetCurrentContent(id))
</text>
}
Le ci-dessus ne fonctionne pas dans le navigateur, si me donne l'erreur: '48: Unrecognized jeton ILLÉGAL"
ce préprocesseur C? Les navigateurs ont un préprocesseur C? Je pense que vous avez peut-être mal compris ma question, je suis à la recherche d'une solution EN Javascript.
Non, navigateurs ne le font pas. Mais si vous avez des fichiers JavaScript sur votre ordinateur, vous pouvez les exécuter à travers un préprocesseur C et donner le résultat dans le navigateur.
Pourriez-vous expliquer pourquoi vous avez besoin de cette fonctionnalité, et comment vous avez l'intention de l'utiliser? Que ferait-il plus facile de proposer une solution qui répond à vos besoins.
Je ne comprends pas comment cela va résoudre mon problème. Je vais l'ajouter à ma question pour décrire ce que je suis en train de faire un peu mieux.
OriginalL'auteur KenEucker | 2011-09-11
Vous devez vous connecter pour publier un commentaire.
Comme je suppose que vous le savez, Javascript n'a pas de directives de préprocesseur comme le C/C++, mais vous pouvez utiliser les
if
états qui sont évalués au moment de l'exécution comme ceci:ou pour toute une bibliothèque de fonctions:
ou si vous voulez vérifier basée sur une autre variable:
Si votre préoccupation est juste que vous avez plusieurs copies des mêmes noms de fonction dans la bibliothèque de chaque contrôle les usages, qui n'est pas techniquement un problème en Javascript. La dernière défini un sera déterminante, mais si elles sont toutes les mêmes qui n'est pas techniquement un problème. Une seule définition permet d'exister dans la mémoire comme le plus tard définitions remplacer les précédents.
Si vous contrôlez la source des contrôles, alors il serait mieux pour briser la commune utilitaires séparément dans leur propre fichier JS et avoir la page d'hôte incluent que les services publics fichier de script une fois.
Ou (avec un peu plus de travail mais pas de responsabilités supplémentaires pour la page d'hôte), à chaque contrôle peut charger dynamiquement leurs utlities à partir d'un fichier JS externe et vérifier connu une variable globale pour voir si un autre contrôle a déjà chargé la commune de la JS externe.
OriginalL'auteur jfriend00
Si vous avez quelques script de build je vous suggérons d'utiliser le GPP de préprocesseur(http://en.nothingisreal.com/wiki/GPP, ou gagner la version http://makc.googlecode.com/svn/trunk/gpp.2.24-windows/)
Donc vous devez faire les étapes suivantes:
les commandes)
Dans ce cas, vous aurez le plus optimisé du code js. Et vous n'avez pas besoin exécution des contrôles
Diniel, s'il vous plaît essayer de le faire: gpp-DdebugMode=1 -o _script.js script.js et de supprimer les #define debugMode de code
OriginalL'auteur Max
Je vois que la réponse fournie par jfriend est un peu vieux quand node.js n'est pas là. Pls. consultez les dernières preprocessor.js (disponible via npm install).
Vous pouvez utiliser les conditions statiques comme ci-dessous (à partir de la documentation)
D'Usage :
OriginalL'auteur Sesha Kiran
C'est une vieille question, mais les réponses sont maintenant un peu hors de date. Si vous essayez d'obtenir mieux, d'inlining ou de les éliminer du code mort vous pouvez utiliser google compilateur de fermeture avec le
/** @const */
helperIci est complètement aléatoire (inutile sauf pour la démo) exemple de @const aide à travailler avec des optimisations avancées:
compile:
alert((void 0).getElementsByTagName("body")[0]+"New user"+(void 0).getElementsByTagName("body")[0]);
ou sans @const:
var a=!0;function b(){if(!a)var c=document;return c.getElementsByTagName("body")[0]}alert(b()+"New user"+b());
L'avantage de ceci est que le code fonctionne toujours en cours de développement, sans avoir à effectuer un prétraitement avant chaque exécution. (avec l'avantage d'une meilleure optimisation)
OriginalL'auteur technosaurus
Vieux thème, mais pour quiconque s'intéresse à la solution que j'ai écrit jspreproc de déployer des riot modules, le tout en JavaScript pour le nœud 0.10.0 et au-dessus.
jspreproc est open source, supprimer les lignes vides, prend en charge les filtres pour conserver les commentaires de différents types, et à la condition que les commentaires de style C:
#if, #elif, #else, #endif
avec l'expression et ladefined()
soutien#define
avec l'expression et la base de la macro-remplacement#ifdef, #ifndef
#include, #include_once
D'Installation et d'utilisation exemple:
Lire la suite sur le jspreproc référentiel sur github.
OriginalL'auteur aMarCruz
Dans les temps modernes, il ressemble à un travail de RequireJS ou équivalent AMD module.
Toutes les autres réponses de parler de précompilation et minification - qui sont bons, et devraient être considérées en plus.
OriginalL'auteur Nick