2010-03-16 11 views
11

Ich habe eine Seite, wo der Benutzer verschiedene Inhalte mit den Tasten bearbeiten kann und wählt, dass Ajax Anrufe auslösen. Insbesondere bewirkt eine Aktion, dass eine URL remote aufgerufen wird, mit einigen Daten und einer "put" -Anforderung, die (wie ich ein ruhiges Rails-Backend verwende) meine Aktualisierungsaktion auslöst. Ich habe auch eine Schaltfläche zum Löschen, die die gleiche URL aber mit einer 'Löschen' Anfrage aufruft. Der "Update" -Ajax-Aufruf funktioniert in allen Browsern, aber der "Löschen" -Anruf funktioniert nicht in IE. Ich habe eine vage Erinnerung daran, dass ich auf so etwas gestoßen bin ... kann jemand Licht ausstrahlen? hier ist meine Ajax-Aufrufe:Problem mit jQuery.ajax mit 'löschen' Methode in ie

//update action - works in all browsers 
jQuery.ajax({ 
    async:true, 
    data:data, 
    dataType:'script', 
    type:'put', 
    url:"/quizzes/"+quizId+"/quiz_questions/"+quizQuestionId, 
    success: function(msg){ 
    initializeQuizQuestions(); 
    setPublishButtonStatus(); 
    } 
}); 



//delete action - fails in ie 
    function deleteQuizQuestion(quizQuestionId, quizId){ 
    //send ajax call to back end to change the difficulty of the quiz question 
    //back end will then refresh the relevant parts of the page (progress bars, flashes, quiz status) 
    jQuery.ajax({ 
     async:true, 
     dataType:'script', 
     type:'delete', 
     url:"/quizzes/"+quizId+"/quiz_questions/"+quizQuestionId, 
     success: function(msg){ 
     alert("success"); 
     initializeQuizQuestions(); 
     setSelectStatus(quizQuestionId, true); 
     jQuery("tr[id*='quiz_question_"+quizQuestionId+"']").removeClass('selected');   
     }, 
     error: function(msg){ 
     alert("error:" + msg); 
     } 
    });  
    } 

ich die Warnungen in Erfolg und Fehler in der Lösch Ajax setzen nur um zu sehen, was passiert, und die ‚Fehler‘ Teil des Ajax-Aufruf ausgelöst, aber ohne CALL-Verweisungen auf THE BACK END (Ich weiß das, indem ich meine Backend-Server-Logs anschaue). Also, es schlägt fehl, bevor es überhaupt den Anruf macht. Ich kann nicht herausfinden, warum - die 'msg', die ich vom Fehlerblock zurückbekomme, ist leer.

Irgendwelche Ideen jemand? Ist das ein bekanntes Problem? Ich habe es in ie6 und ie8 getestet und es funktioniert auch nicht in beiden.

Dank - max

EDIT - die Lösung - dank Nick Craver für mich in der richtigen Richtung.

Rails (und vielleicht andere Frameworks?) Hat eine Täuschung für die nicht unterstützten Put- und Delete-Requests: eine Post-Anfrage mit dem Parameter "_method" (Unterstrich beachten) wird auf 'put' oder 'delete' gesetzt wenn der tatsächliche Anforderungstyp diese Zeichenfolge war. Also, in meinem Fall habe ich diese Änderung - beachten Sie die ‚data‘ Option ':

jQuery.ajax({ 
     async:true, 
     data: {"_method":"delete"}, 
     dataType:'script', 
     type:'post', 
     url:"/quizzes/"+quizId+"/quiz_questions/"+quizQuestionId, 
     success: function(msg){ 
     alert("success"); 
     initializeQuizQuestions(); 
     setSelectStatus(quizQuestionId, true); 
     jQuery("tr[id*='quiz_question_"+quizQuestionId+"']").removeClass('selected');   
     }, 
     error: function(msg){ 
     alert("error:" + msg); 
     } 
    });  
    } 

Rails wird dies jetzt behandeln, als ob es sich um eine Löschanfrage waren, das System REST erhalten. Der Grund, warum mein PUT-Beispiel funktionierte, war, dass IE in diesem speziellen Fall gerne eine PUT-Anfrage gesendet hat, aber offiziell nicht unterstützt. Daher ist es am besten, dies sowohl für PUT-Anfragen als auch für DELETE-Anfragen zu tun.

+1

können Sie bitte IE-Version in Ihrem Frage-Tag –

+0

dank !!!!!!!!! –

+0

das hat nicht für mich funktioniert, gibt ein GET 404, ist das, weil ich dataType: 'script' habe? Wenn ich "dataType: 'script'" entferne, funktioniert es zwar in Chrome, funktioniert aber nicht mehr auf IE9, irgendwelche Vorschläge? – KG2289

Antwort

8

Werfen Sie einen Blick auf Ihrem type-Attribut type:'delete'

jQuery documentation on type:

Die Art der Anfrage zu machen ("POST" oder "GET"), Standard ist "GET". Hinweis: Andere HTTP-Anforderungsmethoden wie PUT und DELETE können hier ebenfalls verwendet werden, sie werden jedoch nicht von allen Browsern unterstützt.

würde ich stattdessen versuchen, und fügen Sie diese mit Ihren Daten und sucht es auf der Server-Seite, wie folgt aus:

data: {'action': 'delete'}, 
+0

ah. Böckchen. Danke Nick.Ich denke, ein Umdenken ist dann in Ordnung, was bedeutet, dass ich mein schönes, erholsames Schema durchbrich. :(grrrr. Wer kennt noch irgendwelche magischen Möglichkeiten, um dies zu umgehen? –

+0

Umm haben Sie sogar überprüft, dass IE nicht unterstützt als http-Methode löschen? AFAIK das IE XHR-Objekt unterstützt auch löschen. aber Sie müssen möglicherweise ändern 'type: 'delete'' zu' type:' DELETE'' – jitter

+0

@jitter - Es ist nicht hier, nur in IE8 getestet, aber das gleiche funktioniert in jedem anderen Browser, versucht, die jQuery-Entwickler-Notizen zu finden, die die getesteten aufgelistet Browser ... es gab eine vollständige Liste an einem Punkt. –

13

IE 7 und 8 lösche und PUT Methoden nicht unterstützen. Ich hatte ein Problem, wo IE7,8 nicht einem 302 Redirect folgen würde und IE würde die DELETE oder PUT Methode für den Ort verwenden, an den es umgeleitet werden sollte (mit einem Get.)

Um sicherzustellen, dass IE7 und 8 arbeiten richtig, werde ich eine POST mit den Parametern verwenden:

data: {'_method': 'delete'}