antulik/pagelet_rails

View on GitHub
app/assets/javascripts/pagelet_rails/jquery.ajaxprogress.js

Summary

Maintainability
A
0 mins
Test Coverage
/*!
 * jQuery ajaxProgress Plugin v0.5.0
 * Requires jQuery v1.5.0 or later
 *
 * http://www.kpozin.net/ajaxprogress
 *
 * (c) 2011, Konstantin Pozin
 * Licensed under MIT license.
 */
(function($) {

  // Test whether onprogress is supported
  var support = $.support.ajaxProgress = ("onprogress" in $.ajaxSettings.xhr());

  // If it's not supported, we can't do anything
  if (!support) {
    return;
  }

  var NAMESPACE = ".ajaxprogress";

  // Create global "ajaxProgress" event
  $.fn.ajaxProgress = function (f) {
    return this.bind("ajaxProgress", f);
  };

  // Hold on to a reference to the jqXHR object so that we can pass it to the progress callback.
  // Namespacing the handler with ".ajaxprogress"
  $("html").bind("ajaxSend" + NAMESPACE, function(event, jqXHR, ajaxOptions) {
    ajaxOptions.__jqXHR = jqXHR;
  });

  /**
   * @param {XMLHttpRequestProgressEvent} evt
   * @param {Object} options jQuery AJAX options
   */
  function handleOnProgress(evt, options) {

    // Trigger the global event.
    // function handler(jqEvent, progressEvent, jqXHR) {}
    if (options.global) {
      $.event.trigger("ajaxProgress", [evt, options.__jqXHR]);
    }

    // Trigger the local event.
    // function handler(jqXHR, progressEvent)
    if (typeof options.progress === "function") {
      options.progress(options.__jqXHR, evt);
    }
  }


  // We'll work with the original factory method just in case
  var makeOriginalXhr = $.ajaxSettings.xhr.bind($.ajaxSettings);

  // Options to be passed into $.ajaxSetup;
  var newOptions = {};

  // Wrap the XMLHttpRequest factory method
  newOptions.xhr = function () {

    // Reference to the extended options object
    var s = this;

    var newXhr = makeOriginalXhr();
    if (newXhr) {
      newXhr.addEventListener("progress", function(evt) {
        handleOnProgress(evt, s);
      });
    }
    return newXhr;
  };

  $.ajaxSetup(newOptions);

})(jQuery);