File: libs/URLLoader.js
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
/**
* @module annie
*/
var annie;
(function (annie) {
/**
* 资源加载类,后台请求,加载资源和后台交互都可以使用此类
* @class annie.URLLoader
* @extends annie.EventDispatcher
* @public
* @since 1.0.0
* @example
* var urlLoader = new annie.URLLoader();
* urlLoader.addEventListener('onComplete', function (e) {
* //trace(e.data.response);
* var bitmapData = e.data.response,//bitmap图片数据
* bitmap = new annie.Bitmap(bitmapData);//实例化bitmap对象
* //居中对齐
* bitmap.x = (s.stage.desWidth - bitmap.width) / 2;
* bitmap.y = (s.stage.desHeight - bitmap.height) / 2;
* s.addChild(bitmap);
* });
* urlLoader.load('http://test.annie2x.com/biglong/logo.jpg');//载入外部图片
*/
var URLLoader = (function (_super) {
__extends(URLLoader, _super);
/**
* @param type text json js xml image sound css svg video unKnow
*/
function URLLoader() {
var _this = _super.call(this) || this;
_this._req = null;
_this.headers = [];
/**
* 后台返回来的数据类弄
* @property responseType
* @type {string}
* @default null
* @public
* @since 1.0.0
*/
_this.responseType = null;
/**
* 请求的url地址
* @property url
* @public
* @since 1.0.0
* @type {string}
*/
_this.url = "";
/**
* 请求后台的类型 get post
* @property method
* @type {string}
* @default get
* @public
* @since 1.0.0
*/
_this.method = "get";
/**
* 需要像后台传送的数据对象
* @property data
* @public
* @since 1.0.0
* @default null
* @type {Object}
*/
_this.data = null;
/**
* 格式化post请求参数
* @method _fqs
* @param data
* @param query
* @return {string}
* @private
* @since 1.0.0
*/
_this._fqs = function (data, query) {
var params = [];
if (data) {
for (var n in data) {
params.push(encodeURIComponent(n) + "=" + encodeURIComponent(data[n]));
}
}
if (query) {
params = params.concat(query);
}
return params.join("&");
};
//formatURIString
/**
* 格式化get 请求参数
* @method _fus
* @param src
* @param data
* @return {any}
* @private
*/
_this._fus = function (src, data) {
var s = this;
if (data == null || data == "") {
return src;
}
var query = [];
var idx = src.indexOf("?");
if (idx != -1) {
var q = src.slice(idx + 1);
query = query.concat(q.split("&"));
return src.slice(0, idx) + "?" + s._fqs(data, query);
}
else {
return src + "?" + s._fqs(data, query);
}
};
_this._instanceType = "annie.URLLoader";
return _this;
}
/**
* 取消加载
* @method loadCancel
* @public
* @since 1.0.0
*/
URLLoader.prototype.loadCancel = function () {
var s = this;
if (s._req) {
s._req.abort();
// s._req = null;
}
};
/**
* 加载或请求数据
* @method load
* @public
* @since 1.0.0
* @param {string} url
* @param {string} contentType 如果请求类型需要设置主体类型,有form json binary jsonp等,请设置 默认为form
*/
URLLoader.prototype.load = function (url, contentType) {
if (contentType === void 0) { contentType = "form"; }
var s = this;
s.loadCancel();
if (s.responseType == null || s.responseType == "") {
//看看是什么后缀
var urlSplit = url.split(".");
var extStr = urlSplit[urlSplit.length - 1];
var ext = extStr.split("?")[0].toLocaleLowerCase();
if (ext == "mp3" || ext == "ogg" || ext == "wav") {
s.responseType = "sound";
}
else if (ext == "jpg" || ext == "jpeg" || ext == "png" || ext == "gif") {
s.responseType = "image";
}
else if (ext == "css") {
s.responseType = "css";
}
else if (ext == "mp4") {
s.responseType = "video";
}
else if (ext == "svg") {
s.responseType = "svg";
}
else if (ext == "xml") {
s.responseType = "xml";
}
else if (ext == "json") {
s.responseType = "json";
}
else if (ext == "txt") {
s.responseType = "text";
}
else if (ext == "js" || ext == "swf") {
s.responseType = "js";
}
else {
s.responseType = "unKnow";
}
}
if (!s._req) {
s._req = new XMLHttpRequest();
var req_1 = s._req;
req_1.withCredentials = false;
req_1.onprogress = function (event) {
if (!event || event.loaded > 0 && event.total == 0) {
return; // Sometimes we get no "total", so just ignore the progress event.
}
s.dispatchEvent("onProgress", { loadedBytes: event.loaded, totalBytes: event.total });
};
req_1.onerror = function (event) {
reSendTimes++;
if (reSendTimes > 2) {
s.dispatchEvent("onError", { id: 2, msg: event["message"] });
}
else {
//断线重连
req_1.abort();
if (!s.data) {
req_1.send();
}
else {
if (contentType == "form") {
req_1.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");
req_1.send(s._fqs(s.data, null));
}
else {
var type = "application/json";
if (contentType != "json") {
type = "multipart/form-data";
}
req_1.setRequestHeader("Content-type", type + ";charset=UTF-8");
req_1.send(s.data);
}
}
}
};
req_1.onreadystatechange = function (event) {
var t = event.target;
if (t["readyState"] == 4) {
if (req_1.status == 200) {
var isImage = false;
var e_1 = new annie.Event("onComplete");
var result = t["response"];
e_1.data = { type: s.responseType, response: null };
var item = void 0;
switch (s.responseType) {
case "css":
item = document.createElement("link");
item.rel = "stylesheet";
item.href = s.url;
break;
case "image":
case "sound":
case "video":
var itemObj_1;
if (s.responseType == "image") {
isImage = true;
itemObj_1 = document.createElement("img");
itemObj_1.onload = function () {
URL.revokeObjectURL(itemObj_1.src);
itemObj_1.onload = null;
s.dispatchEvent(e_1);
};
itemObj_1.src = URL.createObjectURL(result);
item = itemObj_1;
}
else {
if (s.responseType == "sound") {
itemObj_1 = document.createElement("AUDIO");
itemObj_1.preload = true;
itemObj_1.src = s.url;
item = new annie.Sound(s.url);
}
else if (s.responseType == "video") {
itemObj_1 = document.createElement("VIDEO");
itemObj_1.preload = true;
itemObj_1.src = s.url;
item = new annie.Video(itemObj_1);
}
}
break;
case "json":
item = JSON.parse(result);
break;
case "js":
item = "JS_CODE";
annie.Eval(result);
break;
case "text":
case "unKnow":
case "xml":
default:
item = result;
break;
}
e_1.data["response"] = item;
s.data = null;
s.responseType = "";
if (!isImage)
s.dispatchEvent(e_1);
}
else {
//服务器返回报错
s.dispatchEvent("onError", { id: 0, msg: "访问地址不存在" });
}
}
};
}
var req = s._req;
var reSendTimes = 0;
if (s.data && s.method.toLocaleLowerCase() == "get") {
s.url = s._fus(url, s.data);
s.data = null;
}
else {
s.url = url;
}
if (s.responseType == "image" || s.responseType == "sound" || s.responseType == "video") {
req.responseType = "blob";
}
else {
req.responseType = "text";
}
req.open(s.method, s.url, true);
if (s.headers.length > 0) {
for (var h = 0; h < s.headers.length; h += 2) {
req.setRequestHeader(s.headers[h], s.headers[h + 1]);
}
s.headers.length = 0;
}
if (!s.data) {
req.send();
}
else {
if (contentType == "form") {
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");
req.send(s._fqs(s.data, null));
}
else {
var type = "application/json";
if (contentType != "json") {
type = "multipart/form-data";
}
req.setRequestHeader("Content-type", type + ";charset=UTF-8");
req.send(s.data);
}
}
/*req.onloadstart = function (e) {
s.dispatchEvent("onStart");
};*/
};
/**
* 添加自定义头
* @addHeader
* @param name
* @param value
*/
URLLoader.prototype.addHeader = function (name, value) {
this.headers.push(name, value);
};
return URLLoader;
}(annie.EventDispatcher));
annie.URLLoader = URLLoader;
})(annie || (annie = {}));