在ie浏览器中,使用'delete'方法的jQuery.ajax出现问题

11

我有一个页面,用户可以使用按钮和下拉菜单编辑各种内容,这些操作会触发ajax调用。特别地,一个动作会远程调用一个URL,附带一些数据和“put”请求,这将触发我的更新操作(因为我正在使用restful rails后端)。我还有一个删除按钮,它调用相同的URL但使用一个“delete”请求。在所有浏览器中,“update” ajax调用都有效,但“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调用的“错误”部分被触发,却没有任何后端调用(通过查看我的后端服务器日志来确认)。所以,在它发出调用之前就失败了。我想不出原因——从错误块返回的'msg'为空。

大家有什么想法吗?这是一个已知的问题吗?我已经在ie6和ie8中进行了测试,两者都无法工作。

谢谢 - Max

编辑 - 解决方案 - 感谢Nick Craver指导我找到正确的方向。

Rails(可能还有其他框架)对不支持的put和delete请求采用欺骗方式:使用参数“_method”(注意下划线)设置为'put'或'delete'的post请求将被视为实际请求类型为该字符串。因此,在我的情况下,我做了如下更改 - 注意'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 请求都这样处理。


1
请在你的问题标签中添加IE浏览器版本。 - Robert Koritnik
这对我没有起作用,返回 GET 404,这是因为我有 dataType:'script' 吗?当我删除 "dataType:'script'" 时,在 Chrome 上它运行得很好,但在 IE9 上又停止工作了,有什么建议吗? - k_ssup
2个回答

13

IE7和IE8不支持DELETE和PUT方法。我遇到一个问题,即在IE7、8中重定向的302无法被执行,IE会使用DELETE或PUT方法请求应该重定向到的位置(通过GET获取)。

为了确保IE7和8正常工作,我将使用POST方法和参数:

data: {'_method': 'delete'}

8

请检查您的类型属性type:'delete'

jQuery关于type的文档:

要发出的请求类型(“POST”或“GET”),默认为“GET”。注意:其他HTTP请求方法,例如PUT和DELETE,也可以在此处使用,但不是所有浏览器都支持。

相反,我建议将其与您的数据一起发送,并在服务器端查找,如下:

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

啊,该死。谢谢尼克。我想重新考虑一下,这意味着要破坏我的可爱的RESTful模式。:( 咕噜噜。还有其他人知道什么神奇的方法来解决这个问题吗? - Max Williams
你确定IE不支持HTTP请求方法中的delete吗?据我所知,IE的XHR对象也支持delete。但是你可能需要将"type:'delete'"更改为"type:'DELETE'"。 - jitter
@jitter - 这里测试不出来,只在IE8中测试过,但在其他所有浏览器中都有效,在尝试寻找列出已测试过浏览器的jQuery dev注释...曾经有一个完整列表。 - Nick Craver
检查修改的注释。如果我没记错,IE不会像应该做的那样将XHR中的类型大写为所有方法。 - jitter
4
@Max - 尝试使用 type:'DELETE',看看会发生什么。是的,Jitter刚刚找到了旧的测试笔记,IE6已经过时,IE7可能支持它大写。 - Nick Craver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接