【问题标题】:Problem with jQuery.ajax with 'delete' method in ieIE 中带有“删除”方法的 jQuery.ajax 问题
【发布时间】:2010-03-16 17:55:01
【问题描述】:

我有一个页面,用户可以使用按钮编辑各种内容并选择触发 ajax 调用。特别是,一个操作会导致远程调用一个 url,其中包含一些数据和一个“放置”请求,这(因为我正在使用一个安静的 Rails 后端)触发我的更新操作。我还有一个删除按钮,它调用相同的 url 但带有“删除”请求。 '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 调用的“错误”部分,但没有对后端进行调用(我通过观看知道这一点我的后端服务器日志)。因此,它甚至在调用之前就失败了。我不知道为什么 - 我从错误块返回的“味精”是空白的。

有什么想法吗?这是一个已知问题吗?我在ie6和ie8都测试过,都不行。

谢谢 - 最大

编辑 - 解决方案 - 感谢 Nick Craver 为我指明了正确的方向。

Rails(可能还有其他框架?)对不支持的 put 和 delete 请求有一个诡计:参数“_method”(注意下划线)设置为“put”或“delete”的 post 请求将被视为实际的请求类型是那个字符串。所以,就我而言,我做了这个改变——注意“数据”选项:

   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 请求执行此操作。

【问题讨论】:

  • 能否在问题标签中添加IE版本
  • 这对我不起作用,给出了 GET 404,这是因为我有 dataType:'script' 吗?当我删除“dataType:'script'”时,它在 Chrome 上运行良好,但在 IE9 上再次停止运行,有什么建议吗?

标签: javascript jquery ajax internet-explorer


【解决方案1】:

IE 7 和 8 不支持 DELETE 和 PUT 方法。我遇到了一个问题,IE7,8 不会遵循 302 重定向,而 IE 会使用 DELETE 或 PUT 方法来定位它应该重定向到的位置(使用 get)。

为确保 IE7 和 8 正常工作,我会使用带有参数的 POST:

data: {'_method': 'delete'}

【讨论】:

    【解决方案2】:

    看看你的类型属性type:'delete'

    jQuery documentation on type:

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

    我会尝试将其包含在您的数据中并在服务器端查找它,如下所示:

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

    【讨论】:

    • 啊。胡说。谢谢尼克。我想重新思考是为了,这意味着打破我可爱的宁静模式。 :( grrrrr。其他人知道任何神奇的方法来解决这个问题吗?
    • 嗯,您是否验证过 IE 不支持删除作为 http 请求方法? AFAIK IE XHR 对象也支持删除。但您可能需要将type:'delete' 更改为type:'DELETE'
    • @jitter - 这里没有,只在 IE8 中测试过,但在其他所有浏览器中都一样,试图找到列出测试浏览器的 jQuery 开发说明......有一个完整的一次列出。
    • 检查修改的评论。如果我没记错的话,IE 不会将 XHR 中的所有方法的类型都大写
    • @Max - 只是为了好玩,试试type:'DELETE' 看看会发生什么。是的 jitter 刚找到旧的测试笔记,IE6 已经出 IE7 可能支持大写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    相关资源
    最近更新 更多