2012-07-17 137 views
0

我试图制作一个动态文档预览器。用户可以输入某些文档标题选项,并根据其帐户信息生成一个带有动态标题的文档。我最终希望预览完整的pdf,但我现在正在处理标题。发布数组缺少来自ajax请求的json

我想要做的是制作一个页面,用户可以填写表单,然后按下按钮预览标题。

$.ajaxSetup({ 
type:  'POST', 
timeout: 10000 
}); 

$("#preview_header").click(function(){ 
    var full_url = //appropriate URL 

    var preview_data = {  
     "wsid":    "default", 
     "page":    "default", 
     "banner_area1":  "default", 
     "banner_area2":  "default", 
     "banner_area3":  "default", 
     "uid":    "default", 
     "fid":    "default", 
     "cid":    "default", 
     "assignment_type": "default" 
    }; 

    preview_data.wsid    = $("#worksheet_picker").val(); 
    preview_data.page    = $("#page_picker").val(); 
    preview_data.banner_area1  = $("#banner_area1").val(); 
    preview_data.banner_area2  = $("#banner_area2").val(); 
    preview_data.banner_area3  = $("#banner_area3").val(); 
    preview_data.uid    = $("#member_uid").val(); 
    preview_data.fid    = $("#family_id").val(); 
    preview_data.assignment_type = 'family'; 
    preview_data.cid    = $("#class_id").val(); 

    var JSONText = JSON.stringify(preview_data); 
    alert('Full JSON - ' + JSONText); 

    $.ajax({ 
     async: true, 
     url: full_url, 
     data: { previewInfo : JSONText }, //Passes necessary form information 
     dataType: 'json', 
     success: function(output){ 
      var reply = output; 
      if (reply.status == "success"){ 
       $("#preview").attr("src", reply.image); 
      } else { 
       alert('Failed to create image preview of the assignment.'); 
      } 
     } 
    }); 
}); 

据我所知,上述方法工作正常。它击中正确的Codeigniter页面,当ajax方法设置为返回硬编码图像时,它工作得很好。阿贾克斯似乎得到了很好的格式,但万一这里是它输出,当我填写表格相应的值:

Full JSON - {"wsid":"4","page":"1","banner_area1":"link1", 
"banner_area2":"link2","banner_area3":"link3", 
"uid":"1","fid":"1","assignment_type":"family"} 

所以第一关,让我们先从什么是在相应的控制器方法工作的AJAX回复:

$data = array(
'status' => 'success', 
'image'  => //static image link 
); 

$this->output->set_content_type('text/javascript;charset=UTF-8'); 
echo json_encode($data); 

但每当我试图修改它,像这样:

$preview_data = json_decode($this->input->post('previewInfo')); 

//Got this one 
mail('[email protected]', 'Start Email', 'Some email'); 
//Empty email 
mail('[email protected]', 'Dump Post', var_dump($_POST)); 
//Empty email 
mail('[email protected]', 'Post data', var_dump($preview_data)); 
//returns an email with 1 for body 
mail('[email protected]', 'Post data', print_r($this->input->post())); 
//returns an email with 1 for body 
mail('[email protected]', 'Post data', 
    print_r($this->input->post('previewInfo'))); 
//returns an email with 1 for body 
mail('[email protected]', 'Post data', print_r($preview_data)); 

$data = array(
'status' => 'success', 
'image'  => //static image link 
); 

$this->output->set_content_type('text/javascript;charset=UTF-8'); 
echo json_encode($data); 

修改后的一个不要么返回静态数据。所以看起来post数组没有正确初始化。任何人都看到错误?

+1

'var_dump'只能输出到浏览器,除非使用输出缓冲。 'print_r'有第二个参数,允许你将返回值作为返回值返回,而不是返回给浏览器。 Anyhoo,因此,您的返回值不是有效的JSON,这可能会阻止您的Ajax成功回调正常工作。如果你也设置了'error'回调,它应该会因此而触发。根据@ Austin的建议,您应该使用Firebug或Chrome开发者工具来查看发送和接收的内容。 – Gavin 2012-07-19 14:23:29

回答

0

如果您想使用post方法发送Ajax请求,则需要在$.ajax选项中将type设置为POST

此外,默认情况下,async为true,因此不需要进行设置。另外,您应该考虑使用.done.fail,而不是successfail,因为它们很快就会被弃用。

像这样:

$.ajax({ 
    type: "POST", 
    url: full_url, 
    data: { previewInfo : JSONText }, //Passes necessary form information 
    dataType: 'json' 
}).done(function (output, textStatus, jqXHR) { 
    var reply = output; 
    if (reply.status == "success"){ 
     $("#preview").attr("src", reply.image); 
    } else { 
     alert('Failed to create image preview of the assignment.'); 
    } 
}).fail(function (jqXHR, textStatus, errorThrown) { 
    // now you have the XHR, text status, and error to debug with 
}); 
+0

我会尽量把它写出来,但我确实在顶部做了这个。抱歉不包括它:$ .ajaxSetup({类型:\t \t'POST',超时:\t 10000});. 谢谢你的建议。我会相应地更改我的代码。 – Zigu 2012-07-17 19:28:24

+0

另外,我非常确定ajax请求中的数据不是作为json字符串发送的,而是直接发送的,所以请尝试在服务器端抛开json_decode,看看会发生什么。 – Austin 2012-07-17 19:33:12

+0

行为没有变化:( – Zigu 2012-07-17 19:42:47

0

有两个问题导致的解决了这个问题:

1)

奥斯汀和Gavin说:的var_dump和print_r的不应该被输出到浏览器。 解决方案是使用Firefox扩展/ Chrome进行调试。

2)

$preview_data = json_decode($this->input->post('previewInfo')); 

改为

$preview_data = json_decode($this->input->post('previewInfo'), true); 

json_decode的secondy可选参数是告诉方法是否你期望关联对象或东西的清单。碰巧,我正在阅读并想要一个关联数组。