jquery ajax返回資料異常解決方案

來源:互聯網
上載者:User

新版小站的留言板中新加了一個頂樓的功能,不知道你用過了沒?

一開始,自己測試的時候貌似沒出現現在這個問題,具體問題下文分析,這裡先牢騷下。

今晚,閑著無聊,又惦記起前幾日發現的那個留言板IP轉物理地址無效的問題,故開啟網網站了點。 不料就點出了這個問題了:

點了頂之後,頁面木有任何反應,重新整理頁面後那個頂的操作確實是執行成功了。

初步分析,這個肯定是ajax返回,js木有進行正常的互動導致的。

開啟了chrome跟了下,發現ajax返回是成功的,只是傳回值怪怪的,如下

HTTP_RAW_POST_DATA = SUCCESS

理論上,執行成功需要返回 SUCCESS,這怎麼給返回了個 HTTP_RAW_POST_DATA = SUCCESS?不解。調整php頁面的返回方法都無濟於事,果斷又把問題歸結到js。

查看了,其它類似的js請求,發現傳回值都是正常的 SUCCESS ,只有我們的頂樓兄出現這個異常。

一開始跑去google HTTP_RAW_POST_DATA 是啥東東?大概瞭解了下,基本上就是php對非標準(針對php自己)的post資料格式,可以從 HTTP_RAW_POST_DATA 這裡取值,具體的自己去google吧。

有點兒頭緒了,估計是請求上出問題,之下是未修改前的程式碼片段:

 代碼如下 複製代碼

    $.ajax({
    type: "post", 
    url: "index.php?m=request&do=upMessage&id=" + id + "&rdn="+Math.random(),
    dataType: "text",
    success: function (d) { 
    switch($.trim(d)) {
    case "ERROR":
    alert("怎奈人品實在不行,出錯了...");
    break;
    case "SUCCESS": 
    $("#up_num_"+id).html(parseInt($("#up_num_"+id).html())+1);
    o.setAttribute("onclick", "javascript:void(0);");
    o.style.color = "#666";
    break;
    default: 
    break;
    } 
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
    alert(errorThrown); 
    }
    });


有木有看出什麼門道?

其實,一開始我也沒看出啥東東來呢,慚愧。。。

 代碼如下 複製代碼

    type: "post",
    url: "index.php?m=request&do=upMessage&id="+ id +"&rdn="+Math.random(),


拆分成

    type: "post",
    url: "index.php?m=request&do=upMessage&rdn="+Math.random(),
    data: "id="+ id,


OR

    type: "get",
    url: "index.php?m=request&do=upMessage&id="+ id +"&rdn="+Math.random(),


這樣就可以了,原因

其實就是使用jquery中的ajax方法去進行請求,如果使用的要求方法是post那麼你必須得post一個非空的data參數,否則就會報上面的那個錯誤!因為,所有post的資料都沒有那麼應該就胡亂post資料了,我這是胡亂說的,大概這個意思吧,深層原因自己google吧,我這就點到這了,但接著我如果使用中文又碰到問題了,中文返回為亂碼了,這裡自己不拿上成改了直接找到一個解決方案整理給大家。

ajax傳回值為中文時亂碼

 代碼如下 複製代碼

 伺服器端代碼:
/**
  * 非同步(返回json資料格式)(支援分頁)
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return
  * @throws AppException
  */
 public ActionForward queryErrorCodeRecordByPage(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  
  Integer currentpage = Integer.parseInt(request.getParameter("currentpage")) ;
  Integer pagesize = Integer.parseInt(request.getParameter("pagesize")) ;
  try
  {
   List ListByPage = this.errorCodeRecordFacade.queryErrorCodeRecordByPage(currentpage, pagesize);
   JSONArray json = JSONArray.fromObject(ListByPage);
   System.out.println("JSONArray資料---" + json.toString() );
   
   request.setCharacterEncoding("utf-8");  //這裡不設定編碼會有亂碼
         response.setContentType("text/html;charset=utf-8");
         response.setHeader("Cache-Control", "no-cache"); 
   PrintWriter out = response.getWriter();  //輸出中文,這一句一定要放到response.setContentType("text/html;charset=utf-8"),  response.setHeader("Cache-Control", "no-cache")後面,否則中文返回到頁面是亂碼 
   out.print(json.toString());
   out.flush();
   out.close();
  }
  catch (Exception e) {
   log.error("查詢資料出錯", e);
  }
  return null ;
 }


用戶端的代碼:

 代碼如下 複製代碼

//非同步 根據分頁來取錯誤碼曆史 資料
function search_errorCodeRecord(currentpage,pagesize)
   {
       $.ajax({
          async :true,
    url: "<%=request.getContextPath()%>/errorCodeRecord/queryErrorCodeRecordByPage.do",
    type: "post",
    data: { currentpage: currentpage, pagesize:pagesize}, 
  //  dataType : "json", //這裡已經定義資料格式
       contentType: "application/x-www-form-urlencoded; charset=utf-8",
    success:function(data) {
            alert(data);
     //  var json=eval('('+data+')');   // jquery調用時會檢測到,從而直接把返回格式當做json處理,所以再轉化會報錯。
       var json=eval(data);
      resolv_json(json) ;
     }
  });
     }
 
 
 //解析json數組,動態拼接到白色Div中
 function resolv_json(json)
 {
    for(var i=0;i<json.length;i++)
    {
      //  alert(json[i].boss_resultinfo);
     
      var operate_state = "新增了" ;
      if(json[i].operate_state  == "2" )
      {
   operate_state= "修改了"  ;
      }
      if(json[i].operate_state  == "3" )
      {
   operate_state= "刪除了"  ;
      }

      var p=$("<p></p>");
      var span1=$("<span></span>");
      var span2=$("<span></span>");
      var span3=$("<span></span>");
      var span4=$("<span></span>");
     
      var times = json[i].operate_time.time;
    //  alert(json[i].operate_time.time); //時間格式是個JSON對象
 //  alert(getLocalTime(times));
      span1.html(getLocalTime(times));
      span2.html(json[i].operate_people);
      span3.html(operate_state);
      span4.html(json[i].businessname +" 錯誤碼");
     
      p.append(span1).append(span2).append(span3).append(span4);
      $("#whiteDiv").append(p);
    }
 
 }
 
//時間戳記轉化為時間
function getLocalTime(nS) {
    return new Date(parseInt(nS)).toLocaleString().replace(/:d{1,2}$/,' ');
}


 <div  id="whiteDiv">

 </div>

總結如下:

1.  PrintWriter out = response.getWriter(); 一定要放在

request.setCharacterEncoding("utf-8");  response.setContentType("text/html;charset=utf-8");

編碼的後面(原因很簡單,你懂的。)


2.  jquery 加不加 content-type的參數 都不影響。

contentType: "application/x-www-form-urlencoded; charset=utf-8",

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.