2008-11-14 2 views
0

Est-il possible de récupérer l'ensemble de variables dans la fonction onreadystatechange depuis l'extérieur de la fonction?
--edit--
En ce qui concerne l'exécution des fonctions:
S'il est possible que je voudrais exécuter ajaxFunction() en un seul clic
puis pop-up() avec clic suivant, ou attendre en quelque sorte pour la fonction ajax pour mettre fin à puis appelez boîte d'alerte
Dans AJAX comment réacheminer la variable de l'intérieur de onreadystatechange = function()


en pseudocode:

function ajaxFunction(){ 
    //creating AJAX 
    ... 
    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
      //success code 
      ======>Here i want to set variable <===== 
      var MyVariable='MyContent'; 
     } 
    } 
    //Retrieving page 
    .... 
} 

function popup(){ 
    ajaxFunction(); 
    alert(MyVariable); 
} 

Répondre

5

Le code suivant suppose que le ajax-demande est synchrone:

function popup(){ 
    ajaxFunction(); 
    alert(MyVariable); 
} 

Mais puisque les requêtes synchrones bloquent le navigateur, vous devriez dans presque tous les cas, utilisez des appels asynchrones (si je me souviens bien, onreadystatechange ne devrait pas être appelé en requête synchrone mais que les différents navigateurs se comportent différemment)

Ce que vous pouvez faire est:

function ajaxFunction(callback){ 
    //creating AJAX 
    ... 
    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
      //success code 
      callback('MyContent') 
     } 
    } 
    //Retrieving page 
    .... 
} 

function popup() { 
    ajaxFunction(function(MyVariable){alert(MyVariable);); 
} 
+1

Vous devez également tester l'ajaxRequest.status pour 200 pour vous assurer que le document a été récupéré et que vous n'avez pas obtenu un 404, 5xx ou une autre erreur. (Vous devriez probablement utiliser une sorte de cadre pour vos requêtes ajax qui s'occuperont de tout cela pour vous) – some

+0

Merci pour la solution et la suggestion. – Chris

+0

@Chris: Pas de problème. C'est pourquoi ce site existe :) – some

0

Pourquoi ne pas changer le champ d » MyVariable à l'extérieur de la fonction?

var MyVariable;  
function ajaxFunction(){ 
    //creating AJAX 
    ... 
    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
      //success code 
      ======>Here i want to set variable <===== 
      MyVariable='MyContent'; 
     } 
    } 
    //Retrieving page 
    .... 
} 

function popup(){ 
    ajaxFunction(); 
    alert(MyVariable); 
} 
+0

Sauf si la requête est synchrone, elle ne fonctionnera pas (et si elle est synchrone onreadystatechange ne devrait pas être appelée, IIRC) – some

+0

Vous avez raison, j'aurais dû lire la question plus clairement! –

0

Non, car MyVariable est limité à la fonction. Pour le rendre visible à popup(), il doit être délimité là où la fonction du gestionnaire d'événements et popup() peut le voir, comme le recommande Jenp.

0

passer la variable à la fonction pop-up():

var MyVariable;  
function ajaxFunction(){ 
    //creating AJAX 
    ... 
    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
      //success code 
      ======>Here i want to set variable <===== 
      MyVariable='MyContent'; 
      popup(MyVariable); 
     } 
    } 
    //Retrieving page 
    .... 
} 

function popup(x){ 
    ajaxFunction(); 
    alert(x); 
} 
+0

popup appelle ajaxFunction qui appelle pop-up qui appelle ajaxFunction qui est ..... Erreur: débordement de pile – some

0

Cela peut compliquer votre problème alors ne hésitez pas à intervenir, mais en utilisant un tiers bibliothèque Javascript peut aider à soulager un peu votre fardeau (comme commentateur certains mentionné). Prototype et JQuery ont tous deux des moyens de gérer la portée, tels que la fonction de liaison dans Prototype. De plus, vous n'aurez pas besoin d'écrire votre propre code de requête Ajax, même si je vous recommande de creuser et de voir comment cela fonctionne! Les classes de prototypes peuvent vous aider avec les problèmes de portée que vous avez décrits. Vous pouvez refactoriser afin d'utiliser des requêtes Ajax asynchrones afin que le navigateur ne doive pas attendre, comme c'est le cas avec la façon dont vous l'avez écrit. Les éléments suivants afficheront votre message d'alerte et définiront la variable de manière appropriée, bien que je ne l'ai pas testé pour des erreurs. Il montre cependant le concept de base.

var TestClass = Class.create(); 
TestClass.prototype = { 

    MyVariable: null, 
    AjaxURL: "http://yourajaxurl.com/something.asmx", 
    DoAjaxCall: function() { 
      new Ajax.Request(this.AjaxURL, 
       method: 'get', 
       onSuccess: this.AjaxCallback.bind(this), 
       onFailure: this.DoSomethingSmart.bind(this)); 
    }, 

    AjaxCallback: function(returnVal) { 
      this.MyVariable = returnVal.responseText; //ResponseText or whatever you need from the request... 
      this.Popup(this.MyVariable); 
    }, 

    DoSomethingSmart: function() { 
      //Something smart 
    }, 

    Popup: function(message) { 
      alert(message); 
    } 

}; 

var TestClassInstance = new TestClass(); 
TestClassInstance.DoAjaxCall(); 
1

les commentaires de certains sont corrects ... cela n'a rien à voir avec la portée des variables, et tout à voir avec le fait que la fonction interne (la fonction « onreadystatechange ») définissant la valeur de MyVariable pas été exécuté au moment où l'alerte() se produit ... donc l'alerte sera toujours vide.

La fonction interne n'est pas exécutée de façon synchrone (c'est-à-dire immédiatement), mais elle est différée et exécutée plus tard, lorsque la requête revient, ce qui est long après l'exécution de alert(). La seule solution à ceci est de différer l'alerte jusqu'à la fin de la demande.

Mais indépendamment de tout cela, la fonction interne peut définir des variables hors de sa portée, comme le mentionnent les autres publications. Mais votre problème concerne plus l'ordre d'exécution que la portée variable.

Questions connexes