2012-03-09 37 views
42

Üçüncü taraflardan bir komut dosyası yükleyen bir sayfam var (haber yayını). Komut dosyası için src URL'si, dinamik olarak yükleme sırasında (üçüncü taraf kodu başına) atanır.Komut dosyası nasıl yüklenir ve yeniden yüklenir?

<div id="div1287"> 
    <!-- dynamically-generated elements will go here. --> 
</div> 

<script id="script0348710783" type="javascript/text"> 
</script> 

<script type="javascript/text"> 
    document.getElementById('script0348710783').src='http://oneBigHairyURL'; 
</script> 

http://oneBigHairyURL yüklenen komut dosyası daha sonra oluşturur ve İd "div1287" http://oneBigHairyURL geçirilen (div1287 içine vs. oldukça biçimlendirme sahip haber beslemesinden çeşitli malzeme ile yükler elemanları böylece komut bilir nerelere içeriği yükle). Tek sorun şu ki, sadece bir kez yükler. Her n saniyede yeniden yüklenmesini (ve böylece yeni içerik göstermesini) isterim.

Uyarıyı almak
<div id="div1287"> 
    <!-- dynamically-generated elements will go here. --> 
</div> 

<script id="script0348710783" type="javascript/text"> 
</script> 

<script type="javascript/text"> 
    loadItUp=function() { 
     alert('loading...'); 
     var divElement = document.getElementById('div1287'); 
     var scrElement = document.getElementById('script0348710783'); 

     divElement.innerHTML=''; 
     scrElement.innerHTML=''; 
     scrElement.src=''; 
     scrElement.src='http://oneBigHairyURL'; 
     setTimeout(loadItUp, 10000); 
    }; 
    loadItUp(); 
</script> 

div temizler, ancak hiçbir dinamik olarak oluşturulan HTML kendisine yeniden yüklenir:

Yani, ben bu deneyin düşündüm.

yapıyorum yanlış fikrin var mı?

+0

Tarayıcı, aynı URL'yi tekrar tekrar yüklemeye çalıştığınız için js'yi tekrar indirmeyi istediğinizi anlıyor mu bilmiyorum. Muhtemelen aynı şekilde görür ve rahatsız etmez. src'yi değiştirdiğinizde bir önbellek tekniğini deneyin: scrElement.src = 'http: // oneBigHairyURL?v = 2' ; // bu değeri otomatik olarak artır. –

+0

@Matt K. Evet, bunu denediğimi bildirmeliydim, ama boşuna. Üzgünüm, asıl gönderinin parçası değildi. –

+0

@JonathanM Aynı şeyde sıkışıp kaldım, bir çözüm buldunuz mu? Ekleme sürümü çalışmıyor. – Parth

cevap

44

< başlığına> komut dosyasını yeniden yüklemek için yeni bir komut dosyası etiketi eklemeye ne dersiniz? Bir şey gibi aşağıda:

<script language="text/javascript"> 
    function load_js() 
    { 
     var head= document.getElementsByTagName('head')[0]; 
     var script= document.createElement('script'); 
     script.type= 'text/javascript'; 
     script.src= 'source_file.js'; 
     head.appendChild(script); 
    } 
    load_js(); 
</script> 

asıl amacı yeni komut dosyası etiketi ekleyerek - Eğer sonuç olmadan eskisini silebilirsiniz. Önbelleğe alma sorunları yaşıyorsanız sorgu dizesine bir zaman damgası eklemeniz gerekebilir.

+12

Önbellek sorunları için en iyi şey, url 'hello.js? Cachebuster = '+ new Date(). GetTime()' –

+0

için bir zaman damgası eklemektir. ha, doğru, iyi çağrı – Kelly

+0

Bu çok kullanışlı. Aferin Kelly. –

5

DOM'dan kaldırmayı denediniz mi, sonra tekrar takmayı denediniz mi?

Sadece yaptım, bu işe yaramıyor. Bununla birlikte, yeni bir komut dosyası etiketi oluşturup mevcut komut dosyası etiketinin içeriğini kopyalayıp, ekleyerek iyi çalışır.

benim örnek görün http://jsfiddle.net/mendesjuan/LPFYB/

var scriptTag = document.createElement('script'); 
scriptTag.innerText = "document.body.innerHTML += 'Here again ---<BR>';"; 
var head = document.getElementsByTagName('head')[0]; 
head.appendChild(scriptTag); 

setInterval(function() { 
    head.removeChild(scriptTag); 
    var newScriptTag = document.createElement('script'); 
    newScriptTag.innerText = scriptTag.innerText; 
    head.appendChild(newScriptTag); 
    scriptTag = newScriptTag;  
}, 1000); 

komut dosyası senin durumda olduğuna inanıyoruz, her zaman, değiştirmesini bekliyoruz, bu işe yaramaz. Kelly'nin önerisini takip etmelisiniz, eski betik etiketini kaldırmanız yeterlidir (yalnızca DOM'u ince tutmak için, sonucu etkilemez) ve aynı src ile yeni bir komut dosyası etiketini ve bir önbellek bozucusunu yeniden yerleştirin.

26

Burada Kelly'ninkine benzer bir yöntem var ancak aynı kaynakla önceden varolan bir betiği kaldıracak ve jQuery'yi kullanır.

<script> 
    function reload_js(src) { 
     $('script[src="' + src + '"]').remove(); 
     $('<script>').attr('src', src).appendTo('head'); 
    } 
    reload_js('source_file.js'); 
</script> 

'type' özelliğinin HTML5'ten itibaren komut dosyaları için artık gerekli olmadığını unutmayın. (http://www.w3.org/html/wg/drafts/html/master/scripting-1.html#the-script-element)

+1

Harika! Çok fazla arama yaptıktan sonra bana çok yardımcı oluyor. Teşekkürler. –

+0

Yeni JS ekleyebilirsiniz, ancak eskilerden kurtulabilirsiniz. Komut dosyası etiketini kaldırsanız bile, orijinal komut dosyasındaki tüm dinleyiciler vb. – user984003

1

Luke'un cevabı Küçük çimdik,

function reloadJs(src) { 
    src = $('script[src$="' + src + '"]').attr("src"); 
    $('script[src$="' + src + '"]').remove(); 
    $('<script/>').attr('src', src).appendTo('body'); 
} 

ve benzeri diyoruz,

relaodJs("myFile.js"); 

Bu, herhangi bir yol ile ilgili sorunları olmayacaktır.

+1

Bunu yapmak yerine .appendTo ('head') 'yerine vücut? –

+0

@JonathanM Genellikle komut dosyasını vücudun sonunda tutuyoruz. Bunu yayınlarken, bu benim için çalıştı. Gerekirse başınıza da ekleyebilirsiniz. –

İlgili konular