2011-05-26 11 views
8

के साथ वादे करता हूं मैं jQuery में नई (आईएसएच) स्थगित वस्तु की जांच कर रहा हूं और मैं इस वेबसाइट आलेख here पर ठोकर खा रहा हूं।jquery defer और getScript

लेख में कुछ कोड स्क्रिप्ट को कैश करने के लिए डिज़ाइन किए गए हैं ताकि उन्हें एक से अधिक बार अनुरोध नहीं किया जा सके।

var cachedScriptPromises = {}; 

    $.cachedGetScript = function(url, callback) { 
     if (!cachedScriptPromises[ url ]) { 
      cachedScriptPromises[ url ] = $.Deferred(function(defer) { 
       $.getScript(url).then(defer.resolve, defer.reject); 
      }).promise(); 
     } 
     return cachedScriptPromises[ url ].done(callback); 
    }; 

// You would then call it like thus. 
$.cachedGetScript(url).then(successCallback, errorCallback); 

क्या यह मेरे लिए की तरह दिखाई देता लिए सुनिश्चित करें कि अपनी स्क्रिप्ट अगर आपके $.getScript() सफल रहा था केवल निष्पादित हो जाएगा एक तरीका था।

जहां तक ​​मेरे प्रयोग चले गए हैं, हालांकि त्रुटि कॉलबैक कभी भी कॉल नहीं किया जाता है, भले ही मैं गलत यूआरएल प्रदान करता हूं।

क्या मुझे कुछ स्पष्ट याद आया है या कोड नमूना गलत है?

नोट: मैंने इस प्रश्न को साइट पर पूछा होगा लेकिन टिप्पणी प्रणाली काम नहीं कर सका। : -एस

उत्तर

4

मुझे पूरा यकीन है कि वह स्क्रिप्ट क्रॉस-डोमेन अनुरोधों पर काम नहीं कर सकती है।

$.getScript स्थानीय और क्रॉस-डोमेन अनुरोधों के विभिन्न तरीकों से काम करता है। स्थानीय अनुरोधों के लिए, यह AJAX के माध्यम से सामग्री लोड करता है और फिर इसे चलाता है। चूंकि यह एक सामान्य AJAX ऑपरेशन है, इसलिए सामान्य तरीके से त्रुटियां होती हैं। वह कोड ठीक काम करता है, जहां तक ​​मैं इसका परीक्षण कर सकता हूं।

क्रॉस-डोमेन अनुरोधों के लिए, हालांकि, यह दस्तावेज़ में script टैग डालने से काम करता है। error हैंडलर को script तत्वों के लिए कभी भी निकाल दिया नहीं जाता है, इसलिए आपके error कॉलबैक कभी नहीं आग लगेंगे।

+0

एक बहुत शर्म की बात है कि। अंतर्दृष्टि के लिए धन्यवाद। –

+0

यह इस बात पर निर्भर करता है कि '.getScript' दोनों के पास [सीओआरएस] (http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing) और स्क्रिप्ट टैग इंजेक्शन देने के लिए समर्थन है या नहीं। यहां तक ​​कि उत्तरार्द्ध भी स्थगित करने का समर्थन करने में सक्षम हो सकता है लेकिन क्या यह वर्तमान में करता है या नहीं, मुझे नहीं पता। – hippietrail

+0

@lonesomeday, क्या आप वाकई स्थानीय अनुरोध के लिए AJAX के माध्यम से चलेंगे? यदि ऐसा है तो स्थानीय स्क्रिप्ट के लिए $ .ajax को कॉल करते समय, यह केवल डेटा देता है लेकिन इसे निष्पादित नहीं करता है? – adardesign

0

लेकिन ... आप रिमोट यूआरएल चेक को एक (उदा।) Php फ़ाइल में प्रतिनिधि दे सकते हैं।

  checkremotefile: function(remotefile, options) { 
       options = $.extend(options || {}, { 
        dataType: 'html', 
        cache:  false, 
        url:  'ajax/checkfile.php?url=' + escape(remotefile), 
        error:  function (jqXHR,textStatus,errorThrown) { 
            $(this).coresystem('errorlog',jqXHR,textStatus,errorThrown); 
        }, 
        success: function (data,textStatus,jqXHR) { 
            if (data!='200') { 

            // ....call errorhandler 

            } 
        } 
       }); 
       return jQuery.ajax(options); 
      }, 

checkfile.php:

<?php 
if (!isset($_REQUEST['url'])) die('param url missing!'); 
if (!preg_match('/.*\.js$/',$_REQUEST['url'])) die('filetype not allowed'); 
$ch = curl_init($_REQUEST['url']); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
// $code 404 not found, $code = 200 found. 
curl_close($ch); 
echo($code); 

नहीं 100% विश्वसनीय हैं, लेकिन बेहतर तो कुछ भी नहीं ...

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