2010-03-16 2 views
11

У меня есть страница, на которой пользователь может редактировать различные материалы с помощью кнопок и выбирать, которые вызывают вызовы ajax. В частности, одно действие приводит к тому, что URL-адрес должен называться удаленно, с некоторыми данными и запросом «put», который (поскольку я использую backend backend) запускает мое действие обновления. У меня также есть кнопка удаления, которая вызывает тот же URL-адрес, но с запросом «удалить». «Ajax» «update» работает во всех браузерах, но «delete» не работает в IE. У меня есть смутное воспоминание о том, что я встречаю нечто подобное раньше ... может ли кто-нибудь пролить свет? вот мои Ajax звонков:Проблема с jQuery.ajax с методом 'delete', т. Е.

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

Я поставил предупреждение в успехе и ошибках удаления, AJAX, чтобы посмотреть, что происходит, и «ошибка» часть вызова AJAX запускается, но без вызова, MADE TO THE BACK END (я знаю это, наблюдая за журналами моего заднего сервера). Таким образом, он терпит неудачу, прежде чем он даже сделает вызов. Я не могу понять, почему: «msg» я возвращаюсь из блока ошибок пустым.

Любые идеи кто-нибудь? Это известная проблема? Я тестировал его в ie6 и ie8, и он тоже не работает.

спасибо - не более

EDIT - решение - благодаря Нику Craver указал мне в правильном направлении.

Рельсы (и, возможно, другие фреймворки?) Имеют уловку для неподдерживаемых запросов на отправку и удаление: почтовый запрос с параметром «_method» (обратите внимание на подчеркивание), установленным на «put» или «delete», будет обрабатываться как если фактическим типом запроса была эта строка. Так, в моем случае, я сделал это изменение - обратите внимание на опцию «Данные» ':

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 теперь будет рассматривать это как если бы это был запрос удаления, сохранения системы REST. Причина, по которой мой пример PUT работал только потому, что в этом конкретном случае IE был рад отправить запрос PUT, но он официально не поддерживает их, поэтому лучше всего делать это для запросов PUT, а также для запросов DELETE.

+1

Можете ли вы добавить версию IE в свой тег вопроса –

+0

спасибо !!!!!!!!! –

+0

это не сработало для меня, дает GET 404, это потому, что у меня есть dataType: 'script'? Когда я удаляю «dataType:« script », он отлично работает на Chrome, но снова перестает работать на IE9, любые предложения? – KG2289

ответ

8

Посмотрите на свой атрибут типа type:'delete'

jQuery documentation on type:

Тип запроса, чтобы сделать ("POST" или "GET"), по умолчанию является "GET". Примечание. Другие методы запросов HTTP, такие как PUT и DELETE, также могут использоваться здесь, но они не поддерживаются всеми браузерами.

Я бы вместо того, чтобы попытаться включить это с вашими данными и искать его на стороне сервера, например:

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

ах. ерунда. спасибо ник.Я предполагаю, что в этом есть переосмысление, что означает нарушение моей прекрасной спокойной схемы. :(grrrr. Кто-нибудь еще знает какие-нибудь магические способы обойти это? –

+0

Умм вы даже подтвердили, что IE не поддерживает удаление в качестве метода HTTP-запроса? AFAIK IE XHR Object также поддерживает удаление, но вам может потребоваться изменить 'type: 'delete'' to' type:' DELETE'' – jitter

+0

@jitter - Это не здесь, только протестировано в IE8, но то же самое работает в каждом другом браузере, пытаясь найти заметки jQuery dev, в которых перечислены проверенные браузеры ... в какой-то момент был полный список. –

13

IE 7 и 8 не поддерживают DELETE и PUT методы. У меня была проблема, когда IE7.8 не будет следовать перенаправлению 302, и IE будет использовать метод DELETE или PUT для местоположения, на которое он должен был перенаправляться (с помощью get.)

Для обеспечения работы IE7 и 8 правильно, я бы использовал POST с параметрами:

data: {'_method': 'delete'} 
Смежные вопросы