Soru Bir indirme işleminin ilerleyişini nasıl edinebilirim?


Örneğin, bir oyun yaratıyorum diyelim. Varlıkları yüklerken, tüm varlıkları yüklemek ve kullanıcıya bir ilerleme çubuğu sunmak olan küçük bir senaryom var.

Böyle bir varlık oyun mantığını içeren oldukça büyük bir betiktir. Belki 3 MB yukarı doğru.

İkinci komut dosyasının yükleme ilerlemesini kullanıcıya nasıl gösterebilirim?


21
2017-08-08 12:45


Menşei


Yakından alakalı: requirejs komut dosyası ilerlemesi ("RequrieJs, DOM'de yeni bir komut dosyası etiketi oluşturarak ve yük olayını dinleyerek modülü yükler. Başlangıç ​​ve son yükleme arasında güncelleme olayı yok.") - apsillers
Bu bir tarayıcı olayı, programcılar olarak bizim kontrolümüzde değil. Sadece tarayıcı yükleme işlemini tamamladığında ve JS dosyasını "derlerken" erişebildiğim için tek görebildiğim birkaç küçük dosya kullanıp aralarındaki mantığı ayırmaktır. - Shadow Wizard


Cevaplar:


<script> sadece ateş etiketleri load ve error olaylar; ateş etmiyorlar progress olaylar. Ancak, modern tarayıcılarda, Ajax istekleri yap destek progress olaylar. Komut dosyası içeriğinizi yükleyebilir ve Ajax üzerinden ilerlemeyi izleyebilir ve ardından komut içeriğini yeni bir yere yerleştirebilirsiniz. <script> yük tamamlandığında eleman:

var req = new XMLHttpRequest();

// report progress events
req.addEventListener("progress", function(event) {
    if (event.lengthComputable) {
        var percentComplete = event.loaded / event.total;
        // ...
    } else {
        // Unable to compute progress information since the total size is unknown
    }
}, false);

// load responseText into a new script element
req.addEventListener("load", function(event) {
    var e = event.target;
    var s = document.createElement("script");
    s.innerHTML = e.responseText;
    // or: s[s.innerText!=undefined?"innerText":"textContent"] = e.responseText
    document.documentElement.appendChild(s);

    s.addEventListener("load", function() {
        // this runs after the new script has been executed...
    });
}, false);

req.open("GET", "foo.js");
req.send();

Ajax'ı desteklemeyen eski tarayıcılar için progressilerlemeyi bildiren kullanıcı arayüzünü, yalnızca birinciden sonra bir yükleme çubuğu gösterecek şekilde oluşturabilirsiniz. progress etkinlik (ya da aksi halde, hayırsa genel bir çevirici gösteriniz) progress olaylar hiç ateşlenir).


28
2017-08-08 13:02





Bir göz atmak isteyebilirsiniz Ajax yanıtı için yükleme durumunu yüzde olarak nasıl gösterebilirim?

Bir AJAX indirme durumunu görmek için. Bir komut dosyası yüklediğinizden, dosyayı almanın en iyi yolu olmayabilir, ancak işe yarayabilir. Daha sonra, ajax çağrısı tarafından alınan içeriği yürütmek için bir yere koymanız gerekir ve eval önerilmez.


1
2017-08-08 12:51



Bu kabul edilebilir bir kullanım durumu gibi görünüyor eval. Tavsiye etmemek için gerçek bir sebebiniz var mı, yoksa sadece akılsızca mı söylüyorsunuz? - andrewrk
eval böyle şeyler yapmak için yapıldı. Sadece kez eval Gerekli olmadığında ya da büyük bir güvenlik riski olduğunda tavsiye edilmez. Bunun bir güvenlik riski oluşturabilmesinin tek yolu, ortadaki bir saldırı ya da güvenliği ihlal edilmiş bir sunucu olacaktır. eval. - h2ooooooo
GERÇEKTEN ihtiyacınız olmadıkça, her zaman değerlendirmeye başvurmadığım söylendi ... Yani haklı olabilirsiniz. Belki de bir script etiketi enjeksiyonu da yapılabilir, aynı JJ'nin yaptığı gibi, bunları kullanmamanın bir sebebi olmalı mı? - Salketer
Evet, bu değerlendirme için mükemmel kabul edilebilir bir durumdur. Her yerde kullanıcı girişi yok - Sadece güvendiğiniz programcı girişi :) Kendinize güvenmiyorsanız: p - Jon