eval 函数在 ajax post 中不起作用

eval function not working in ajax post

所以我使用 ajax 到 post 序列化表单到 php 脚本,然后在成功时提醒返回的数据。 我的代码在我的本地环境中运行良好,但是上传后,eval() 函数把一切都搞砸了。

这是我的代码:

function post_that_shit(formIdToSerialize, postUrl) {
    var serializedData = $("#"+formIdToSerialize).serialize();
    var post_url = postUrl+".php";
    //alert(serializedData + "\n" + post_url);


    $.ajax({
        url: post_url,
        type: "POST",
        data: serializedData,
        success: function(data){
            data = eval('('+data+')' );
            console.log(data.msg);

            if(data.reload == 'yes'){
                window.location.reload();
            }
            if(data.relocate != 'no'){
                window.location.href = data.relocate;
                //alert(data.relocate);
            }
            if(data.msg != 'no'){
                $(".message").html(data.msg);
                //alert(data.msg);
            }

            //alert('relocate: '+data.relocate);
        }
    });


}

所以这很简单。 php 回显出一个 json 编码数组,如下所示:

 echo json_encode(array('msg' => $errors, 'relocate' => 'no'));

根据回显的内容,显示消息或重新定位用户。

为什么在线使用代码会出现SyntaxError: Unexpected token ')' 的错误? 在本地它工作得很好:(

感谢您的帮助

克里斯

您不需要使用 eval()。只需将 dataType 选项设置为 'json',数据将被 jQuery

内部解析为 object
$.ajax({
    url: post_url,
    type: "POST",
    dataType:'json',
    data: serializedData,
    success: function(data){
      console.log(typeof data); //  returns "object"

此外,在服务器上为 application/json 设置正确的内容类型 header 也有帮助

我不知道为什么你在那个地方需要 eval() 功能。这是一个错误的编码。您的解决方案是将数据类型设置为 JSON 并且 ajax 函数自动将其视为 json:

$.ajax({
    url: post_url,
    type: "POST",
    dataType: 'json',
    data: serializedData,
    success: function(data){
        console.log(data.msg);

        if(data.reload == 'yes'){
            window.location.reload();
        }
        if(data.relocate != 'no'){
            window.location.href = data.relocate;
            //alert(data.relocate);
        }
        if(data.msg != 'no'){
            $(".message").html(data.msg);
            //alert(data.msg);
        }

        //alert('relocate: '+data.relocate);
    }
});

首先,eval是邪恶的。不要使用它……永远不要!就像一颗准备引爆的炸弹

其次,解析 json 可以在 Javascript 中本地完成。不需要 eval.

您可以使用 JSON.parse,它将 return 您一个由包含 json 文本的字符串解析的对象。

eval用于计算代码,换句话说,它执行的是javascript而不是json。当 eval return 是一个对象时,它只是 JSON 作为 JavaScript 子集的副作用。换句话说,任何格式为 json 的字符串都可以计算为 JavaScript。但是JavaScript无法格式化为JSON。没有表示 DateFunction 和许多更复杂的对象。也就是说,当使用 eval 时,您实际上是在执行 JavaScript,这就是这里的大问题。它可能会在解析时执行具有潜在危险的代码 JSON 只需要将数据解析为数据结构,仅此而已。

关于 JSON 的更多信息:https://fr.wikipedia.org/wiki/JavaScript_Object_Notation

所以它允许任何人添加一些 javascript 然后通过你使用 eval 来执行。它可以允许某人在其他用户的浏览器上执行代码。例如,它可用于窃取密码或窃取任何其他方式无法访问的私人信息。

另一方面,

jQuery 允许您通过将 dataType 属性用作 'json' 来本地解析 json。像这样:

$.ajax({
    url: post_url,
    type: "POST",
    dataType: 'json',
    data: serializedData,
    success: function(data){
        console.log(data.msg);

或使用JSON.parse

$.ajax({
    url: post_url,
    type: "POST",
    data: serializedData,
    success: function(data){
        data = JSON.parse(data)
        console.log(data.msg);

也正如charlie指出的,我们自己解析JSON意味着我们必须将它包装在try catch中,因为如果json不是,解析可能会失败无效。

但使用 jQuery 为我们提供了一种轻松处理该问题的方法。

您可以像这样重写您的代码:

var req = $.ajax({
        url: post_url,
        type: "POST",
        dataType: 'json',
        data: serializedDate
});

req.done(function (data) {
  // Success
});

req.fail(function () {
  // Error something went wrong
});

使用 promise 形式的优点是您可以链接调用以获得干净的异步代码,而不是回调地狱和无限函数嵌套。