Возврат ajax-функции jQuery - PullRequest
       6

Возврат ajax-функции jQuery

1 голос
/ 04 августа 2010

У меня есть эта функция, которая встраивает вспышку:

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

И я хочу вызвать такую ​​функцию

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

Идея состоит в том, что всякий раз, когда кто-то ищет какой-нибудь swf на моем сайте, он не находит ничего чистого. Я изменю алгоритм кодирования, но это только временно. Чтобы эта функция работала, всякий раз, когда я вызываю функцию «декодировать», она должна возвращать одно значение. PHP содержит

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

Я попробовал это, но все равно не будет работать

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

1 Ответ

4 голосов
/ 04 августа 2010

Важно:

Забудьте об использовании Ajax и кодировании, расшифровывая путь. Как вы думаете, что вы получаете от этого? Безопасность? Нет. Можно выяснить, что это кодировка bas64, или он просто отслеживает сетевой трафик и читает ответ от Ajax-вызова.

Просто сделай

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

Действительно, вы не можете запретить кому-либо видеть данные и просто усложняете для вас вещи.

( Или вам необходимо расшифровать данные с помощью JavaScript. )


( оригинальный ответ все же правильный, тем не менее )

Ajax является асинхронным, поэтому что-то вроде var test = decode(s); никогда не будет работать. Функция декодирования вернет до того, как вызов Ajax завершится.

Вместо этого поместите свою логику в обработчик обратного вызова. Например, если ваш код был таким раньше:

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

поместите код в функцию и вызовите его из обработчика успеха:

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

Это, кажется, очень распространенная проблема для всех начинающих. Здесь вы найдете много вопросов, касающихся той же проблемы .

Обновление:

Это нехорошо, но вы можете изменить функцию на

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

и сделать

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

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

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

    });

});

Обновление 2:

Для полноты вы можете сделать синхронный вызов Ajax, используя async: false. Тогда это будет работать:

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

Однако это заблокирует браузер до завершения вызова Ajax. Вы должны проверить, имеет ли это значение в вашем случае или нет.

Обновление 3:

Вы также можете изменить свой PHP-скрипт, чтобы он принимал не только один параметр, но несколько, и обрабатывал обе строки за один раз.

...