jQuery Ajax Post 提交时候分号带来的问题

前段时间在做无刷新提交评论时,遇到一个怪怪的问题一直无法解决,其实这个问题看起来很小,也就是在提交评论时,如果评论内容里面包括有;(分号) 时,哪么分号后面的内容将会无故的丢失。

我当时的写法:

1
2
3
4
5
6
7
8
$.ajax({
 url: '/user/post/comment/add/',
  type: Componsents.Settings.AJAX_TYPE,
   data:'id=' + Post.settings.ID + '&name=' + txtName.val()  + '&body=' + txtBody.val() + '&follow=' + follow+ '&url=' + encodeURI(txtUrl.val()) + '&email=' + txtEmail.val(),
 dataType:"json",
 success: function(state){
    }
});

这里 data 参数是像 GET 方法一样的写法,问题就在这里,组合成一长段时,在jQuery解析成 JSON 提交给服务器的时候会把分号后面的截断。这个问题以前做了哪么多还一直没有遇到过,所以哪天我觉得很奇怪,以为是python或者django在处理时候出的问题,但通过Firebug查看提交数据与换了几种方式提交,找出了问题确实是出在 Javascript 提交的时候。

于是我试着给 body 的内容做 escape 处理,但这样做问题就来了,这样处理过的数据到了 python 里面会出现中文乱码…麻烦,哪天试了好多种方式还是不得解,于是暂时搁置。

今天又试着去修正这个问题,突然想到jQueryajax提交的时候会不会有另外一种 data 格式以处理这种类似问题,于是再次看了看 关于 jquery ajax 的文档 (自从用熟悉以后很久都没看过它了)

果然它有提供 JSON 格式的 data 参数,这下就爽了,问题迎刃而解!

正确的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$.ajax({
 url: '/user/post/comment/add/',
  type: Componsents.Settings.AJAX_TYPE,
   data: {
     id: Post.settings.ID,
       name: txtName.val(),
        body: txtBody.val(),
        follow: follow,
     url: txtUrl.val(),
      email: txtEmail.val()
 },
    dataType:"json",
 success: function(state){
    }
});

总的来说,这个问题是因为我一直习惯了像 GET 一样组合 data 参数的写法而带来的问题,希望这篇文章能给有类似习惯的开发人员带来帮助。