Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript eval函数在ajax post中不起作用_Javascript_Jquery_Json_Ajax_Eval - Fatal编程技术网

Javascript eval函数在ajax post中不起作用

Javascript eval函数在ajax post中不起作用,javascript,jquery,json,ajax,eval,Javascript,Jquery,Json,Ajax,Eval,因此,我使用ajax将一个序列化表单发布到php脚本,然后在成功时对返回的数据发出警报。 我的代码在本地环境中运行良好,但是上传时,eval()函数会把一切都搞糟 这是我的密码: function post_that_shit(formIdToSerialize, postUrl) { var serializedData = $("#"+formIdToSerialize).serialize(); var post_url = postUrl+".php"; //al

因此,我使用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')错误? 在本地,它工作得很好:(

谢谢你的帮助


Chris

您不需要使用
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
设置正确的内容类型标题也有助于我不知道为什么需要在该位置使用
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
,它将返回一个由包含JSON文本的字符串解析的对象

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

以下是关于JSON的更多信息:

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

另一方面,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表单的优点是,您可以链接调用以获得干净的异步代码,而不是回调地狱和无限函数嵌套。

我不明白为什么您需要使用此eval。难道您不能直接使用
数据吗?@DeblatonJean-Philippe显然有人误导他,认为eval很酷。优势在于让jQuery这样做的好处是您不必自己捕获解析错误。如果存在解析错误,它将触发处理回调的ajax错误并拒绝返回的错误promise@charlietfl我很清楚这一点。感谢您的回复,我收到了一个JSON解析错误:使用dataType='JSON'时出现意外的EOF,因此我的JSON是代码有点错误吗?@Chris显然是的。你能把你收到的实际数据粘贴到问题中吗。当你使用PHP时,确保你没有重复任何其他内容。好的,谢谢你的帮助,我发现,在我的PHP中,我检查输入字段的方式不知怎么地混淆了子对象。所以在重新构造检查之后在这个过程中,它现在就像一个符咒,谢谢你们