Rails rails 3.2.2 和 jquery 的 ajax 请求问题

kenshin54 · March 07, 2012 · Last by z342526265 replied at October 11, 2012 · 5191 hits

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');
});

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

$.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 谢谢,学习啦。

You need to Sign in before reply, if you don't have an account, please Sign up first.