2015-06-18 17 views
6

tôi sử dụng để tạo ra XMLHttpRequestBlob từ dữ liệu URI sử dụng mã này:XHR + dữ liệu URI không hoạt động trong Safari

function dataUrlToBlob(dataUrl, callback) { 
    var xhr = new XMLHttpRequest; 
    xhr.open('GET', dataUrl); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function(e) { 
     callback(new Blob([this.response], {type: 'image/png'})); 
    }; 
    xhr.send(); 
} 

Cách sử dụng:

dataUrlToBlob('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=', callback); 

Tất cả mọi thứ hoạt động tốt ở mọi trình duyệt Safari trừ . Nó ném một lỗi như vậy:

[Error] XMLHttpRequest cannot load data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=. Cross origin requests are only supported for HTTP.

Câu hỏi đặt ra là, có cách nào để làm cho phương pháp này hoạt động trong Safari không?

+0

Bạn đã giải quyết vấn đề này chưa? Tôi đang đối mặt với cùng một vấn đề chính xác – Michiel

+0

Đối mặt với cùng một vấn đề chính xác ở đây. Rất muốn biết nếu bạn đã có thể để có được xung quanh này. –

Trả lời

-2

Tại sao bạn sử dụng XHR để làm điều đó? Chỉ cần thực hiện đồng bộ (câu trả lời từ here):

function dataURItoBlob(dataURI) { 
    if(typeof dataURI !== 'string'){ 
     throw new Error('Invalid argument: dataURI must be a string'); 
    } 
    dataURI = dataURI.split(','); 
    var type = dataURI[0].split(':')[1].split(';')[0], 
     byteString = atob(dataURI[1]), 
     byteStringLength = byteString.length, 
     arrayBuffer = new ArrayBuffer(byteStringLength), 
     intArray = new Uint8Array(arrayBuffer); 
    for (var i = 0; i < byteStringLength; i++) { 
     intArray[i] = byteString.charCodeAt(i); 
    } 
    return new Blob([intArray], { 
     type: type 
    }); 
} 
+0

Tôi biết điều đó. Nhưng không đồng bộ nhanh hơn. Đó không phải là câu hỏi ở đây. – artch

+0

@artch một chức năng không đồng bộ sẽ ** luôn luôn ** chậm hơn chức năng đồng bộ thực hiện tương tự. – idbehold

+2

Xin đừng bắt đầu giải thích về điều đó. Bạn không biết trường hợp sử dụng chính xác của chúng tôi, vì vậy nó chỉ là vô nghĩa. XHR có khả năng sử dụng nhiều lõi song song trên một số hệ thống, vì vậy trong nhiều môi trường hoạt động đồng thời, ** nhanh hơn nhiều so với xung đột đồng bộ sử dụng cùng một tiến trình JS (hoặc thậm chí sử dụng công nhân web, vì chúng có tin nhắn trên không). – artch

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