2014-12-02 22 views
8

Mã sau hoạt động trong cả FireFox và Chrome, nhưng không hoạt động trên IE. Về cơ bản, tôi có một đối tượng JSON được chuyển đổi thành một mảng và sau đó thành định dạng csv, khi tôi nhấp vào nút trong FF hoặc Chrome, tệp được tải xuống hoặc mở cửa sổ Lưu dưới dạng, nhưng trong IE, tab mới sẽ mở ra . Trong một thế giới hoàn hảo, IE sẽ không tồn tại, nhưng trong thế giới thực, chúng ta phải làm cho nó hoạt động, lol.Tải xuống CSV động trong Internet Explorer

$("#csvbtn").click(function(e){ 
    e.preventDefault(); 
    var json_obj= JSON.parse(result); 
    var csv = JSON2CSV(json_obj); 
    window.open("data:text/csv;charset=utf-8," + escape(csv)); 
}); 

BTW, tôi đang sử dụng IE 11 trong cửa sổ 8 để kiểm tra điều này, nếu điều đó tạo sự khác biệt.

Cảm ơn tất cả!

+2

cho chiều rộng. 'window.open ('example.com', 'foo', 'width = 1000');' – epascarello

+0

Đây có phải là lỗi đánh máy ở đây hay bạn đã bỏ lỡ '$'? '(" #csvbtn ")' nên là '$ (" # csvbtn ")' hoặc 'jQuery (" # csvbtn ")'. Và giao diện điều khiển của bạn nói gì? Có lỗi gì không? – gearsdigital

+1

Trên thực tế, đó là 'foo' mà làm cho nó hoạt động ... window.open cần một windowname như tham số thứ hai. – rfornal

Trả lời

29

này được giải pháp của tôi trong trường hợp ai đó đang tìm kiếm một giải pháp. bây giờ nó làm việc với FF, Chrome, và IE

var csv = JSON2CSV(json_obj);    
var blob = new Blob([csv],{type: "text/csv;charset=utf-8;"}); 

if (navigator.msSaveBlob) { // IE 10+ 
navigator.msSaveBlob(blob, "csvname.csv") 
    } else { 
     var link = document.createElement("a"); 
     if (link.download !== undefined) { // feature detection 
      // Browsers that support HTML5 download attribute 
      var url = URL.createObjectURL(blob); 
      link.setAttribute("href", url); 
      link.setAttribute("download", "csvname.csv"); 
      link.style = "visibility:hidden"; 
      document.body.appendChild(link); 
      link.click(); 
      document.body.removeChild(link); 
     }   
    } 

Bây giờ tôi chỉ cần phải tìm ra nếu có một cách để có tiết kiệm như màn hình bật lên thay vì tự động lưu các tập tin. Nếu ai biết câu trả lời cho điều đó, hãy chia sẻ. Hiện tại, người dùng của tôi sẽ phải sử dụng chức năng này.

Cảm ơn tất cả vì tất cả các câu trả lời tuyệt vời, các bạn thật tuyệt vời.

+0

Làm việc cho tôi kể từ ngày 15/12/2016, cảm ơn! – Smoore

15

Internet Explorer không cho phép URI dữ liệu làm nội dung điều hướng, vì mục đích bảo mật. Để hiểu tại sao, tôi khuyến khích bạn đọc bài báo ngắn màu của Henning Klevjer về chủ đề, Phishing by data URI. Tóm lại, điều này đã được chứng minh để mở ra các con đường mà theo đó người dùng cuối có thể bị lừa để từ bỏ thông tin nhạy cảm.

Ngoài ra, từ data Protocol documentation on MSDN:

Vì lý do an ninh, các URI dữ liệu bị hạn chế tài nguyên đã tải. Không thể sử dụng URI dữ liệu để điều hướng, cho tập lệnh hoặc để điền các phần tử khung hoặc khung nội tuyến.

Thành thật mà nói, chuyển URI dữ liệu đến window.open cảm thấy hơi bị hack. Thay vào đó, bạn nên sử dụng một API để xử lý quá trình (được cung cấp một quá trình). Nếu bạn muốn tải tệp xuống máy của người dùng trong Internet Explorer, hãy xem xét sử dụng navigator.msSaveBlob hoặc navigator.msSaveOrOpenBlob.

Như một ví dụ, hãy xem xét những điều sau đây:

if (window.navigator.msSaveOrOpenBlob && window.Blob) { 
    var blob = new Blob([ "A,B\nC,D" ], { type: "text/csv" }); 
    navigator.msSaveOrOpenBlob(blob, "strings.csv"); 
} 
+0

Trong trường hợp đó, làm cách nào tôi có thể thực hiện việc tải xuống tệp csv động? Có một kỹ thuật khác mà tôi cần phải sử dụng hoặc là đây chỉ là một trong những trường hợp mà microsoft chỉ cần đặt một sửa chữa chăn cho tất cả các lỗ hổng của vấn đề ở bàn tay? – user2797021

+1

@ user2797021 Internet Explorer hỗ trợ một vài API để chuyển tải xuống cho người dùng; Tôi đã cập nhật câu trả lời của mình để bao gồm những câu trả lời này. – Sampson

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