2009-10-06 16 views
10

मान लीजिए हम निम्न HTML फ़ाइल है:iframe में फ़ाइल डाउनलोड करते समय ऑनलोड ईवेंट को कैसे ट्रिगर करें?

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Test iframe download</title> 
<script type="text/javascript"> 

var init = 0; 

function download() { 
    document.getElementById("dload_frame").src = "http://example.com/dload.py"; 
} 

function alert() { 
    if (init == 0) { 
    init = 1; 
    } 
    else { 
    document.getElementById("alert_span").innerHTML = "Got it!"; 
    } 
} 

</script> 
</head> 
<body> 

    <span id="alert_span">Main content.</span><br/> 
    <input type="button" value="Download" id="btn" onclick="download()" /> 
    <iframe id="dload_frame" src="http://404.com/404" onload="alert()"> </iframe> 

</body> 
</html> 

अब, अगर वह URL जिससे iframe src के लिए फिर से लिखा जा रहा है (इस मामले में - "http://example.com/dload.py") रिटर्न एचटीएमएल, कोई समस्या नहीं: ऑनलोड घटना की आग, अवधि की सामग्री बदल दी जाती है, सभी खुश हैं।

हालांकि, अगर यूआरएल द्वारा लौटाई गई फाइल का सामग्री प्रकार कुछ ऐसा सेट है जो ब्राउजर को सेव फाइल डायलॉग खोलने के लिए मजबूर करता है, तो आईफ्रेम की ऑनलोड घटना कभी नहीं होती है।

कोई वैकल्पिक हल है? Iframes का उपयोग करना जरूरी नहीं है, वांछित व्यवहार ब्राउज़र के साथ आपूर्ति की गई फ़ाइल डाउनलोड करने के बाद कॉलबैक लॉन्च करना है।

+0

आप AJAX का उपयोग कर फ़ाइल लाने की कोशिश कर सकते हैं और फिर डेटा यूआरआई के साथ 'ए' टैग (लिंक) बना सकते हैं और उस पर क्लिक कर सकते हैं, लेकिन मैंने इसे बड़ी फ़ाइलों के साथ परीक्षण नहीं किया। – jcubic

उत्तर

1

मैं इस रूप में एक ही समस्या का सामना करना पड़ा: यहाँ मेरी काम के आसपास, कृपया देखें अगर यह के लिए काम करता है आप:

<script> 
function download(){ 
    var url = 'http://example.com/dload.py'; 
    var htm = '<iframe src="' + url +'" onload="downloadComplete()"></iframe>'; 
    document.getElementById('frameDiv').innerHTML = htm; 
} 
</script> 

<div style="display:none" id="frameDiv"> 
</div> 
<button onclick="download()">download file</button> 

जहां तक ​​मुझे याद है कि आईफ्रेम की ऑनलोड घटना केवल एक बार आग लगती है। src विशेषता के लिए कोई अन्य मान सेट करने से ऑनलोड ईवेंट फिर से आग लगने का कारण नहीं होगा।

+0

बहुत चालाक! धन्यवाद। यह क्रोम में काम नहीं करता है, लेकिन कम से कम फ़ायरफ़ॉक्स में यह काम करता है, और कई बार काम करता है, क्योंकि हर बार यह वास्तव में एक नया आईफ्रेम है जो ऑनलोड ईवेंट को फायर करता है, क्योंकि आप आंतरिक HTML को ओवरराइट करते हैं। – dpq

+0

मुझे खुशी है कि यह आपके लिए काम करता है, मैंने इसे क्रोम पर परीक्षण नहीं किया है। – jerjer

+0

यह एक समान मुद्दे के लिए काम करने के लिए दिखाई दिया - जब तक फायरबग चल रहा था। जब मैंने फायरबग के बिना फ़ायरफ़ॉक्स 2 या 3 में कोशिश की, अचानक अचानक लोड नहीं होगा।कोई भी जानता है कि अंतर कहां है? – justkt

-1

आप इस के लिए jQuery की मदद की जरूरत हो सकती उदाहरण के लिए आप यह कर सकते हैं:

$.get('http://example.com/dload.py',{},function(result){ 
    $('alert_span').html(result);//or some content 
}); 
+3

नहीं, यह काम नहीं करेगा। एक एसिंक्रोनस कॉल लौटाए गए मान को परिणाम चर में सहेज लेगा और इसे एक सेव डायलॉग खोलने के बजाय कॉलबैक फ़ंक्शन पर भेज देगा। – dpq

0

मुझे एक ही समस्या है, लोड होल्डर केवल सामग्री बदलते समय आग लगती है। अगर आप एक फाइल डाउनलोड करते हैं। अगर आप iframe पर फ़ाइल सामग्री मुद्रित करने के लिए HTTP शीर्षलेख हटाते हैं, तो ऑनलोड सही ढंग से आग लगती है।

+1

मैं HTTP शीर्षलेख को कैसे हटा सकता हूं और वेब ब्राउज़र में फ़ाइल डाउनलोड करने में सक्षम हूं? – anmarti

1

एफएफ यानी सफारी और क्रोम में काम करने के लिए कई अलग-अलग दृष्टिकोणों के बाद मेरा समाधान 2 कदम डाउनलोड नहीं था।

आईएसआरएएम बनाने के लिए मूल जेएस अनुरोध एक स्रोत को लोड करता है जो आमतौर पर पीडीएफ लोड करता है, हालांकि, अब स्रोत एक पृष्ठ को लोड करता है जिसमें इसके अंदर एक और आईफ्रेम है, जिसमें अब पीडीएफ का यूआरएल है। एचटीएमएल प्रतिक्रिया में मैं ऑनलोड को ट्रिगर करता हूं और एक कैचल सेटटाइमआउट फनसीटन जो window.parent.window.handlerfunction पर मेरी प्रतिक्रिया को कॉल करता है जो शीर्ष आईफ्रेम पर मेरा ऑनलोड होता। नतीजा एक पीडीएफ डाउनलोड है और हैंडलर फ़ंक्शन के शीर्ष स्तर के पैरेंट पर एक ट्रिगर जो ब्राउज़रों में काम करता है क्योंकि यह अब वास्तविक आईफ्रेम लोड का पता लगाने पर निर्भर नहीं है बल्कि समर्थित माता-पिता/बाल विंडो संबंधों पर निर्भर करता है।

आशा है कि यह मदद करता है कोई है जो भी था

0

अटक आप बार-बार जांच कर सकते हैं आइफ्रेम readyState संपत्ति कम समय के अंतराल के बाद यह पूरा हो जाता है जब तक।

function iframe_onload(iframe_id, js) { 
    var iframe = document.getElementById(iframe_id); 
    var iframeDoc = iframe.contentDocument || iframe.contentWindow.document; 

    if (iframeDoc.readyState == 'complete') { 
     eval(js) 
     return; 
    } 

    window.setTimeout('iframe_onload("' + iframe_id + '",`' + js + '`);', 100); 
} 
+0

मेरे पास PHP आधार डाउनलोड है और पहले फ्लश के बाद डेटा ब्राउज़र को भेज दिया जाता है और राज्य को पूर्ण रूप से चिह्नित किया जाता है, भले ही डाउनलोड अभी भी प्रगति पर है। – jcubic

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