4

我正在尝试使用不显眼的 Javascript 在现有链接上触发附加的 ajax 查询。

查询将进入服务器并进行处理,返回字符串“javascript template ok”进行测试。

但是,永远不会调用 ajax“成功”函数。到位,触发的是“错误”功能......

我查看了 Chrome 调试器,我可以看到从服务器返回的响应文本,但从来没有调用“成功”方法...... :-(

我的电话是

jQuery.ajax({
    type: 'POST',

    success: function(response) {   
        $("#details").html(response);
        console.log(response);
    },
    error: function(){ 
        alert("Error\nData could not be retrieve from the server");
    },
    url: '/treeview/show/1538.js',
    cache: false,
});

(在此示例中,url 是硬编码的)。浏览器中的相同 Url 无需布局即可获得正确的数据 :-)

删除url中的“.js”返回带有布局的html模板,并且正确实现了“details”div的更新......

控制器是

    respond_to do |format|
      format.html # show.html.erb
      format.js   { render :inline => "JAVASCRIPT TEMPLATE !" }
    end

谢谢

编辑 :

这是从 ajax 查询返回的对象(错误的第一个参数: function(jqXHR) ):

Object
    abort: function ( statusText ) {
    always: function () {
    complete: function () {
    done: function () {
    error: function () {
    fail: function () {
    getAllResponseHeaders: function () {
    getResponseHeader: function ( key ) {
    overrideMimeType: function ( type ) {
    pipe: function ( /* fnDone, fnFail, fnProgress */ ) {
    progress: function () {
    promise: function ( obj ) {
    readyState: 4
    responseText: "JAVASCRIPT TEMPLATE !"
    setRequestHeader: function ( name, value ) {
    state: function () {
    status: 200
    statusCode: function ( map ) {
    statusText: "OK"
    success: function () {
    then: function ( /* fnDone, fnFail, fnProgress */ ) {
    __proto__: Object

所以我得到了正确的回复文本??!! 那么错误可能在哪里?:-s

4

6 回答 6

9

您没有明确指定dataType选项,jQuery.ajax因此 jQuery 推断它是script(依赖于 Rails 提供的 MIME 类型)。由于JAVASCRIPT TEMPLATE !不是有效的 Javascript 语句,因此会引发解析器错误。有两个选项可以success调用回调而不是error

明确指定dataTypetext

jQuery.ajax({
    type: 'POST',
    dataType: 'text',
    // ...
});

或者从控制器返回有效的 Javascript:

respond_to do |format|
  format.html # show.html.erb
  format.js { render :inline => "{}" }
end
于 2013-03-11T20:52:06.723 回答
1

您是否考虑过响应可能会被评估为 javascript 代码并因此引发被捕获的错误?

于 2013-03-11T14:00:37.627 回答
0

好的,我不确定这个,但也许其中一个有帮助:

使用done()andfail()而不是错误/成功。像这样:

$.ajax({ ...}).done(...).fail(...);

或者

尝试在成功/错误回调中使用正确的函数参数。也许 jQuery 不喜欢签名,因此不调用该函数?

于 2013-03-10T19:10:54.623 回答
0

在您的 ajax 调用中,添加

dataType: 'json',

并且,控制器

format.js   render :text => { :some_data => "JAVASCRIPT TEMPLATE !" }.to_json
于 2013-03-12T06:24:26.913 回答
0

编辑错误调用以将错误数据传递给 DOM:

error: function(data){ console.log(data); }

然后你会确切地看到正在发生的事情。

于 2013-03-15T17:46:33.107 回答
0

这是你应该做的:

$.post('/treeview/show/1538.js', function(response, data){
  $("#details").html(data.responseText);
}).error(function(){
  alert("Error\nData could not be retrieve from the server");
})

在您的控制器中可选

respond_to do |format|
  format.html # show.html.erb
  format.js   { render text: "JAVASCRIPT TEMPLATE !" }
end

尝试一下。

于 2013-03-16T15:31:50.197 回答