forked from madrobby/zepto
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathajax.js
123 lines (107 loc) · 4.03 KB
/
ajax.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
(function($){
var jsonpID = 0,
isObject = $.isObject;
function empty() {}
$.ajaxJSONP = function(options){
var jsonpString = 'jsonp' + ++jsonpID,
script = document.createElement('script');
window[jsonpString] = function(data){
options.success(data);
delete window[jsonpString];
};
script.src = options.url.replace(/=\?/, '=' + jsonpString);
$('head').append(script);
};
$.ajaxSettings = {
type: 'GET',
beforeSend: empty, success: empty, error: empty, complete: empty,
accepts: {
script: 'text/javascript, application/javascript',
json: 'application/json',
xml: 'application/xml, text/xml',
html: 'text/html',
text: 'text/plain'
}
};
$.ajax = function(options){
options = options || {};
var settings = $.extend({}, options);
for (key in $.ajaxSettings) if (!settings[key]) settings[key] = $.ajaxSettings[key];
if (/=\?/.test(settings.url)) return $.ajaxJSONP(settings);
if (!settings.url) settings.url = window.location.toString();
if (settings.data && !settings.contentType) settings.contentType = 'application/x-www-form-urlencoded';
if (isObject(settings.data)) settings.data = $.param(settings.data);
if (settings.type.match(/get/i) && settings.data) {
var queryString = settings.data;
if (settings.url.match(/\?.*=/)) {
queryString = '&' + queryString;
} else if (queryString[0] != '?') {
queryString = '?' + queryString;
}
settings.url += queryString;
}
var mime = settings.accepts[settings.dataType],
xhr = new XMLHttpRequest();
settings.headers = $.extend({'X-Requested-With': 'XMLHttpRequest'}, settings.headers || {});
if (mime) settings.headers['Accept'] = mime;
xhr.onreadystatechange = function(){
if (xhr.readyState == 4) {
var result, error = false;
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 0) {
if (mime == 'application/json') {
try { result = JSON.parse(xhr.responseText); }
catch (e) { error = e; }
}
else result = xhr.responseText;
if (error) settings.error(xhr, 'parsererror', error);
else settings.success(result, 'success', xhr);
} else {
error = true;
settings.error(xhr, 'error');
}
settings.complete(xhr, error ? 'error' : 'success');
}
};
xhr.open(settings.type, settings.url, true);
if (settings.beforeSend(xhr, settings) === false) {
xhr.abort();
return false;
}
if (settings.contentType) settings.headers['Content-Type'] = settings.contentType;
for (name in settings.headers) xhr.setRequestHeader(name, settings.headers[name]);
xhr.send(settings.data);
};
$.get = function(url, success){ $.ajax({ url: url, success: success }) };
$.post = function(url, data, success, dataType){
if ($.isFunction(data)) dataType = dataType || success, success = data, data = null;
$.ajax({ type: 'POST', url: url, data: data, success: success, dataType: dataType });
};
$.getJSON = function(url, success){ $.ajax({ url: url, success: success, dataType: 'json' }) };
$.fn.load = function(url, success){
if (!this.length) return this;
var self = this, parts = url.split(/\s/), selector;
if (parts.length > 1) url = parts[0], selector = parts[1];
$.get(url, function(response){
self.html(selector ?
$(document.createElement('div')).html(response).find(selector).html()
: response);
success && success();
});
return this;
};
$.param = function(obj, v){
var s = [],
add = function(key, value){
s.push(encodeURIComponent(v ? v + '[' + key +']' : key)
+ '=' + encodeURIComponent(value));
},
isObjArray = $.isArray(obj);
for(var i in obj){
if(isObject(obj[i]))
s.push($.param(obj[i], (v ? v + '[' + i + ']' : i)));
else
add(isObjArray ? '' : i, obj[i]);
};
return s.join('&').replace('%20', '+');
};
})(Zepto);