Search code examples
jqueryimagetimeoutjquery-load

How to cancel a jquery.load()?


I'd like to cancel a .load() operation, when the load() does not return in 5 seconds. If it's so I show an error message like 'sorry, no picture loaded'.

What I have is...

...the timeout handling:

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

... initializing of the error message timeout:

var hasImage = false;

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

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

... the image loading:

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

The only thing I could not figure out is how to cancel the running load() (if it's possible).

Edit:

Another way: How do I prevent the .load() method to call it's callback function when it's returning?


Solution

  • If you want any custom handling such as this, you simply can't use the jQuery.load() function. You'll have to upgrade to jQuery.ajax(), which I recommend anyway since you can do so much more with it, especially if you need any kind of error handling, it will be necessary.

    Use the beforeSend option for jQuery.ajax and capture the xhr. Then you can create callback which can cancel the xhr after your timeout, and the callbacks as necessary.

    This code is not tested, but should get you started.

    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
        ...
      }
    });