我有一个页面,用户可以在其中使用按钮编辑各种内容,并选择触发ajax调用的页面。特别是,一个操作导致一个带有一些数据和一个“ put”请求的远程调用url,(当我使用一个宁静的rails后端时)触发了我的更新操作。我还有一个删除按钮,该按钮调用相同的URL,但带有“删除”请求。“更新” ajax调用可在所有浏览器中使用,但“删除”功能不适用于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中对其进行了测试,但在任何一个中均不起作用。
谢谢-最大
编辑-解决方案-感谢Nick Craver为我指出了正确的方向。
Rails(也许还有其他框架?)对不支持的放置和删除请求有一个替代:将参数“ _method”(注意下划线)设置为“ put”或“ delete”的发布请求将被视为实际请求类型是那个字符串。因此,就我而言,我进行了更改-请注意“数据”选项:
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请求都这样做。
看看你的type属性 type:'delete'
type:'delete'
关于jQuery的文档类型:
发出请求的类型(“ POST”或“ GET”),默认为“ GET”。注意:其他HTTP请求方法(例如PUT和DELETE)也可以在此处使用,但并非所有浏览器都支持它们。
相反,我会尝试将其包含在您的数据中,然后在服务器端进行查找,如下所示:
data: {'action': 'delete'},