18

load()が5秒以内に戻らない場合、.load()操作をキャンセルしたいと思います。その場合は、「申し訳ありませんが、画像が読み込まれていません」などのエラーメッセージが表示されます。

私が持っているのは...

...タイムアウト処理:

jQuery.fn.idle = function(time, postFunction){  
    var i = $(this);  
    i.queue(function(){  
        setTimeout(function(){  
            i.dequeue();
            postFunction();  
        }, time);  
    });
    return $(this); 
};

...エラーメッセージタイムアウトの初期化:

var hasImage = false;

$('#errorMessage')
    .idle(5000, function() {

        if(!hasImage) {
            // 1. cancel .load()            
            // 2. show error message
        }
    });

...画像の読み込み:

$('#myImage')
     .attr('src', '/url/anypath/image.png')
     .load(function(){
         hasImage = true;
         // do something...
      });

私が理解できなかった唯一のことは、実行中のload()をキャンセルする方法です(可能な場合)。

編集:

別の方法:.load()メソッドが戻ってきたときにそのコールバック関数を呼び出さないようにするにはどうすればよいですか?

4

7 に答える 7

11

このようなカスタム処理が必要な場合は、jQuery.load()関数を使用できません。jQuery.ajax()にアップグレードする必要があります。これは、jQuery.ajax()を使用してさらに多くのことができるため、とにかくお勧めします。特に、何らかのエラー処理が必要な場合は、それが必要になります。

jQuery.ajaxのbeforeSendオプションを使用して、xhrをキャプチャします。次に、タイムアウト後にxhrをキャンセルできるコールバックを作成し、必要に応じてコールバックを作成できます。

このコードはテストされていませんが、開始する必要があります。

var enableCallbacks = true;
var timeout = null;
jQuery.ajax({
  ....
  beforeSend: function(xhr) {
    timeout = setTimeout(function() {
      xhr.abort();
      enableCallbacks = false;
      // Handle the timeout
      ...
    }, 5000);
  },
  error: function(xhr, textStatus, errorThrown) {
    clearTimeout(timeout);
    if (!enableCallbacks) return;
    // Handle other (non-timeout) errors
  },
  success: function(data, textStatus) {
    clearTimeout(timeout);
    if (!enableCallbacks) return;
    // Handle the result
    ...
  }
});
于 2010-05-12T16:53:26.920 に答える
3

言い換える
と、.load()メソッドを使用して作成された保留中のコールバック関数をキャンセルするにはどうすればよいですか?

この「核」オプションを使用すると、すべてのjqueryコールバックをキャンセルできます。

$('#myImage').unbind('load');
于 2012-01-27T00:31:36.277 に答える
2

一番簡単なのは直接使うことだと思います$.ajax。そうすれば、タイムアウトを開始でき、タイムアウトからajax呼び出しのハンドラーがチェックできるフラグを設定できます。タイムアウトは、メッセージなどを表示することもできます。

于 2010-05-11T18:01:57.573 に答える
2

JQueryがロードされた後にこのコードをロードすると、タイムアウトパラメーターを使用して.load()を呼び出すことができます。

jQuery.fn.load = function( url, params, callback, timeout ) {
    if ( typeof url !== "string" ) {
        return _load.call( this, url );

    // Don't do a request if no elements are being requested
    } else if ( !this.length ) {
        return this;
    }

    var off = url.indexOf(" ");
    if ( off >= 0 ) {
        var selector = url.slice(off, url.length);
        url = url.slice(0, off);
    }

    // Default to a GET request
    var type = "GET";

    // If the second parameter was provided
    if ( params ) {
        // If it's a function
        if ( jQuery.isFunction( params ) ) {
            if( callback && typeof callback === "number"){
                timeout = callback;
                callback = params;
                params = null;
            }else{
                // We assume that it's the callback
                callback = params;
                params = null;
                timeout = 0;
            }
        // Otherwise, build a param string
        } else if( typeof params === "number"){
            timeout = params;
            callback = null;
            params = null;
        }else if ( typeof params === "object" ) {
            params = jQuery.param( params, jQuery.ajaxSettings.traditional );
            type = "POST";
            if( callback && typeof callback === "number"){
                timeout = callback;
                callback = null;
            }else if(! timeout){
                timeout = 0;
            }
        }
    }

    var self = this;

    // Request the remote document
    jQuery.ajax({
        url: url,
        type: type,
        dataType: "html",
        data: params,
        timeout: timeout,
        complete: function( res, status ) {
            // If successful, inject the HTML into all the matched elements
            if ( status === "success" || status === "notmodified" ) {
                // See if a selector was specified
                self.html( selector ?
                    // Create a dummy div to hold the results
                    jQuery("<div />")
                        // inject the contents of the document in, removing the scripts
                        // to avoid any 'Permission Denied' errors in IE
                        .append(res.responseText.replace(rscript, ""))

                        // Locate the specified elements
                        .find(selector) :

                    // If not, just inject the full result
                    res.responseText );
            }

            if ( callback ) {
                self.each( callback, [res.responseText, status, res] );
            }
        }
    });

    return this;
};

