2009-07-31 14 views
1

Ich verwende dies in einer Rails App. und ich habe Code, der den Antworttyp auf Javascript ändert.Neuling: Was macht jQuery.ajaxSetup 'beforeSend'?

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) { 
     xhr.setRequestHeader("Accept", "text/javascript") 
    } 
}) 

Dies funktioniert gut, wenn ein Formular abgeschickt werden, aber es scheint nicht aufgerufen werden, wenn die JavaScript-Form von AJAX erzeugte Vorlage auf einen Link zu klicken (der Code weiter durch die Rails html-Responder gehen).

Wahrscheinlich eine einfache Lösung. Irgendwelche Ideen?

Antwort

0

Ich bin mir nicht sicher, was Sie mit "Javascript von AJAX generierten" meinen - ist es möglich, dass Sie ein Formular im DOM mit Javascript erstellen, dann eine regelmäßige Einreichung mit ihm durch einen Klick (über Javascript) a Taste? Wenn ja, dann wird es nicht über AJAX gesendet, sondern als normaler Post. Der beforeSend-Handler wird nur aufgerufen, wenn das Formular über AJAX gesendet wird. Ihr Einrichtungsaufruf fügt eine Standardfunktion vor dem Senden hinzu, die den Accept-Header so festlegt, dass JavaScript zurückgegeben wird. Dies gilt jedoch nur für Anforderungen, die über AJAX gesendet werden. Diese

ist, was eine AJAX-Vorlage wie folgt aussieht:

$.ajax({ 
    url: '/controller/action', 
    type: 'post', 
    dataType: 'json', 
    data: $('form').serialize(), // this gets the form data 
    success: function() { 
    }, 
    ... 
}); 

Dies ist eine Javascript-created Form und Einreichung (non-AJAX).

$('<form><input type="hidden" name="inp" value="somedata" /></form>') 
    .appendTo(document.body) 
    .submit(); 

oder (über einen Button-Klick)

$('form #submitButton').click(function() { 
    $('form').submit() 
}); 
3

Die XHR-Header Einstellung mit JQuery ist erforderlich, wenn Sie respond_to ... Format Blöcke verwenden Rails wollen. Prototype legt dies standardmäßig fest, aber Sie müssen es manuell in JQuery einstellen, da die Option format.js ausgeführt wird, wenn sich text/javascript im accept-Header befindet.

Sind Sie sicher, dass Ihre AJAX-Anfrage tatsächlich ausgelöst wird? Vielleicht ist Ihr Handler nicht angeschlossen und der Link sendet ein normales HTTP GET?