Javascript jQuery.ajax与';删除';ie中的方法
我有一个页面,用户可以使用触发ajax调用的按钮和选择来编辑各种内容。特别是,有一个操作会导致远程调用一个url,其中包含一些数据和一个“put”请求,这(当我使用RESTfulRails后端时)会触发我的更新操作。我还有一个删除按钮,它调用相同的url,但带有“删除”请求。“更新”ajax调用在所有浏览器中都有效,但“删除”调用在IE中不起作用。我有一个模糊的记忆,以前遇到过类似的事情……有人能解释一下吗?以下是我的ajax调用:Javascript jQuery.ajax与';删除';ie中的方法,javascript,jquery,ajax,internet-explorer,Javascript,Jquery,Ajax,Internet Explorer,我有一个页面,用户可以使用触发ajax调用的按钮和选择来编辑各种内容。特别是,有一个操作会导致远程调用一个url,其中包含一些数据和一个“put”请求,这(当我使用RESTfulRails后端时)会触发我的更新操作。我还有一个删除按钮,它调用相同的url,但带有“删除”请求。“更新”ajax调用在所有浏览器中都有效,但“删除”调用在IE中不起作用。我有一个模糊的记忆,以前遇到过类似的事情……有人能解释一下吗?以下是我的ajax调用: //update action - works in all
//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);
}
});
}
我将警报放在deleteajax中的success和error中,只是为了看看发生了什么,ajax调用的“error”部分被触发,但没有对后端进行调用(我通过查看后端服务器日志了解这一点)。所以,它甚至在打电话之前就失败了。我不知道为什么-我从错误块返回的“msg”是空的
有什么想法吗?这是一个已知的问题吗?我已经在ie6和ie8中进行了测试,但在这两个版本中都不起作用
谢谢-马克斯
编辑-解决方案-感谢Nick Craver为我指明了正确的方向
Rails(可能还有其他框架?)为不受支持的put和delete请求提供了一个借口:参数“\u 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'
:
请求的类型(“POST”或“GET”),默认为“GET”。注意:这里也可以使用其他HTTP请求方法,例如PUT和DELETE,但并非所有浏览器都支持它们
相反,我会尝试将其包含在您的数据中,并在服务器端查找,如下所示:
data: {'action': 'delete'},
IE 7和8不支持删除和放置方法。我遇到了一个问题,IE7,8不会遵循302重定向,IE会对它应该重定向到的位置使用DELETE或PUT方法(使用get) 为了确保IE7和IE8正常工作,我将使用带有以下参数的帖子:
data: {'_method': 'delete'}
啊。胡说。谢谢你,尼克。我想应该重新考虑一下,这意味着打破我可爱的restful模式(grrrr.还有谁知道解决这个问题的神奇方法吗?嗯,你甚至验证过IE不支持删除作为http请求方法吗?好吧,IE XHR对象也支持删除。但是你可能需要将
类型:'delete'
改为类型:'delete'
@jitter-这里没有,只在IE8中测试过,但在每个ot中都是一样的她的浏览器,试图找到列出测试浏览器的jQuery开发说明…有一个完整的列表。检查修改后的注释。如果我没记错的话,IE在XHR中所有方法的类型都没有大写should@Max-只是为了好玩,试着键入:'DELETE',看看会发生什么。是的,jitter刚刚找到了旧的测试编号tes,IE6出局了IE7可能支持大写。你能在你的问题标签中添加IE版本吗?这对我不起作用,给出了GET 404,这是因为我有数据类型:'script'?当我删除“数据类型:'script'”时,它在Chrome上工作得很好,但再次停止在IE9上工作,有什么建议吗?