Light AJAX plugin

Light AJAX plugin by IvanSkvortsov

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greatest.deepsurf.us/scripts/32001/209692/Light%20AJAX%20plugin.js

  1. // ==UserScript==
  2. // @name Light AJAX plugin
  3. // @description Light AJAX plugin by IvanSkvortsov
  4. // @description:ru Упрощенная версия AJAX плагина от IvanSkvortsov
  5. // @include *://*
  6. // @author IvanSkvortsov
  7. // @date 2017.08.04
  8. // @version 1.0.0
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function(){
  13. var queue = [], requestInProgress = false, queueCleaned = true;
  14. function createXHttp()
  15. {
  16. if( window.XMLHttpRequest )
  17. return new XMLHttpRequest();
  18. else if( window.ActiveXObject ){
  19. var types = [
  20. 'Msxml3.XMLHTTP',
  21. 'Msxml2.XMLHTTP.6.0',
  22. 'Msxml2.XMLHTTP.3.0',
  23. 'Msxml2.XMLHTTP',
  24. 'Microsoft.XMLHTTP',
  25. ];
  26. for( let i = 0; i < types.length; ++i )
  27. {
  28. try{
  29. return new ActiveXObject(types[i]);
  30. }catch(error){}
  31. }
  32. console.error("[createXHttp] can't create ActiveXObject");
  33. }else{
  34. console.error("[createXHttp] can't create xhttp object");
  35. }
  36. return null;
  37. }
  38. function getXHttpRequest(){
  39. if( !(queue.length > 0) )
  40. return null;
  41. var request = queue[0];
  42. request.method = request.method || 'GET';
  43. if( request.method.toUpperCase() === 'GET' && request.data && request.data !== '' )
  44. {
  45. request.url += '?' + request.data;
  46. request.data = '';
  47. }
  48. request.async = (typeof request.async !== 'boolean' ? true : request.async );
  49. return request;
  50. }
  51. function handleXHttpEvent( type, xhttp, request, event ){
  52. var response;
  53. if( request[type] )
  54. {
  55. response = xhttp;
  56. response.lengthComputable = xhttp.lengthComputable || event.lengthComputable || false;
  57. response.loaded = xhttp.loaded || event.loaded || 0;
  58. response.total = xhttp.total || event.total || 0;
  59. response.url = xhttp.responseURL || request.url;
  60. request[type].call( response, response.responseText );
  61. if( type === 'onerror' || type === 'onload' ||
  62. (type === 'onreadystatechange' && response.readyState == 4 && response.status == 200 && !request.onload ) )
  63. {
  64. requestInProgress = false;
  65. request.delay = request.delay > 20 ? request.delay : 20;
  66. setTimeout( XHttpRequest, request.delay );
  67. }
  68. }
  69. }
  70. function initXHttpEvents( xhttp, request ){
  71. var types = ['onabort', 'onerror', 'onload', 'onloadend', 'onloadstart', 'onprogress',
  72. 'onreadystatechange', 'ontimeout',];
  73. function addXHttpEventListener(type){
  74. if( request[type] )
  75. xhttp[type] = function XHttpEvents(event){handleXHttpEvent(type, xhttp, request, event);};
  76. }
  77. types.forEach( addXHttpEventListener );
  78. }
  79. function initXHttp( xhttp, request ){
  80. initXHttpEvents( xhttp, request );
  81. for( let key in request.headers )
  82. xhttp.setRequestHeader( key, request.headers[key] );
  83. }
  84. function XHttpRequest(){
  85. var request, xhttp;
  86. request = getXHttpRequest();
  87. if( request && (requestInProgress === false || request.async === true) && queue.length > 0 )
  88. {
  89. queue.shift();
  90. requestInProgress = true;
  91. xhttp = createXHttp();
  92. initXHttp( xhttp, request );
  93. xhttp.open( request.method, request.url, request.async );
  94. xhttp.send( request.data || null );
  95. }
  96. }
  97. function constructXHttpRequest( url, settings ){
  98. var request = createNewObject(settings);
  99. request.url = url;
  100. return request;
  101. }
  102. function createNewObject( obj ){
  103. if( !obj )
  104. return {};
  105. var new_obj = {}, key, val;
  106. for( key in obj )
  107. {
  108. val = obj[key];
  109. if( Object.prototype.hasOwnProperty.call(obj, key) && val )
  110. new_obj[key] = val;
  111. }
  112. return new_obj;
  113. }
  114. window.ISL = window.ISL || {};
  115. // AJAX API
  116. ISL.ajaxClean = function(){
  117. queue.length = 0;
  118. requestInProgress = false;
  119. queueCleaned = true;
  120. };
  121. ISL.ajaxLength = function(){ return queue.length; };
  122. ISL.ajaxAddXHR = function(){
  123. var request, url, settings;
  124. switch( arguments.length )
  125. {
  126. case 0:
  127. return;
  128. case 1:
  129. request = arguments[0];
  130. if( request.length )
  131. request.forEach( function(req){ queue.push(req);} );
  132. else
  133. queue.push(request);
  134. break;
  135. case 2:
  136. url = arguments[0];
  137. settings = arguments[1];
  138. if( url.length )
  139. url.forEach( function(u){queue.push(constructXHttpRequest(u, settings));});
  140. else
  141. queue.push( constructXHttpRequest(url, settings) );
  142. break;
  143. default:
  144. console.error("[ajaxAddXHR] invalid number of arguments");
  145. return;
  146. }
  147. queueCleaned = false;
  148. };
  149. ISL.ajax = function(){
  150. this.ajaxAddXHR(arguments);
  151. XHttpRequest();
  152. };
  153. })();