comparison default/node_modules/shoestring/src/ajax/ajax.js @ 0:1d038bc9b3d2 default tip

Up:default
author Liny <dev@neowd.com>
date Sat, 31 May 2025 09:21:51 +0800
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1d038bc9b3d2
1 //>>excludeStart("exclude", pragmas.exclude);
2 define([ "shoestring" ], function(){
3 //>>excludeEnd("exclude");
4
5 /**
6 * Make an HTTP request to a url.
7 *
8 * **NOTE** the following options are supported:
9 *
10 * - *method* - The HTTP method used with the request. Default: `GET`.
11 * - *data* - Raw object with keys and values to pass with request as query params. Default `null`.
12 * - *headers* - Set of request headers to add. Default `{}`.
13 * - *async* - Whether the opened request is asynchronouse. Default `true`.
14 * - *success* - Callback for successful request and response. Passed the response data.
15 * - *error* - Callback for failed request and response.
16 * - *cancel* - Callback for cancelled request and response.
17 *
18 * @param {string} url The url to request.
19 * @param {object} options The options object, see Notes.
20 * @return shoestring
21 * @this shoestring
22 */
23
24 shoestring.ajax = function( url, options ) {
25 var params = "", req = new XMLHttpRequest(), settings, key;
26
27 settings = shoestring.extend( {}, shoestring.ajax.settings );
28
29 if( options ){
30 shoestring.extend( settings, options );
31 }
32
33 if( !url ){
34 url = settings.url;
35 }
36
37 if( !req || !url ){
38 return;
39 }
40
41 // create parameter string from data object
42 if( settings.data ){
43 for( key in settings.data ){
44 if( settings.data.hasOwnProperty( key ) ){
45 if( params !== "" ){
46 params += "&";
47 }
48 params += encodeURIComponent( key ) + "=" +
49 encodeURIComponent( settings.data[key] );
50 }
51 }
52 }
53
54 // append params to url for GET requests
55 if( settings.method === "GET" && params ){
56 //>>includeStart("development", pragmas.development);
57 if( url.indexOf("?") >= 0 ){
58 shoestring.error( 'ajax-url-query' );
59 }
60 //>>includeEnd("development");
61
62 url += "?" + params;
63 }
64
65 req.open( settings.method, url, settings.async );
66
67 if( req.setRequestHeader ){
68 req.setRequestHeader( "X-Requested-With", "XMLHttpRequest" );
69
70 // Set 'Content-type' header for POST requests
71 if( settings.method === "POST" && params ){
72 req.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
73 }
74
75 for( key in settings.headers ){
76 if( settings.headers.hasOwnProperty( key ) ){
77 req.setRequestHeader(key, settings.headers[ key ]);
78 }
79 }
80 }
81
82 req.onreadystatechange = function () {
83 if( req.readyState === 4 ){
84 // Trim the whitespace so shoestring('<div>') works
85 var res = (req.responseText || '').replace(/^\s+|\s+$/g, '');
86 if( req.status.toString().indexOf( "0" ) === 0 ){
87 return settings.cancel( res, req.status, req );
88 }
89 else if ( req.status.toString().match( /^(4|5)/ ) && RegExp.$1 ){
90 return settings.error( res, req.status, req );
91 }
92 else if (settings.success) {
93 return settings.success( res, req.status, req );
94 }
95 }
96 };
97
98 if( req.readyState === 4 ){
99 return req;
100 }
101
102 // Send request
103 if( settings.method === "POST" && params ){
104 req.send( params );
105 } else {
106 req.send();
107 }
108
109 return req;
110 };
111
112 shoestring.ajax.settings = {
113 success: function(){},
114 error: function(){},
115 cancel: function(){},
116 method: "GET",
117 async: true,
118 data: null,
119 headers: {}
120 };
121
122 //>>excludeStart("exclude", pragmas.exclude);
123 });
124 //>>excludeEnd("exclude");