signalr-no-jquery
Version:
Javascript SignalR client without jQuery dependency
147 lines (128 loc) • 3.79 kB
JavaScript
;
var jQueryDeferred = require('jquery-deferred');
var jQueryParam = require('jquery-param');
var qs = function qs(data) {
var results = [];
for (var name in data) {
results.push(name + '=' + encodeURIComponent(data[name]));
}return results.join('&');
};
var jqueryFunction = function jqueryFunction(subject) {
var events = subject.events || {};
if (subject && subject === subject.window) return {
0: subject,
load: function load(handler) {
return subject.addEventListener('load', handler, false);
},
bind: function bind(event, handler) {
return subject.addEventListener(event, handler, false);
},
unbind: function unbind(event, handler) {
return subject.removeEventListener(event, handler, false);
}
};
return {
0: subject,
unbind: function unbind(event, handler) {
var handlers = events[event] || [];
if (handler) {
var idx = handlers.indexOf(handler);
if (idx !== -1) handlers.splice(idx, 1);
} else handlers = [];
events[event] = handlers;
subject.events = events;
},
bind: function bind(event, handler) {
var current = events[event] || [];
events[event] = current.concat(handler);
subject.events = events;
},
triggerHandler: function triggerHandler(event, args) {
var _this = this;
var handlers = events[event] || [];
handlers.forEach(function (fn) {
if (args && args[0] && args[0].type === undefined) {
args = [{
type: event
}].concat(args || []);
} else {
args = args || [];
}
fn.apply(_this, args);
});
}
};
};
var xhr = function xhr() {
try {
return new window.XMLHttpRequest();
} catch (e) {}
};
var ajax = function ajax(options) {
var request = xhr();
if (options.xhrFields && options.xhrFields.withCredentials) {
request.withCredentials = true;
}
request.onreadystatechange = function () {
if (request.readyState !== 4) {
return;
}
if (request.status === 200 && !request._hasError) {
try {
options.success && options.success(JSON.parse(request.responseText));
} catch (e) {
options.error && options.error(request);
}
} else {
options.error && options.error(request);
}
};
request.withCredentials = options.xhrFields.withCredentials;
var cacheBuster = "_=" + new Date().getTime();
if (options.url.indexOf("?") === -1) {
options.url += "?" + cacheBuster;
} else if (options.url.indexOf("_=") === -1) {
options.url += "&" + cacheBuster;
} else {
options.url = options.url.replace(/_=\d+/, cacheBuster);
}
request.open(options.type, options.url);
request.setRequestHeader('content-type', options.contentType);
if (options.headers) {
Object.keys(options.headers).forEach(function (key) {
var value = options.headers[key];
request.setRequestHeader(key, value);
});
}
request.send(options.data && qs(options.data));
return {
abort: function abort(reason) {
return request.abort(reason);
}
};
};
module.exports = jQueryDeferred.extend(jqueryFunction, jQueryDeferred, {
defaultAjaxHeaders: null,
ajax: ajax,
inArray: function inArray(arr, item) {
return arr.indexOf(item) !== -1;
},
trim: function trim(str) {
return str && str.trim();
},
isEmptyObject: function isEmptyObject(obj) {
return !obj || Object.keys(obj).length === 0;
},
makeArray: function makeArray(arr) {
return [].slice.call(arr, 0);
},
param: function param(obj) {
return jQueryParam(obj);
},
support: {
cors: function () {
var xhrObj = xhr();
return !!xhrObj && "withCredentials" in xhrObj;
}()
}
});