2010-04-30 4 views
1

J'ai le code suivant.javascript ajax help

var d3_ad = 1; 

    function displayD3Ad(){ 
     var query_string = '?d3_ad='+d3_ad; 
     query_string += '&location='+escape(location); 

    //document.write('<iframe src="index.php'+query_string+'"></iframe>'); 

    var data = httpRequest('http://localhost/test/index.php','GET',query_string); 
    document.write(data); 
} 

function httpRequest(strURL,type,query) { 
    var request = false; 

    if (window.XMLHttpRequest) {// Mozilla/Safari 
     request = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { //Internet Explorer 
     request= new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    request.open(type, strURL + query, true); 
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      return request.responseText; 
     } 
    } 

    request.send(null); 
} 

displayD3Ad(); 

maintenant quand il écrit les données il est dit indéfini. Il semble que cela ne retourne pas les données. J'ai regardé dans firebug et il se termine et montre la réponse qui devrait être là. Toute aide est appréciée. J'ai juste besoin de définir la variable de données pour pouvoir l'utiliser plus tard.

+0

Quelle est la valeur d'en-tête Content-Type dans la réponse? – Andreas

Répondre

2

Vous avez raison, en JavaScript, vous devez gérer la valeur de réponse dans un rappel. Ce qui n'est pas idéal pour une application sérieuse.

Il existe une extension au langage JavaScript appelé StratifiedJS. Il s'exécute dans tous les navigateurs et vous permet d'obtenir la valeur de réponse directement (au lieu de indéfini)

Vous pouvez activer le JavaScript stratifié, par ex. en incluant Oni Apollo (http://onilabs.com/docs) dans votre page Web comme:

<script src="http://code.onilabs.com/latest/oni-apollo.js"></script> 
<script type="text/sjs"> your StratifiedJS code here </script> 

Et votre code ressemblera à ceci:

function displayD3Ad(){ 
    var query_string = '?d3_ad='+d3_ad; 
    query_string += '&location='+escape(location); 

    var data = require("http").get('http://localhost/test/index.php' + query_string); 
    document.write(data); 
} 

Cette utilise la boîte à outils Apollo afin que vous n'avez pas à écrire votre propre fonction HttpRequest, il est déjà là dans le module "http".

0

Le problème est que vous avez en quelque sorte mal compris comment ce mécanisme va fonctionner. Lorsque vous appelez votre httpRequest fonction, vous initier la transaction AJAX, mais votre fonction renvoie à peu près immédiatement. Ce n'est que lorsque le serveur répondra que le navigateur appellera votre gestionnaire de changement d'état, et que cette valeur de retour sera simplement jetée. Je suggère que ce que vous devez faire est de gérer le texte de réponse à l'intérieur le gestionnaire de changement d'état.

En outre, il ne fonctionnera pas pour gérer la réponse avec document.write car au moment où la réponse revient, votre document sera tout fait. Ce que vous voudrez faire, c'est que le document inclue un élément marqueur (un <span> ou un <div> ou autre), et que le gestionnaire trouve que le texte de réponse y soit déposé.