「標準」のJQuery関数を上書きすることに関心があるかどうかはわかりませんが、これにより、説明した方法で.load()を使用できるようになります。

于 2010-05-12T19:40:57.467 に答える
1

ここからそこに到達できるとは思いません-@Pointyが述べたように、XmlHttpRequestオブジェクトに到達して、その.abort()メソッドにアクセスできるようにする必要があります。そのために.ajax()は、オブジェクトを返すjQueryAPIが必要です。

リクエストを中止する機能を除いて、考慮すべきもう1つの方法は、コールバック関数にタイムアウトの知識を追加することです。これは2つの方法で行うことができます-最初に:

var hasImage = false;

$('#errorMessage')
    .idle(5000, function() {

        if(!hasImage) {
            // 1. cancel .load()            
            // 2. show error message
            // 3. Add an aborted flag onto the element(s)
            $('#myImage').data("aborted", true);
        }
    });

そしてあなたのコールバック:

$('#myImage')
     .attr('src', '/url/anypath/image.png')
     .load(function(){
         if($(this).data("aborted")){
             $(this).removeData("aborted");
             return;
         }
         hasImage = true;
         // do something...
      });

または、この特定の機能のアイドルをバイパスすることもできます。

$('#myImage')
     .attr('src', '/url/anypath/image.png')
     .data("start", (new Date()).getTime())
     .load(function(){
         var start = $(this).data("start");
         $(this).removeData("start");
         if(((new Date()).getTime() - start) > 5000)
             return;

         hasImage = true;
         // do something...
      });

どちらのアプローチも理想的ではありませんが、jQuery 1.4の時点では、ロードを直接キャンセルすることはできないと思います。ただし、jQueryチームにとっては優れた機能リクエストかもしれません。

于 2010-05-12T16:08:47.090 に答える
0

$('#myImage').load(function(){...})画像をロードするための関数呼び出しではありません。実際には、コールバックをonload イベントにバインドするための省略形です。

したがって、他の回答で提案されているようにメソッドtimeoutにパラメーターを追加しても効果はありません。.load()

2つの選択肢は次のとおりです。

  1. たどっているパスを続行し、 $('#myImage').attr('src', '');タイムアウト後に画像の読み込みをキャンセルするなどの操作を行います。

  2. ブラウザに属性$.ajax( { ... , timeout: 5000, ...} );を介して自動的にロードさせるのではなく、イメージをロードする ために使用する方法を見つけてください。<img src="...">

于 2010-09-24T05:28:44.153 に答える
0

画像をロードする前にタイムアウトを設定するだけでなく、ロードエラーをテストすることもできます。

function LoadImage(yourImage) {

    var imageTimer = setTimeout(function () {
        //image could not be loaded:
        alert('image load timed out');
    }, 10000); //10 seconds

    $(yourImage).load(function (response, status, xhr) {
        if (imageTimer) {

            if (status == 'error') {
                //image could not be loaded:
                alert('failed to load image');

            } else {
                //image was loaded:
                clearTimeout(imageTimer);
                //display your image...
            }

        }
    });

}
于 2013-07-22T07:38:02.980 に答える