代码之家  ›  专栏  ›  技术社区  ›  Max Williams

jquery.ajax在IE中使用“delete”方法时出现问题

  •  11
  • Max Williams  · 技术社区  · 16 年前

    我有一个页面,用户可以使用按钮编辑各种内容,并选择触发Ajax调用。特别是,一个操作会使用一些数据和一个“放置”请求远程调用一个URL,这会触发我的更新操作(因为我使用的是RESTfulRails后端)。我还有一个“删除”按钮,它调用同一个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);
          }
        });     
      }
    

    我在delete ajax中输入success和error来查看发生了什么,并触发了ajax调用的“错误”部分,但没有对后端进行调用(我通过查看后端服务器日志了解这一点)。所以,它甚至在打电话之前就失败了。我不知道为什么-我从错误块中得到的“msg”是空白的。

    有什么想法吗?这是已知问题吗?我已经在IE6和IE8中测试过了,但它也不适用。

    谢谢-麦克斯

    编辑-解决方案-感谢尼克·克雷弗给我指出了正确的方向。

    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现在将其视为一个删除请求,保留其余系统。我的Put示例之所以起作用,仅仅是因为在这个特定的情况下,ie很乐意发送一个Put请求,但它正式不支持它们,所以最好对Put请求和删除请求执行此操作。

    2 回复  |  直到 10 年前
        1
  •  8
  •   Dinei Ahmad Yones    10 年前

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

    jQuery documentation on type :

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

    相反,我会尝试将它与您的数据一起包含,并在服务器端查找它,如下所示:

    data: {'action': 'delete'},
    
        2
  •  13
  •   PeppyHeppy    14 年前

    IE 7和8不支持删除和放置方法。我遇到了一个问题,即IE7,8不遵循302重定向,并且IE将对它应该重定向到的位置使用delete或put方法(使用get)。

    为了确保IE7和8正常工作,我将使用带参数的post:

    data: {'_method': 'delete'}