2015-04-26 18:38:56 +02:00

92 lines
2.7 KiB
JavaScript

/**
* @file
* Contains JS required for less watch functionality.
*/
;(function ($) {
"use strict";
Drupal.behaviors.less_watch = {
attach: function (context, settings) {
var watched_files = [],
$watched_links;
$watched_links = $('head link[src$=".less"]', context).each(function () {
// Only grab the portion of the url up to, but not including, the '?'.
watched_files.push($(this).attr('href'));
});
if (watched_files.length > 0) {
// Modeled after example @ http://www.erichynds.com/javascript/a-recursive-settimeout-pattern/
var poller = {
failed_requests: 0,
// starting interval in milliseconds
interval: 500,
// kicks off the setTimeout
init: function(){
setTimeout(
$.proxy(this.getData, this), // ensures 'this' is the poller obj inside getData, not the window object
this.interval
);
},
// get AJAX data + respond to it
getData: function() {
var self = this;
$.ajax({
type: 'POST',
url: settings.basePath + 'ajax/less/watch',
data: {
less_files: watched_files
},
// On success, reset failed request counter and update style links.
success: function ( response ) {
self.failed_requests = 0;
$.each(response, function (index, value) {
var old_file = value.old_file,
new_file = value.new_file;
// Math.random() at the end forces a reload of the file.
$('head link[href^="' + old_file + '"]', context).replaceWith($('<link type="text/css" rel="stylesheet" media="all" />').attr('href', new_file + '?' + Math.random()));
watched_files[$.inArray(old_file, watched_files)] = new_file;
});
},
// On failure, count failed request and increase interval.
error: function () {
++self.failed_requests;
self.interval += 500;
},
// On success or failure, restart
complete: function () {
if( ++self.failed_requests < 10 ){
self.init();
}
}
});
}
};
poller.init();
}
}
};
})(jQuery);