2010-03-16 27 views
11

Tôi có một trang nơi người dùng có thể chỉnh sửa nội dung khác nhau bằng cách sử dụng các nút và các lựa chọn kích hoạt cuộc gọi ajax. Đặc biệt, một hành động gây ra một url được gọi là từ xa, với một số dữ liệu và một yêu cầu 'đưa', mà (như tôi đang sử dụng một phụ trợ đường ray an toàn) kích hoạt hành động cập nhật của tôi. Tôi cũng có một nút xóa gọi cùng một url nhưng với yêu cầu 'xóa'. Cuộc gọi ajax 'cập nhật' hoạt động trong tất cả các trình duyệt nhưng trình duyệt 'xóa' không hoạt động trong IE. Tôi đã có một ký ức mơ hồ về việc gặp phải một cái gì đó như thế này trước đây ... bất cứ ai có thể làm sáng tỏ không? đây là cuộc gọi ajax của tôi:Vấn đề với jQuery.ajax với phương pháp 'xóa' tức là

//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); 
     } 
    });  
    } 

tôi đặt các cảnh báo trong thành công và lỗi trong ajax xóa chỉ để xem những gì sẽ xảy ra, và 'lỗi' một phần của cuộc gọi ajax được kích hoạt, nhưng không có lệnh gọi được thực hiện để BACK END (tôi biết điều này bằng cách xem các bản ghi máy chủ kết thúc của tôi). Vì vậy, nó không thành công trước khi nó thực hiện cuộc gọi. Tôi không thể giải thích tại sao - 'msg' tôi lấy lại từ khối lỗi bị trống.

Có ý tưởng nào không? Đây có phải là một vấn đề được biết đến? Tôi đã thử nghiệm nó trong ie6 và ie8 và nó không hoạt động trong cả hai.

cảm ơn - tối đa

EDIT - giải pháp - nhờ Nick Craver đã chỉ cho tôi đúng hướng.

Rails (và có thể các khung công tác khác?) nếu loại yêu cầu thực tế là chuỗi đó. Vì vậy, trong trường hợp của tôi, tôi đã thực hiện thay đổi này - hãy lưu ý tùy chọn 'dữ liệu' ':

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); 
     } 
    });  
    } 

Giờ đây, Rails sẽ coi đây là yêu cầu xóa, giữ lại hệ thống REST. Lý do ví dụ PUT của tôi làm việc chỉ vì trong trường hợp cụ thể này, IE rất vui khi gửi yêu cầu PUT, nhưng nó chính thức không hỗ trợ chúng, vì vậy tốt nhất nên làm điều này cho các yêu cầu PUT cũng như các yêu cầu DELETE.

+1

Bạn có thể thêm phiên bản IE vào thẻ câu hỏi của bạn –

+0

thanks !!!!!!!!! –

+0

điều này không hiệu quả đối với tôi, đưa ra một GET 404, là vì tôi có dataType: 'script'? Khi tôi xóa "dataType: 'script'", nó hoạt động tốt trên Chrome nhưng lại ngừng hoạt động trên IE9, mọi đề xuất? – KG2289

Trả lời

8

Hãy nhìn vào loại thuộc tính của bạn type:'delete'

jQuery documentation on type:

Các loại yêu cầu để thực hiện ("POST" hoặc "GET"), mặc định là "GET". Lưu ý: Các phương thức yêu cầu HTTP khác, chẳng hạn như PUT và DELETE, cũng có thể được sử dụng tại đây, nhưng chúng không được tất cả các trình duyệt hỗ trợ.

tôi thay vào đó sẽ cố gắng và bao gồm này với dữ liệu của bạn và tìm kiếm nó trên server-side, như thế này:

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

ah. bollocks. cảm ơn nick.Tôi đoán một suy nghĩ là theo thứ tự sau đó, có nghĩa là phá vỡ giản đồ yên tĩnh đáng yêu của tôi. : (grrrr. Bất cứ ai khác biết bất kỳ cách kỳ diệu để có được vòng này? –

+0

Umm thậm chí bạn đã xác minh rằng IE không hỗ trợ xóa như là phương thức yêu cầu http? AFAIK IE XHR Object hỗ trợ xóa quá, nhưng bạn có thể cần phải thay đổi 'type: 'delete'' thành' type:' DELETE'' – jitter

+0

@jitter - Nó không có ở đây, chỉ được thử nghiệm trong IE8, nhưng các công trình tương tự trong mọi trình duyệt khác, cố gắng tìm các ghi chú của jQuery mà liệt kê các kiểm tra trình duyệt ... có một danh sách đầy đủ tại một thời điểm –

13

IE 7 và 8 không hỗ trợ DELETE và PUT phương pháp. Tôi đã có một vấn đề mà IE7,8 sẽ không theo một chuyển hướng 302 và IE sẽ sử dụng phương pháp DELETE hoặc PUT cho vị trí mà nó được yêu cầu chuyển hướng đến (có được.)

Để đảm bảo IE7 và 8 hoạt động đúng, tôi sẽ sử dụng POST với thông số:

data: {'_method': 'delete'} 
Các vấn đề liên quan