8

我一直在研究 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 );

$.getScript()这对我来说是一种确保脚本只有在你成功 的情况下才会被执行的方法。

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

我错过了一些明显的东西还是代码示例错误?

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

4

2 回答 2

4

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

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

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

于 2011-06-08T21:49:46.770 回答
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 );
            },

检查文件.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% 可靠,但总比没有好...

于 2013-12-12T11:31:52.047 回答