【问题标题】:jQuery ajax function returnjQuery ajax 函数返回
【发布时间】:2010-08-04 16:01:36
【问题描述】:

我有这个嵌入flash的功能:

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

【问题讨论】:

  • 你的 PHP 文件在做什么?您的变量名称很难理解。为什么要设置 retdata = newmsg?你对返回的数据做了什么?请澄清,我们将能够提供更多帮助。谢谢!
  • 要么不返回全局变量retdata,在函数调用后赋值给变量,要么在decode函数内部定义retdata

标签: javascript jquery scripting decode


【解决方案1】:

重要:

忘记使用 Ajax 和编码、解码路径。你认为你从中得到了什么?安全?不会。可以看出这是 bas64 编码的,或者他只是监控网络流量并读取 Ajax 调用的响应。

做事

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

真的,您无法阻止其他人看到数据,只会让您的事情变得更复杂。

(或者你必须用 JavaScript 解密数据。)


原来的答案仍然正确

Ajax 是异步的,所以像var test = decode(s); 这样的东西永远不会工作。 decode 函数将在 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);
        }
    });
}

对于所有初学者来说,这似乎是一个非常普遍的问题。您会在这里找到很多与same problem 相关的问题。

更新:

这不是很好,但您可以将功能更改为

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:

为了完整起见,您可以使用async: false 使Ajax 调用同步。然后这将起作用:

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 脚本,使其不仅接受一个参数,而且接受多个参数,并一次处理两个字符串。

【讨论】:

  • 我试图解决这个问题:函数 embedSwf("flashgame",decode("=base64_encode($path['location'])?>"),decode("=base64_encode ($path['base_directory'])?>"),"800","600" ) {//do something} 这样我的文档中就不会真正看到任何 swf。我正在回显 swf 作为编码,我试图在使用函数 decode 解码后将数据传递给 javascript
  • @nevergone:请查看我的更新。您可以使调用同步,但它会冻结浏览器。测试它是否重要。
  • 我将创建自己的加密算法。这只是暂时的。我尝试了你在更新 #1 中所说的,但它不起作用。cb(data) 是什么?位置和目录的值在哪里更改为未编码?
  • @nevergone:即使使用您自己的加密算法,作为响应从服务器发送的数据也将是未加密的,并且可以被所有人读取。或者你必须在 JavaScript 中实现一个解密算法,然后你就不需要 Ajax。
  • @nevergone:我这里出错了,一​​定是:success:function(data){cb(data);}decode 函数中的值已“更改”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多