2010-08-04 13 views
1

J'ai cette fonction qui intègre Flash:jQuery retour de la fonction ajax

function embedswfile(target, swf, base, width, height) {//dosomething} 

Et je veux appeler la fonction comme celui-ci

embedSwf("flashgame",decode("<?=base64_encode($path['location'])?>"),decode("<?=base64_encode($path['base_directory'])?>"),"800","600") 

L'idée est que chaque fois que quelqu'un cherche une swf dans mon site Web, il ne trouvera rien de propre.Je vais changer l'algorithme de codage, mais ce n'est que temporaire. Pour que cette fonction fonctionne, chaque fois que j'appelle la fonction 'décoder', elle doit renvoyer une seule valeur. PHP contient

<?php 
echo base64_decode($_POST['s']); 
?> 

J'ai essayé, mais ça marche toujours coutume

var globvar; 
function processdata(newmsg) { 
    globvar = newmsg; 
} 

function decode(s){ 
    $.ajax({type: "POST", 
     url: "includes/decode.inc.php", 
     data: "s=" + s, 
     success:function(newmsg){ 
      processdata(newmsg); 
     } 
    }); 
return globvar; 
} 
+0

Que fait votre fichier PHP? Vos noms de variables sont difficiles à comprendre. Pourquoi définissez-vous retdata = newmsg? Que faites-vous avec les données renvoyées? S'il vous plaît clarifier et nous serons en mesure d'être plus utile. Merci! –

+0

soit ne pas retourner la variable globale retdata et l'assigner à la variable après l'appel de fonction ou définir retdata dans la fonction de décodage – KoolKabin

Répondre

4

Important:

Oublier en utilisant Ajax et le codage, le décodage du chemin. Que pensez-vous en tirer? Sécurité? Non. On peut comprendre qu'il s'agit d'un encodage bas64 ou il surveille simplement le trafic réseau et lit la réponse de l'appel Ajax.

Il suffit de faire

embedSwf("flashgame","<? =$path['location']?>"),"<?=$path['base_directory']?>","800","600") 

Vraiment, vous ne pouvez pas empêcher quelqu'un d'autre de voir les données et sont tout simplement rendre les choses plus compliquées pour vous.

(ou vous devez déchiffrer les données avec JavaScript.)


(réponse originale est toujours correcte quand même)

Ajax est asynchrone donc quelque chose comme var test = decode(s); ne marchera jamais. La fonction de décodage renvoie avant l'appel Ajax se termine.

À la place, placez votre logique dans le gestionnaire de rappel. Par exemple, si votre code était auparavant:

var retdata = decode('s'); 
// here comes code that handles retdata 

mettre le code en fonction et l'appeler à partir du gestionnaire de succès:

function process(retdata) { 
    // here comes code that handles retdata 
} 

function decode(s){ 
    $.ajax({type: "POST", 
     url: "includes/decode.inc.php", 
     data: "s=" + s, 
     success:function(newmsg){ 
      process(newmsg); 
     } 
    }); 
} 

Cela semble être un problème très commun à tous les débutants. Vous trouverez beaucoup de questions ici qui traitent du same problem.

Mise à jour:

Il est pas beau, mais vous pouvez changer la fonction de

function decode(s, cb){ 
    $.ajax({type: "POST", 
     url: "includes/decode.inc.php", 
     data: "s=" + s, 
     success:function(data){ 
      cb(data); 
     } 
    }); 
} 

et faire

decode("<?=base64_encode($path['location'])?>", function(location) { 

    decode("<?=base64_encode($path['base_directory'])?>", function(dir) { 

     embedSwf("flashgame",location,dir,"800","600"); 

    }); 

}); 

Mise à jour 2:

Pour comp leteness, vous pouvez rendre l'appel Ajax synchrone, en utilisant async: false. Alors cela fonctionnera:

function decode(s){ 
    var ret; 
    $.ajax({type: "POST", 
     url: "includes/decode.inc.php", 
     data: "s=" + s, 
     async: false, 
     success:function(newmsg){ 
      ret = newmsg; 
     } 
    }); 
    return sync; 
} 

var val = decode(s); 

Cependant, ceci bloquera le navigateur jusqu'à ce que l'appel d'Ajax ait fini. Vous devez tester si cela compte dans votre cas ou non.

Mise à jour 3:

Vous pouvez également modifier votre script PHP pour accepter non seulement un paramètre, mais plusieurs et traiter les deux chaînes en une seule fois.

+0

J'essayais de résoudre ceci: fonction embedSwf ("flashgame", decode (" "), decode (" ")," 800 "," 600 ") {// faire quelque chose} qu'aucun swf ne sera réellement visible dans mon document. Et je faisais écho le swf comme encodé et j'essayais de passer les données à javascript après qu'il a été décodé avec le décodage de fonction – NVG

+0

@nevergone: S'il vous plaît voir mes mises à jour. Vous pouvez rendre l'appel synchrone, mais cela gèlera le navigateur. Testez si c'est important. –

+0

Je vais créer mon propre algorithme de chiffrement. Ceci est juste temporaire.J'ai essayé ce que vous avez dit dans la mise à jour # 1, mais cela ne fonctionne pas.Qu'est-ce que le cb (données)? Où est la valeur de location et dir changé en non codé? – NVG