2011-05-26 92 views
8

我一直在調查jQuery中的新(ish)延期對象,我偶然發現這個網站的文章herejQuery的推遲和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()成功,你的腳本只能得到執行。

據我的實驗,儘管錯誤回調不會被調用,即使我提供了一個不正確的url。

我錯過了一些顯而易見的東西,或者代碼示例錯了嗎?

注意:我會在網站上提出這個問題,但評論系統不起作用。 :-S

回答

4

我很確定該腳本無法在跨域請求上工作。

$.getScript對於本地和跨域請求以不同的方式工作。對於本地請求,它通過AJAX加載內容然後運行它。由於這是一個正常的AJAX操作,因此會以正常方式發生錯誤。就我能測試它而言,該代碼工作正常。

但是,對於跨域請求,它通過將script標籤插入文檔中起作用。 error處理程序永遠不會因插入的script元素而被解僱,因此您的error回調將永遠不會觸發。

+0

這是一個該死的恥辱。感謝您的洞察力。 – 2011-06-11 12:31:23

+0

這可能取決於'.getScript'是否支持[CORS](http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing)和注入腳本標記。即使是後者也許能夠支持延期,但是現在是否我不知道。 – hippietrail 2012-01-23 17:00:38

+0

@lonesomeday,你確定對於本地請求,它會通過ajax運行嗎?如果是這樣,爲什麼當爲本地腳本調用$ .ajax時,它只返回數據但不執行它? – adardesign 2012-02-08 15:49:05

0

但是...您可以將遠程URL檢查委託給(例如)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%可靠的,但更好然後什麼...