2009-02-25 14 views
2

Diğer web sitesinde kullanılmak üzere tasarlanmış ve kendi web sitemden ek komut dosyaları yükleyen bir JavaScript aracı yazıyorum (temel olarak etki alanları arası sınırlamalar nedeniyle XHR anlamına gelmez). Şimdi başarısızlıklarla incelikle başa çıkmak istiyorum - eğer bir betik yüklenmezse, betiği alternatif bir sunucudan yüklemek istiyorum.Harici bir HTML kaynağının yüklenmesi, JavaScript’ten nasıl iptal edilir?

1. sunucunun bir hata döndürdüğü sunucu hatalarını ele almayı başardım, ancak aynı zamanda bir zaman aşımıyla uğraşmak istiyorum. 1. sunucunun yanıt vermesi çok uzun sürerse yükü iptal etmek ve alternate geçmek istiyorum.

Sahip olduğum sorun, alternatif sunucuya geçiş yapan bir yöntemi tetiklemek için bir zaman aşımı ayarlayabildiğim, ancak alternatif sunucudaki komut dosyası, tarayıcının kendisi orijinal isteğine göre zaman aşımına uğrayana kadar başarıyla yüklenememesidir - ihtiyaçlarım için çok uzun bir yol.

1. < komut dosyası> etiketi yüklenirken - yükleme işlemini iptal etmek ve alternatif sunucuya işaret eden ikinci bir < komut dosyası etiketi eklemek istiyorum.

Orijinal komut dosyasının src özniteliğini null olarak ayarlamayı denedim ve hatta etiketi removeNode() kullanarak HEAD öğesinden kaldırmayı denedim, ancak hiç bir etkisi olmadı.

Hepsi Firefox'ta denendi - Henüz IE'yi denemedim, ancak çözümün her ikisinde de çalışması gerekiyor. Önerileri duymak isterim.

cevap

2

Maalesef, etiketlerin isteğini iptal etmek mümkün değil. Tarihsel olarak tarayıcılar yalnızca bir istekte aynı anda 2 isteme izin verir, bu nedenle ikinci komut dosyasını başka bir sunucudan yüklemek mümkün olmalıdır.

Body.onload'dan önce betik yüklemesini başlatır mısınız? Normal bir sayfa yükleme için tarayıcı, komut dosyalarının belgeyi değiştirebildiğinden, devam etmeden önce her komut dosyasının yüklenmesini bekler. Komut, belgeyi değiştirmiyorsa, komut dosyası yüklendiğinde tarayıcının belgeyi oluşturmaya devam etmesi için erteleme özniteliğini kullanabilirsiniz.

jQuery benzer özellik üzerinde birkaç açık istekleri vardır: http://dev.jquery.com/ticket/1863 http://dev.jquery.com/ticket/3442

+0

İkinci senaryoyu yüklemeye çalışıyorum Aynı sunucudan (aynı ana bilgisayar adı zaten - yükü dengelenmiş, bu yüzden muhtemelen farklı bir sunucu). Bu, DOMReady ve HEAD öğesinden sonra gerçekleşir, dolayısıyla sayfa oluşturmayı geciktirmez.BTW "erteleme" sadece IE'de desteklenir. – Guss

+0

Birçok tarayıcıda aynı ana makine adına maksimum 2 eşzamanlı istek var. Bu, ikinci komut dosyasını yüklemenizi engelleyen şey olabilir - aynı ana bilgisayar adında bir resim veya başka bir şey yüklüyorsanız. Yük dengeleyicisini de kullanan yeni bir alt alan oluşturmayı deneyin. – gregers

+0

, işe yarayabilir gibi geliyor. Kontrol edeceğim! – Guss

0

Pencere öğenizi window.setTimeout() yöntemiyle iptal edilebilen XMLHttpRequest kullanacak şekilde yapılandırmak isteyebilirsiniz.

+0

Muhtemelen, ancak yukarıda belirtilen çapraz etki alanı sorunları nedeniyle bu uygun değil – Guss

+0

oh özledim - doğru yukarı orada/zaten zaten bu karar verdi .. tamam, boşver –

0

Eğer orada bir geri arama ekleyebilir yüklenmesinden dolayı komut dosyasını edin. Sayfanızın üst kısmındaki bir zamanlayıcı ayarlamanız ve komut dosyanızın alt kısmında temizlemeniz yeterlidir. Bu şekilde komut dosyanız düzgün yüklenmezse, zamanlayıcı bittiğinde yedekleme isteği yürütülür. senin Sayfanın üst kısmında

bir satır içi komut dosyası bloğunda aşağıdaki çalıştırın:

doneLoading = function() { 
    clearTimeout(timeout); 
} 

timeout = setTimeout(function() { 
      ... change the .src on the old inline script element here ... 
        }, 15000); 

harici JavaScript dosyası alt kısmında sadece doneLoading() diyoruz. İlk isteğiniz 15 saniyeden uzun sürerse, bir yedek sunucunun yeni bir isteği çalışır. İlk isteği iptal edeceğinizi sanmıyorum, ancak yedekleme isteği beklendiği gibi yürütülecek.

+0

Komut dosyası yüklenemediğinde veya yüklenemediğinde başa çıkabilirim, sorun, komut dosyasının yüklenmesi için zaman alırsa ne yapması gerektiğidir. Tarayıcı zaman aşımına uğramadan önce yedeklemeyi erken yapmak istiyorum. Üst sayfa gövdesinden – Guss

+0

setTimeout() çağrılır. Böylece zamanlayıcı sona erer ve ilk denemenin başarısız olmasına rağmen (ve ne zaman) yedekleme talebini başlatacaktır. – mustpax

İlgili konular