2009-06-26 10 views
1

Nous essayons de rendre disponible seulement certaines fonctions à exécuter en fonction de l'adresse de requête.Fonctions Javascript

Je me demandais comment nous pourrions faire:

if(condition1) 
{ 
    $(document).ready(function() { 
     ... 
     ... 
     // condition1's function 
    }); 
} 
else if(condition2) 
{ 
    $(document).ready(function() { 
     ... 
     ... 
     // condition2's function 
    }); 
else if... 

Je me demandais ce qu'est un bon modèle fonctionnerait pour cela? puisque nous avons toutes nos fonctions dans un fichier.

+0

Voulez-vous dire que vous voulez des pages différentes sur votre serveur pour voir différents ensembles de fonctions? – Nosredna

+0

Oui, je souhaite que certaines fonctions soient disponibles en fonction de l'adresse du site. Je ne suis pas sûr que la longue liste de déclarations if/else soit la bonne. –

Répondre

4

Cela dépend de ce que vos conditions sont comme ...

S'ils sont tous d'un format similaire, vous pouvez faire quelque chose comme

array = [ 
    ["page1", page1func], 
    ["page2", page2func], 
    ... 
] 

for(i=0; i<array.length; ++i) 
{ 
    item = array[i]; 
    if(pageName == item[0]) $(document).ready(item[1]); 
} 
+0

@Nick: +1. C'est la meilleure approche de tout ce que j'ai vu, même si je pourrais utiliser une approche de table de hachage. –

+1

L'avantage de cette approche sur une table de hachage est que vous pouvez utiliser une correspondance partielle pour la condition correspondant à "pageName". Par exemple: 'if (item [0] .indexOf (pageName) == 0) {...' ou 'if (item [0] .test (nompage)) {...' (dans cet exemple, élément [ 0] est une expression rationnelle, pas une chaîne). –

1

Je ne vois aucun problème avec ça. Mais cela pourrait être mieux:

$(document).ready(function() { 
    if (condition1) 
     // condition1's function 
    else if (condition2) 
     // condition2's function 
    ... 
}); 
0

Peut-être que vous pourriez donner plus de détails que vous faites, mais ce que je peux dire pourquoi ne pas simplement faire ce qu'est exactement un autre fichier JS contenant les fonctions nécessaires pour chaque page au lieu d'essayer de tous les vider dans un seul fichier.

+0

Ma conjecture est si elles incluent toujours le même fichier, il est mis en cache. Et ils n'ont pas à s'inquiéter des problèmes de maintenance (la même fonction dans plusieurs fichiers). – Nosredna

0

Je voudrais juste laisser toutes les fonctions dans un fichier si c'est comme ils le sont déjà. Cela vous fera gagner du temps lors de la reprise et économisera du temps avec des coûts de latence réduits et la mise en cache du navigateur. Ne laissez pas ce fichier trop grand. Déboguer et modifier deviendra horrible.

Si vous les conservez tous dans un seul fichier, ajoutez un script sur chaque page qui appelle celle (s) que vous voulez.

function funcForPage1() {...} 

function funcForPage2() {...} 

Puis, page1

$(funcForPage1); 

etc.

+0

@George: Je pense que vous voulez dire $ (document) .ready (funcForPage1); –

3

J'aime Nick's answer le meilleur, mais je pourrais adopter une approche de la table de hachage, en supposant que la 'adresse de demande' est une valeur fixe connue :

var request_addresses = { 
    'request_address_1': requestAddress1Func, 
    'request_address_2': requestAddress2Func 
}; 

$(document).ready(request_addresses[the_request_address]); 

Bien sûr, request_addresses pourrait ressembler à ceci comme nous ll:

var request_addresses = { 
    'request_address_1': function() { 
     /* $(document).ready() tasks for request_address_1 */ 
    }, 
    'request_address_2': function() { 
     /* $(document).ready() tasks for request_address_2 */ 
    } 
}; 
+0

Les adresses doivent être mises en correspondance via regex. –

+1

@LB: Si vous devez faire correspondre les adresses de requête en utilisant regex, utilisez la solution de Nick, mais changez les valeurs de 'item [0]' en regex et la condition 'if (item [0] .test (requestAddress)) { ... '(ou vous pouvez utiliser String.match()). –

+0

génial Grant, merci! –

1

Il serait probablement plus propre à faire l'URL du site de vérification sur le serveur (si vous le pouvez?) et inclure différents fichiers .js en fonction de la condition, par exemple

** En utilisant ASP.NET MVC

<html> 
<head> 
    <% 
    if(Request.Url.Host == "domain.com") 
    { %><script type="text/javascript" src="/somejsfile1.js"></script><% } 
    else 
    { %><script type="text/javascript" src="/somejsfile2.js"></script><% } 
    %> 
</head> 
</html> 

De cette façon, chaque fichier js serait autonome, et aussi votre HTML ne serait pas inclure des lignes de JS il n'a pas besoin (code signifiait Pour les "autres" sites)

+0

Cela nuirait à sa mise en cache. Cela signifierait également avoir la même fonction dans plusieurs fichiers source. Bien sûr, cela pourrait être résolu avec un travail de construction de fantaisie. – Nosredna

+0

De toute façon, il devra faire face à des problèmes de mise en cache car il tirera l'URL de demande via asp.net –

+0

Allen, je ne sais rien à propos de asp.net. Pouvez-vous me donner une éducation rapide sur pourquoi? – Nosredna

0

Au lieu de faire ce que vous planifiez, envisagez de regrouper les fonctions d'une manière logique et d'espace de noms les groupes.

Vous auriez un objet qui contient des objets qui contient les fonctions et appelez comme ceci:

serial = myApp.common.getSerialNumber(year,month); 
model = myApp.common.getModelNumber(year); 

ou

myApp.effects.blinkText(textId); 

Si vous vouliez cacher une ou plusieurs fonctions par page, je suppose vous pourriez les annuler par fonction ou par groupe après le chargement. Mais j'espère que l'organisation des choses satisferait votre désir de nettoyer l'espace de noms global.

0

Je ne peux pas imaginer une manière particulièrement élégante d'y parvenir en utilisant uniquement JavaScript. Si c'est tout ce dont vous disposez, alors je vous recommande au moins d'utiliser une instruction switch ou (de préférence) une implémentation de table de hachage pour référencer vos fonctions.

Si je devais faire quelque chose comme ça, étant donné que mon environnement de développement est entièrement sous mon contrôle, je diviserais le JavaScript en fichiers individuels et ensuite, ayant déterminé la demande, j'utiliserais le code côté serveur pour construire un fichier JavaScript personnalisé fourni et le servir. Vous pouvez créer des copies de cache de ces fichiers sur le serveur et envoyer également des en-têtes de mise en cache côté client.

Ce article, qui couvre cette technique dans le cadre d'une série peut vous intéresser.

+0

C'est très intéressant. Pourtant, je pense que l'avantage d'avoir un seul fichier js est convaincant sur un site avec beaucoup de pages. Vous le servez une fois et une seule fois. Et vous n'avez pas à vous soucier de la complexité de construction ou de la complexité du serveur. Tout va dépendre de la taille du fichier js et du nombre de pages attendues qui seront servies, je suppose. – Nosredna

Questions connexes