2012-03-09 17 views
42

मेरे पास एक ऐसा पृष्ठ है जो किसी तृतीय पक्ष (समाचार फ़ीड) से एक स्क्रिप्ट लोड कर रहा है। स्क्रिप्ट के लिए src यूआरएल लोड अप (प्रति तीसरे पक्ष कोड) पर गतिशील रूप से असाइन किया गया है।स्क्रिप्ट पुनः लोड करने और फिर से निष्पादित करने के लिए कैसे मजबूर करें?

<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 से भरी हुई तो बनाता है और div1287 में समाचार फ़ीड से विभिन्न सामान, सुंदर स्वरूपण, आदि के साथ के साथ लोड तत्वों (ईद "div1287" http://oneBigHairyURL में पारित हो जाता है तो स्क्रिप्ट जानता है, जहां के लिए सामग्री लोड करें)।

एकमात्र समस्या यह है कि यह केवल एक बार लोड हो जाती है। मैं इसे हर सेकेंड में पुनः लोड करना चाहता हूं (और इस प्रकार नई सामग्री प्रदर्शित करता हूं)।

तो, मैंने सोचा था कि मैं यह कोशिश करेंगे:

<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 को साफ करता है, लेकिन कोई गतिशील रूप से निर्मित एचटीएमएल इसे करने के लिए पुनः लोड है।

कोई विचार क्या मैं गलत कर रहा हूं?

+0

मुझे नहीं पता कि ब्राउजर समझता है कि आप इसे जेएस डाउनलोड करना चाहते हैं, क्योंकि आप उसी यूआरएल को और अधिक लोड करने की कोशिश कर रहे हैं। यह शायद इसे वही देखता है और परेशान नहीं करता है। जब आप src: 'scrElement.src = 'http: // oneBigHairyURL को बदलते हैं तो कैशिंग तकनीक आज़माएं?v = 2 '; // ऑटो-वृद्धि इस मान ' –

+0

@ मैट के। हाँ, मुझे यह पोस्ट करना चाहिए था कि मैंने यह कोशिश की है, लेकिन इसका कोई फायदा नहीं हुआ है। क्षमा करें यह मूल पोस्ट का हिस्सा नहीं था। –

+0

@ जोनाथनएम मैं एक ही चीज़ पर फंस गया हूं, क्या आपको कोई समाधान मिला? संस्करण जोड़ना काम नहीं करता है। – Parth

उत्तर

44

स्क्रिप्ट के साथ (पुनः) लोड के साथ < हेड पर एक नया स्क्रिप्ट टैग जोड़ने के बारे में कैसे? नीचे कुछ:

<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> 

मुख्य बिंदु एक नया स्क्रिप्ट टैग डालने वाला है - आप बिना किसी परिणाम के पुराने को हटा सकते हैं। यदि आपके पास कैशिंग समस्याएं हैं तो आपको क्वेरी स्ट्रिंग में टाइमस्टैम्प जोड़ने की आवश्यकता हो सकती है।

+12

कैश की समस्याओं के लिए, सबसे अच्छी बात यह है कि यूआरएल 'हैलो.जेएस? कैशबस्टर =' + नई तिथि()। टाइमटाइम() ' –

+0

हा, सही, अच्छी कॉल – Kelly

+0

यह बहुत उपयोगी है। अच्छी तरह से केली किया। –

5

क्या आपने इसे डोम से हटाने का प्रयास किया है, फिर इसे फिर से डालने का प्रयास किया है?

मैंने अभी किया, यह काम नहीं करता है। हालांकि, एक नया स्क्रिप्ट टैग बनाना और मौजूदा स्क्रिप्ट टैग की सामग्री को कॉपी करना, फिर इसे जोड़ना, अच्छी तरह से काम करता है।

मेरी उदाहरण देखें 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); 

यदि आप स्क्रिप्ट हर बार है, जो मेरा मानना ​​है कि अपने मामले है बदलने के लिए उम्मीद यह काम नहीं करेगा। आपको केली के सुझाव का पालन करना चाहिए, बस पुराने स्क्रिप्ट टैग को हटाएं (केवल डीओएम स्लिम को रखने के लिए, यह परिणाम को प्रभावित नहीं करेगा) और उसी स्रोत के साथ एक नया स्क्रिप्ट टैग फिर से डालें, साथ ही कैशबस्टर।

26

यहां एक विधि है जो केली के समान है लेकिन उसी स्रोत के साथ किसी भी पूर्व-मौजूदा स्क्रिप्ट को हटा देगी, और jQuery का उपयोग करेगी।

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

ध्यान दें कि 'टाइप' विशेषता अब HTML के रूप में स्क्रिप्ट के लिए आवश्यक नहीं है। (http://www.w3.org/html/wg/drafts/html/master/scripting-1.html#the-script-element)

+1

ग्रेट !! यह बहुत सारी खोज के बाद मुझे बहुत मदद करता है। धन्यवाद। –

+0

आप नया जेएस जोड़ सकते हैं, लेकिन आप पुराने से छुटकारा नहीं पा सकते हैं। मूल स्क्रिप्ट से कोई श्रोताओं, इत्यादि अभी भी लाइव रहेंगे, भले ही आप अपना स्क्रिप्ट टैग हटा दें। – user984003

1

ल्यूक के जवाब देने के लिए छोटे ट्वीक,

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

और जैसे कि यह फोन,

relaodJs("myFile.js"); 

यह किसी भी पथ से संबंधित मुद्दों के लिए नहीं होगा।

+1

क्या यह शरीर के बजाय '.appendTo ('head') नहीं होना चाहिए? –

+0

@ जोनाथनएम हम आम तौर पर शरीर के अंत में हमारी लिपि रखते हैं। जब मैं इसे पोस्ट कर रहा था, यह मेरे लिए काम किया। मुझे लगता है कि यदि आवश्यक हो तो आप सिर में भी शामिल हो सकते हैं। –

संबंधित मुद्दे

 संबंधित मुद्दे