我有一个页面,用户可以使用按钮和下拉菜单编辑各种内容,这些操作会触发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 请求都这样处理。