Rails rails 3.2.2 和 jquery 的 ajax 请求问题

kenshin54 · 2012年03月07日 · 最后由 z342526265 回复于 2012年10月11日 · 4652 次阅读

jquery代码:

$("#replace").click(function(){
  $.get('/users/test', function(data){
    $("#t tbody").replaceWith(data);
  });
});

controller代码:

def test
  render :partial => "test"
end

我测试了rails 3.1.3,rails 3.2.0,rails 3.2.2

jquery的异步请求,datatype默认是自动检测的,在rails 3.1.3,rails 3.2.0和以前的版本,上面的代码都能正常执行,但是在rails 3.2.2中,chrome和firefox都会报错,chrome的错是Uncaught Error: HIERARCHY_REQUEST_ERR: DOM Exception 3,用console.log打印返回的data,是Document,不是字符串,jquery把response当成xml处理了。必须自己指定datatype为'text',才能正常执行。

修改后的jquery代码:

$("#replace").click(function(){
  $.get('/users/test', function(data){
    $("#t tbody").replaceWith(data);
  }, 'text');
});

不知道有没有人遇到同样的问题过?

共收到 10 条回复
$.get('/users/test', function(data){
  $("#t tbody").replaceWith(data);
}, 'text');

改成

$.get('/users/test', function(data){
  $("#t tbody").replaceWith(data);
}, 'html');

试试

#1楼 @ywencn 不是,如果不指定datatype会有问题,指定成text是好的,现在的问题是我们已经写了好多js的代码,如果没有别的办法,就要把js全部检查一般,把datatype加上。

看上去是 3.2.2 变严格了吧。加上 datatype 是好习惯,毕竟 ajax 请求 html , script, json 都是有可能的,服务端无法预设。

$("#t tbody").html(data); 这样不行么?

html,json,script等type都应该加上

还是检查了遍,全部加上了。

#6楼 @kenshin54 可以用beforeSend设定一个默认值

beforeSend: function(xhr, settings) {
    if ( settings.dataType == undefined ) {
      //....
    }
}

#7楼 @quakewang 谢谢 刚刚没想到 已经全部改掉了

以前读源码记得默认加了 'script‘……

@kenshin54 谢谢,学习啦。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册