Проблема с jQuery.ajax с методом удаления в ie - PullRequest
11 голосов
/ 16 марта 2010

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

//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, но без вызоваСДЕЛАНО НА ЗАДНЕМ КОНЦЕ (я знаю это по просмотру логов моего сервера).Таким образом, он терпит неудачу, прежде чем он даже делает звонок.Я не могу понять, почему - сообщение, которое я получаю из блока ошибок, пустое.

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

спасибо - max

EDIT - решение - спасибо Nick Craver за то, что он указал мне правильное направление.

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

   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.

Ответы [ 2 ]

13 голосов
/ 27 апреля 2011

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

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

data: {'_method': 'delete'}
8 голосов
/ 16 марта 2010

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

jQuery документация по типу :

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

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

data: {'action': 'delete'},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...