2011-03-01 13 views
10

HTML5'in Dosya API'siyle çalışma, yükleme XMLHttpRequest'da upload adlı bir nesne aracılığıyla yapılır. This, üzerinde çalıştığım öğretmendir (ve şu andan beri Google cache mirror).jQuery, XMLHttpRequest'in yüklemesine eşdeğerdir?

// Uploading - for Firefox, Google Chrome and Safari 
xhr = new XMLHttpRequest(); 

// Update progress bar 
xhr.upload.addEventListener("progress", function (evt) { 

Eğer görebilirsiniz yükleme ilerlemeyi izlemek gelince, XMLHttpRequest nesne etkinliğine bir etkinlik ekleyebilir upload adında bir özellik vardır: Bu, ilgili kısmıdır.

Soruma ilişkin soru: , jQuery'e eşittir?. Microsoft'un iyi bir fikir olduğunu düşündüğü zaman (it will be in 2012 or 2013 gibi görünse de) kodu olabildiğince temiz ve çapraz tarayıcı uyumlu olarak bırakmaya çalışıyorum.

+0

Bir jQuery eklentisi mi arıyorsunuz, yoksa jQuery XHR sarıcısı bu işlevselliği destekleyip desteklemediğini öğrenmek mi istiyorsunuz? – justkt

+0

@justkt jQuery'de yerleşik bir seçenek arıyorum, eğer mümkün değilse, bir eklenti hoş olacaktır. Teşekkürler. – metrobalderas

+3

HTML5 ile zaten çalışıyorsanız, çapraz tarayıcı uyumluluğunu ciddi olarak düşünmüyorsunuz, bu yüzden sadece neyin işe yaradığını ve çalışan tarayıcılardan birini kullanmasını bildiren bir mesaja sahip olmanızı sağlayın. Aynı CSS3 için de geçerlidir. – Endophage

cevap

17

Konuyla ilgilenmek için geldim. $ .ajax() çağrısı, XHR'yi oluşturmak için bir geri arama yapılmasına izin verir. İsteği aramadan önce bir tane oluşturdum, ayarladıktan sonra $ .ajax() 'ın gerekeceği zaman geri dönmek için bir kapanış yaratıyorum. Eğer jqxhr yoluyla ona erişim verdiyseler çok daha kolay olurdu, ama yapmıyorlar.

var reader = new FileReader(); 

reader.onloadend = function (e) { 
    var xhr, provider; 

    xhr = jQuery.ajaxSettings.xhr(); 
    if (xhr.upload) { 
     xhr.upload.addEventListener('progress', function (e) { 
      // ... 
     }, false); 
    } 
    provider = function() { 
     return xhr; 
    }; 

    // Leave only the actual base64 component of the 'URL' 
    // Sending as binary ends up mangling the data somehow 
    // base64_decode() on the PHP side will return the valid file. 
    var data = e.target.result; 
    data = data.substr(data.indexOf('base64') + 7); 

    $.ajax({ 
     type: 'POST', 
     url: 'http://example.com/upload.php', 
     xhr: provider, 
     dataType: 'json', 
     success: function (data) { 
      // ... 
     }, 
     error: function() { 
      // ... 
     }, 
     data: { 
      name: file.name, 
      size: file.size, 
      type: file.type, 
      data: data, 
     } 
    }); 
}; 
reader.readAsDataURL(file); 
+0

Bu harika bir cevap, ancak veri kodu olarak kodlanmış base64'i biraz yanlış hissetmek zorunda kalıyorum ... ancak jQuery çekirdeğinde değilken çok yaratıcı bir çözüm. – metrobalderas

+1

İkili dizgiler saklanmaz -> Bu davranış, [bu yanıtta] açıklandığı gibi, belirtimden gerçekleştirilebilir (http://stackoverflow.com/a/10073841/938089?xmlhttprequest-multipart-related-post-with-xml -ve-görüntü olarak-yük). 'XMLHttpRequest.prototype.sendAsBinary' yöntemi, burada (http://stackoverflow.com/a/9250818/938089) ele alınmıştır. JQuery'de, 'xhr' ayarı ile önceki cevabı kullanarak' .send' yöntemini geçersiz kıl (bkz. [Bu cevap] (http://stackoverflow.com/q/4303448?how-to-override-jquerys-use- of-XMLHttpRequest-içinde-ajax)). –

1

jqXHR için documentation maruz kalmama anlamına gelmez, hangi maruz olarak güncelleme özelliğini açıklanmaz (jQuery'nin .ajax() çağrısı döndürülür XMLHttpRequest üst kümesidir). Bununla birlikte, This question, yüklemenin yüklenmediğini gösterir. Yanıt, yerel XMLHttpRequest nesnesine ulaşmanın bir yolunu sağlar.

jQuery 1.5'den önceki sürümlerde, XMLHttpRequest nesnesi doğrudan pozlandı ve böylece tarayıcının desteklediği herhangi bir özelliğe erişebilirsiniz. Bir sürükle ve bırak yükleyici oluşturmak için This tutorial sadece bunu yapar.

jquery html 5 file upload için yapılan bir arama, HTML 5 dosya API'sını kullanarak birden çok dosya yüklemek için this plugin görüntülerini getiriyor, ancak bu eklenti şu anda IE'de çalışmıyor. HTML 5'i kullanmak istemiyorsanız ve şimdi çapraz tarayıcıya sahip olmak istiyorsanız, jQuery eklenti sitesinde jQuery'ye bakabileceğiniz başka eklentiler de vardır.

İlgili konular