简体   繁体   中英

jQuery ajax function return

I have this function that embeds flash :

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

And I want to call the function like this

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

The idea is that whenever someone looks for any swf inside my website,he wont find anything clean.I will change the encoding algorithm,but this is just temporary. In order for that function to work,whenever I call the function 'decode' it must return a single value. PHP contains

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

I tried this but it still wont work

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;
}

Important:

Forget about using Ajax and encoding, decoding the path. What do you think you gain from it? Security? No. One can figure out that this is bas64 encoded or he just monitors the network traffic and reads the response from the Ajax call.

Just do

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

Really, you cannot prevent someone else seeing the data and are just making things more complicated for you.

( Or you have to decrypt the data with JavaScript. )


( original answer is still correct nevertheless )

Ajax is asynchronous so something like var test = decode(s); will never work. The decode function will return before the Ajax call finishes.

Instead, put your logic into the callback handler. For example, if your code was this before:

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

put the code into a function and call it from the success handler:

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);
        }
    });
}

This seems to be a very common problem to all beginners. You will find a lot of questions here that deal with the same problem .

Update:

It is not nice, but you could change the function to

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

and do

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

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

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

    });

});

Update 2:

For completeness, you can make the Ajax call synchronous, by using async: false . Then this will work:

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);

However, this will block the browser until the Ajax call finished. You have to test whether this matters in your case or not.

Update 3:

You could also change your PHP script to not only accept one parameter but several and process both strings in one go.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM