eval函数在ajax帖子中不起作用

时间:2016-01-15 12:57:15

标签: javascript jquery json ajax eval

所以我使用ajax将序列化表单发布到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')'的错误? 在当地它工作得很好:(

Thanx求助

克里斯

3 个答案:

答案 0 :(得分:3)

您无需使用eval()。只需将dataType选项设置为'json',数据将通过jQuery在内部解析为对象

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

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

答案 1 :(得分:2)

我不知道为什么你需要那个地方的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);
    }
});

答案 2 :(得分:1)

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

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

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

eval用于评估代码,换句话说,它正在执行javascript而不是json。当eval返回一个对象时,它只是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表单的优点是你可以链接调用以获得干净的异步代码,而不是回调地狱和无限函数嵌套。