Pergunta

Hey agora eu estou usando jQuery e tenho algumas variáveis ??globais para titulares de um pouco de coisas ajax pré-carregado (pré-carregado para tornar as páginas surgem bom e rápido):


$.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;});

Como você pode ver, temos uma enorme violação do princípio da seca, mas ... Eu realmente não vejo uma maneira de corrigi-lo ... alguma idéia?

talvez uma matriz?

Foi útil?

Solução

Você não precisa eval() ou Function() para isso. Uma matriz, como você suspeita, irá fazer o trabalho muito bem:

(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)

Outras dicas

Usando o jQuery cada método para percorrer um conjunto de nomes de página e, em seguida, definir uma global (no âmbito janela) variável:

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

Update: Na verdade, você não precisa mesmo de a "nova função":

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

Você pode evitar eval usando a nova função:

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;'));

Não é muito melhor que tbh

Você pode chamar apenas uma vez essa página, e retornando um objeto JSON em vez de texto

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

e eval que Desde agora você está chamando N vezes o seu servidor, este abrandar tudo, você deveria reconsiderar a sua lógica!

PS. como eu escrevo eu vi a resposta RoBorg, você vê, quando se utiliza nova função que você está usando eval sob o capô, por isso, se você quiser usá-lo ir para ele (em algum navegador é mais rápido também)

Esta não usa eval, mas é um pouco mais prolixo.

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]);

Mas um dos dos respondentes fez um ponto bom, você provavelmente deve tentar e combinar todos estes pedidos em um caso contrário seu servidor vai ser atingido 6 vezes para o conteúdo dinâmico em cada solicitação da página.

A maioria destas soluções propostas evitar o uso de eval . Essa prática é ainda reforçada em Doduglas Crockford do " convenções de código para o JavaScript Linguagem de programação ", que diz em parte

"eval é mau

A função eval é o mais mal utilizado apresentam de JavaScript. Evitá-lo.

eval tem aliases. Não utilize o construtor função. "

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top