Domanda

Ho intenzione di utilizzare JSONP di chiamare un webservice esterni per aggirare il fatto che io non voglio creare una funzione globale che potrebbe potenzialmente in conflitto con la pagina chiamante. Ho pensato che la creazione di un nome di funzione random e passando in su avrebbe funzionato. Qualcosa di simile a questo:

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

dove CB è il nome della funzione di callback, il server sarebbe tornato

d357534({my json data});

quello che voglio sapere è come creare il nome della funzione casuale, sono sicuro che potrei usare eval ma è questo il modo migliore per andare a questo proposito?

in sostanza, quello che sto cercando di fare è questo:

var d + Math.floor(Math.random()*1000001) = function(){...   
È stato utile?

Soluzione

Questo dovrebbe fare quello che vuoi. È necessario salvare il nome della funzione da qualche parte in modo che è possibile passare al server, ma si può fare all'interno di un ambito locale per evitare di inquinare lo spazio dei nomi globale.

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

Altri suggerimenti

Per rendere una variabile globale a caso di nome si potrebbe fare questo:

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

Ora, naturalmente, hai il problema di ricordare il nome casuale da qualche parte. Si potrebbe fare un nome casuale per la variabile che anche. Allora dovreste ricordare il nome di quel variabile , in modo che si poteva guardare il suo valore e quindi sapere come trovare la vostra funzione. Dopo un po ', le cose stanno andando per iniziare a ricevere strane.

Perché non basta usare un contatore e incrementarlo ogni volta che hai bisogno di una nuova funzione:

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

Se si vuole evitare di sporcare il namespace globale con troppi riferimenti si potrebbe (e dovrebbe) fissare il contatore e callback a un unico oggetto globale:

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

In questo caso si potrebbe chiamare il metodo in questo modo:

JSONP.callback_12(json);

Di grossolana si deve inizializzare il JSONPobject e la variabile COUNTER prima.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top