时间:2011-05-26 10:42:11

标签: jquery jquery-deferred

我一直在调查jQuery中的新(ish)延迟对象,我偶然发现了这个网站文章here

在本文中有一些代码用于缓存脚本,因此不会多次请求它们。

    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()成功才能执行脚本的方法。

就我的实验而言,即使我提供的网址不正确,也不会调用错误回调。

我是否错过了一些明显的错误或代码示例是错误的?

注意:我在网站上问过这个问题,但评论系统不起作用。 :-S

2 个答案:

答案 0 :(得分:4)

我很确定该脚本无法处理跨域请求。

$.getScript以不同的方式处理本地和跨域请求。对于本地请求,它通过AJAX加载内容然后运行它。由于这是正常的AJAX操作,因此会以正常方式发生错误。该代码工作正常,只要我可以测试它。

但是,对于跨域请求,它可以通过在文档中插入script标记来实现。永远不会为插入的error元素触发script个处理程序,因此您的error回调永远不会触发。

答案 1 :(得分: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%可靠,但比没有好......