2010-08-31 47 views
6

Vì một số lý do, IE yêu cầu chúng tôi tải xuống tệp thay vì chạy tệp đó dưới dạng ajax. Điều này làm việc trong tất cả các trình duyệt ngoại trừ IE. Tôi đã cố gắng rối tung với các tiêu đề mà nó trả về mà không có may mắn.Lỗi phản hồi Ajax và JSON trong Internet Explorer (hoạt động trong tất cả các trình duyệt khác)

Chức năng lấy dữ liệu biểu mẫu, sau đó đăng bài, câu trả lời là một mảng có thể là số lượng các mục cần cập nhật trên trang.

Giả sử của nó không được giả định là tệp giả sử của nó chỉ là phản hồi json.

PHP

header('Content-type: application/json'); 

$error = "The Email and Password you entered could not be resolved."; 
$elements[0]['target'] = '.error_report'; 
$elements[0]['action'] = 'inside'; 
$elements[0]['data'] = '<p>'.$error.'</p>'; 
$this->output->set_output(
    json_encode(array("elements" => $elements)) 
); 

Javascript

$(document).ready(function() { 
    jQuery.ajaxSetup({ 
     cache: false, 
     dataType: 'json', 
     error: function() { 
      alert("Request was not successful. Please try again shortly."); 
     } 
    }); 

    $(document).ajaxSuccess(function (e, xhr, settings) { 
     var response = xhr.responseText; 
     if (settings.dataType != 'json') { 
      return; 
     }; 

     try { 
      response = jQuery.parseJSON(response); 
     } catch (e) { 
      alert(e); 
      return; 
     } 

     if (response.elements instanceof Array) { 
      var reqs = ['target', 'action']; 
      var valid = true; 
      for (var i=0;i<response.elements.length;i++) { 
       var cur = response.elements[i]; 
       var sel; 

       for (var j=0;j<reqs.length;j++) { 
        if (typeof cur[reqs[j]] !== "string") { 
         valid = false; 
         break; 
        }; 
       }; 

       if (!valid) { 
        continue; 
       }; 

       sel = $(cur.target); 
       switch (cur.action) { 
        case "inside": 
         sel.html(cur.data); 
        break; 
        case "instead": 
         sel.replaceWith(cur.data); 
        break; 
        case "remove": 
         sel.remove(); 
        break; 
        case "refreshPage": 
         window.location.reload(); 
        default: 
         if (typeof sel[cur.action] === "function") { 
          sel[cur.action](cur.data); 
         }; // else continue 
        break; 
       }; 
      }; 
     }; 


      // Dispatch the AJAX request, and save it to the data object so that 
      // is can be referenced and cancelled if need be. 

      self.data('ajaxify.xhr', jQuery.ajax({ 
       url: this.action, 
       type: 'post', 
       dataType: options.dataType, 
       data: (beforeSubmitIsJquery ? beforeSubmitResult.serialize() 
              : self.serialize()), 
       success: function (/**/) { 
        cleanup(); 

        options.onSuccess.apply(that, arguments); 
       }, 
       error: function (/**/) { 
        cleanup(); 

        options.onError.apply(that, arguments); 
       }, 
       complete: function (/**/) { 
        options.onComplete.apply(that, arguments); 
       } 
      })); 
+0

Cố gắng đặt 'contentType' thành' application/json' trong yêu cầu '.ajax' của bạn. – BrunoLM

+0

Tôi muốn cung cấp 200 điểm cho một tiền thưởng cho điều này nhưng nó sẽ không cho phép tôi làm điều đó phụ hai ngày: ( – Walker

+0

Đã cố gắng thích ứng với loại nội dung: Nếu chúng ta chuyển từ tiêu đề sang văn bản thuần hoặc json nó tải một trang mới với phản hồi JSON trên nó - thay vì tải xuống câu trả lời giống như tiêu đề contentType (cả hai đều sai) – Walker

Trả lời

2

Vâng, tôi hỏi vì hành vi mà bạn mô tả có tất cả các điểm nổi bật của một đôi bài do một event handler tung ra một yêu cầu ajax tiếp theo là gửi biểu mẫu trình duyệt "gốc". Nếu tôi là bạn, tôi sẽ làm cho ba-thêm-chắc chắn rằng xử lý sự kiện của bạn hoặc là trở về "sai" hoặc gọi là "preventDefault", hoặc có thể cả hai :-) - Pointy 1 giờ trước

Theo dõi của tôi: Kể từ khi IE bỏ qua preventDefault, hãy thử sử dụng return false; sau khi ngăn chặnDefault ...

Để tham khảo sau này cho các nhà phát triển khác: cách mà các thư viện phổ biến có xu hướng làm điều này là họ thường mã một khối bằng cả hai phương thức (preventDefault() và return false;) vì điều này cho mỗi các trình duyệt chính ngừng hoạt động sự kiện, theo đó họ lắng nghe. Điều này quan trọng hơn với các trình duyệt IE cũ.

Dù sao, vui mừng chúng tôi có thể trợ giúp.

+0

Chỉ cần gặp sự cố nếu bạn có thể trợ giúp: Về cơ bản chúng tôi đã sửa lỗi bằng cách xóa loại = "gửi "từ nút gửi và sau đó trong javascript thiết lập nó để sống (" click "thay vì sống (" gửi "(mà dường như bị hỏng trong IE?) – Walker

+0

Oh người đàn ông, xin lỗi về điều đó, bạn bắt gặp tôi sau khi tôi rời công việc. .. Tôi sẽ nghĩ về điều này vào buổi sáng – jcolebrand

+0

Tôi nghĩ rằng bạn đã có nó lên đến một đầu vào gửi với một onclick rằng hủy bỏ và trả lại false Điều gì sẽ xảy ra khi bạn đặt nó trở lại như vậy? ~~~ Live chỉ hoạt động trong một số trình duyệt, IIRC. có một cách giải quyết mà tôi đã nghĩ khi Live không hoạt động, nhưng tôi đang chạy một chút sau sáng nay để không thể tra cứu chi tiết về điều đó.Tôi chắc chắn có thể xem trong khoảng 2 hoặc 3 giờ và đáp ứng sau đó. Hy vọng điều này sẽ giúp cho thời gian b eing. – jcolebrand

0

Tôi gặp sự cố này với ASP.NET MVC 4. Tôi đã trả về JSONResult. Nhưng bằng cách thay đổi đối tượng trả về thành this.content đã khắc phục vấn đề này.

[HttpPost] 
public ActionResult Upload(AddNewModel model) 
{ 
    /**...*/ 
    return this.Content(id.ToString()); 
} 

Vì vậy, dường như IE có vấn đề với đối tượng json được trả lại và có thể được sửa bằng cách trả về chuỗi.

Các vấn đề liên quan