Pergunta

Estou pensando em usar JSONP para chamar um webservice externo para contornar o fato de que eu não quero criar uma função global que poderia entrar em conflito com a página de chamada. Eu pensei que a criação de um nome de função aleatória e passando-se iria funcionar. Algo parecido com isto:

<script src="www.foo.com/b?cb=d357534">

onde cb é o nome da função de retorno de chamada, o servidor retornaria

d357534({my json data});

O que eu quero saber é como criar o nome da função aleatória, im certeza que eu poderia usar eval mas esta é a melhor maneira de ir sobre ele?

Essencialmente, o que eu estou tentando fazer é esta:

var d + Math.floor(Math.random()*1000001) = function(){...   
Foi útil?

Solução

Isso deve fazer o que quiser. Você precisa salvar o nome da função em algum lugar de modo que você pode passá-lo para o servidor, mas você pode fazer isso dentro de um âmbito local para evitar a poluição seu namespace global.

var functionName = 'd' + Math.floor(Math.random()*1000001);
window[functionName] = function() { ... }

Outras dicas

Para fazer uma variável global aleatoriamente chamado você poderia fazer isso:

window['randomvar' + Math.floor(Math.random()*1000001)] = function() { ... };

Agora, é claro que você tem o problema de lembrar o nome em algum lugar aleatório. Você poderia fazer-se um nome aleatório para que variável também. Então você tem que lembrar o nome de que variável, de modo que você pode olhar para o seu valor e, em seguida, saber como encontrar a sua função. Depois de um tempo, as coisas vão começar a ficar estranho.

Por que não usar apenas um contador e incrementá-lo cada vez que você precisar de uma nova função:

var name = "callback" + window.COUNTER++;
window[name] = function() { ... };

Se você quer evitar jogar lixo no espaço global com muitas referências que você pode (e deve) fixar o balcão e retornos de chamada para um único objeto global:

var JSONP = window.JSONP;
var name = "callback" + JSONP.COUNTER++;
JSONP[name] = function() { ... };

Neste caso, você poderia chamar o método como este:

JSONP.callback_12(json);

De grosseiro você tem que inicializar o JSONPobject ea variável COUNTER primeiro.

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