jquery ajax Функция возврата
-
25-09-2019 - |
Вопрос
У меня есть эта функция, которая встраивает вспышку:
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;
}
Решение
Важный:
Забудьте о использовании 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, чтобы не только принять один параметр, но несколько и обрабатывать оба строки в одном.