2012-04-15 15 views
2

Ich habe ein Problem beim Senden der Ajax-Anfrage. Wenn Sie auf den Link klicken, wird die Anfrage dreimal an den Server gesendet und die Antwort kam nicht.Rails Ajax Anfrage

Warum wird die Anfrage dreimal gesendet, um zu untergraben?

Wohin habe ich bei der Abfrageabfrage falsch geraten?

Code:

run.html.erb

... 
<%= link_to "Next", "#", :id => 'next', :class => 
... 

run.js.erb

(function(){ 

    $("#next").click(function(){ 

    $.ajax({ 
     type: 'POST', 
     url: '/engine/tff', 
     success: function(data){ 
     alert("ok"); 
     $("#question").html(data); 
     } 
    }); 


    return false; 
    }); 
}); 

Controller

def tff 
    respond_to do |format| 
     format.js render :text => "hello" 
    end 
end 
+0

Sie Standard der Klickaktion – apneadiving

+0

return false kümmern verhindern sollen, dass der sollte ... – DGM

Antwort

2

Ich vermute, das Click-Ereignis wird mehrere Male gebunden wahrscheinlich cos das Skript wird mehrmals aufgerufen. Nicht sicher, was der Grund für die mehreren Anrufe ist, da ich Schienen nicht kenne.

was Sie tun können, um dies zu vermeiden, lösen Sie das click -Ereignis, bevor Sie es binden, oder verwenden Sie die API.

function ajaxRequest(){ 
    $.ajax({ 
     type: 'POST', 
     url: '/engine/tff', 
     success: function(data){ 
     alert("ok"); 
     $("#question").html(data); 
     } 
    }); 
    return false; 
    } 

$("#next").unbind("click").bind("click",ajaxRequest);

oder

$(document).on("click","#next",ajaxRequest);

auch nicht sicher, ob Sie auf dem Dokument bereit zu binden versuchen, und es ist ein Tippfehler in Ihrem Code. aber es sollte so gewickelt werden:

$(function(){ 
    $("#next").click(ajaxRequest); 
}); 
1

Eine Sache, die ich in letzter Zeit lief war das versucht jquery Um das Ergebnis auszuführen, interpretiert der Standarddatentyp die .js als Skript, nicht als Text. Möglicherweise müssen Sie dem Ajax-Aufruf eine dataType: "text" hinzufügen. Ich sehe aber nicht, wie sich das in drei Anrufe übersetzt.

Ich dachte, die Rückgabe von false sollte verhindern, dass der Klick weitergeht, aber vielleicht ist es besser, preventDefault() als apneadiving zu verwenden.