开发者

jQuery ajax function return

I have this function that embeds flash :

function embedswfile(target, swf, base, width, h开发者_C百科eight) {//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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