问题描述
|
我一直在研究jQuery中新的(ish)延迟对象,却在这里偶然发现了该网站文章。
本文中有一些旨在缓存脚本的代码,因此不会多次请求脚本。
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 );
在我看来,这是一种确保您的脚本仅在ѭ1成功后才会执行的方法。
就我的实验而言,即使我提供了错误的URL,也不会调用错误回调。
我是否错过了一些明显的事情,或者代码示例错误?
注意:我曾在网站上问过这个问题,但评论系统无法正常工作。 :-S
解决方法
我相当确定该脚本无法处理跨域请求。
$.getScript
以不同的方式处理本地和跨域请求。对于本地请求,它将通过AJAX加载内容,然后运行它。由于这是正常的AJAX操作,因此会以正常方式发生错误。就我所能测试的而言,该代码可以正常工作。
但是,对于跨域请求,它可以通过在文档中插入“ 3”标记来起作用。不会为插入的script
元素触发error
处理函数,因此您的error
回调将不会触发。
,但是...您可以将远程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,errorThrown);
},success: function (data,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%可靠,但总比没有好...