Question

Hé maintenant, j'utilise jQuery et j'ai quelques variables globales pour contenir un peu de trucs ajax préchargés (préchargés pour que les pages apparaissent rapidement et facilement):


$.get("content.py?pageName=viewer", function(data)
    {viewer = data;});
$.get("content.py?pageName=artists", function(data)
    {artists = data;});
$.get("content.py?pageName=instores", function(data)
    {instores = data;});
$.get("content.py?pageName=specs", function(data)
    {specs = data;});
$.get("content.py?pageName=about", function(data)
    {about = data;});

Comme vous pouvez le constater, le principe de DRY est violé, mais ... je ne vois pas vraiment comment y remédier ... des idées??

peut-être un tableau?

Était-ce utile?

La solution

Vous n'avez pas besoin de eval () ou Function () pour cela. Comme vous le soupçonniez, un tableau fera parfaitement l'affaire:

(function() // keep outer scope clean
{
   // pages to load. Each name is used both for the request and the name
   // of the property to store the result in (so keep them valid identifiers
   // unless you want to use window['my funky page'] to retrieve them)
   var pages = ['viewer', 'artists', 'instores', 'specs', 'about'];

   for (var i=0; i<pages.length; ++i)
   {
      // "this" refers to the outer scope; likely the window object. 
      // And will result in page contents being stored in global variables 
      // with the same names as the pages being loaded. We use the with({})
      // construct to create a local scope for each callback with the
      // appropriate context and page name.
      with ({context: this, pageName: pages[i]})
         $.get("content.py?pageName=" + pageName, function(data)
            {context[pageName] = data;});
   }

})(); // close scope, execute anonymous function

// at this point, viewer, artists, etc. are populated with page contents 
// (assuming all requests completed successfully)

Autres conseils

En utilisant jQuery chaque méthode pour parcourir un tableau de noms de page, puis en définissant une variable globale (dans l'étendue de la fenêtre):

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page,
            new Function("window[" + page + "] = arguments[0]"));
    }
);

Mise à jour: vous n'avez même pas besoin de la "nouvelle fonction":

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page, function () { window[page] = arguments[0]; });
    }
);

Vous pouvez éviter eval avec la nouvelle fonction:

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
   $.get("content.py?pageName=" + names[i], new Function('data', names[i] + ' = data;'));

Ce n'est pas beaucoup mieux si tbh

Vous ne pouvez appeler qu'une seule fois cette page et renvoyer un objet json à la place d'un texte

{
viewer:'me',
artists:'you',
instores:'instores',
specs:'specs',
about:'about'
}

et eval que Puisque vous appelez maintenant N fois votre serveur, cela ralentit tout, vous devriez revoir votre logique!

PS. Au moment où j'écris, j'ai vu la réponse de RoBorg, vous voyez, lorsque vous utilisez la nouvelle fonction, vous utilisez eval sous le capot, donc si vous voulez l'utiliser, allez-y (dans certains navigateurs, le logiciel est également plus rapide)

Cela n'utilise pas eval, bien que ce soit un peu plus verbeux.

function get_content(name){
   $.get("content.py?pageName=" + name, function(data){ window[name] = data;});
}

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
    get_content(names[i]);

Mais l’un des répondants a fait valoir un bon point, vous devriez probablement essayer de combiner toutes ces demandes en une seule, sinon votre serveur sera touché 6 fois pour son contenu dynamique à chaque demande de la page.

La plupart des solutions proposées évitent l'utilisation de eval . Cette pratique est encore renforcée dans le document "Doduglas Crockford" Conventions de code pour le langage de programmation JavaScript " qui dit en partie

  

"eval is Evil

     

La fonction eval est la plus mal utilisée   fonctionnalité de JavaScript. Évitez-le.

     

eval a des alias. Ne pas utiliser le   Constructeur de fonction. "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top