Super Light AJAX plugin

Super Light AJAX plugin by IvanSkvortsov

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/32009/209858/Super%20Light%20AJAX%20plugin.js

  1. // ==UserScript==
  2. // @name Super Light AJAX plugin
  3. // @description Super Light AJAX plugin by IvanSkvortsov
  4. // @description:ru Супер упрощенная версия AJAX плагина от IvanSkvortsov
  5. // @include *://*
  6. // @author IvanSkvortsov
  7. // @date 2017.08.05
  8. // @version 1.0.5
  9. // @grant none
  10. // ==/UserScript==
  11. (function(){
  12. var lqueue = [], lrequestInProgress = false, lqueueCleaned = true;
  13. var activeXs = ['Msxml3.XMLHTTP', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP',];
  14. var events = ['onabort', 'onerror', 'onload', 'onloadend', 'onloadstart', 'onprogress', 'onreadystatechange', 'ontimeout',];
  15. function XHttpRequestLight(){
  16. var request = lqueue[0], xhttp = null, i, key;
  17. if(!( request && (lrequestInProgress === false || request.async === true) && lqueue.length > 0 ))
  18. return;
  19. // handle request:
  20. request.method = request.method || 'GET';
  21. if( request.method.toUpperCase() === 'GET' && request.data ){
  22. request.url += '?' + request.data;
  23. request.data = null;
  24. }
  25. request.async = typeof request.async === 'boolean' ? request.async : true;
  26. // createXmlHttpRequest:
  27. if( window.XMLHttpRequest )
  28. xhttp = new XMLHttpRequest();
  29. else if( window.ActiveXObject ){
  30. for( i = 0; i < activeXs.length; ++i ){
  31. try{xhttp = new ActiveXObject(activeXs[i]);}
  32. catch(error){continue;}
  33. break;
  34. }
  35. if( !xhttp ){
  36. console.error("[XHttpRequestLight] can't create ActiveXObject");
  37. return;
  38. }
  39. }else{
  40. console.error("[XHttpRequestLight] can't create XmlHttpRequest object");
  41. return;
  42. }
  43. xhttp.open( request.method, request.url, request.async );
  44. lrequestInProgress = true;
  45. lqueue.shift();
  46. for( key in request.headers )
  47. xhttp.setRequestHeader( key, request.headers[key] );
  48. xhttp.url = request.url;
  49. // handle XmlHttpRequest events
  50. events.forEach(function(type){
  51. if( request[type] ){
  52. xhttp[type] = function(event){
  53. xhttp.lengthComputable = event.lengthComputable || false;
  54. xhttp.loaded = event.loaded || 0;
  55. xhttp.total = event.total || 0;
  56. request[type].call(xhttp, xhttp.responseText);
  57. if( type === 'onerror' || type === 'onload' || (type === 'onreadystatechange' && xhttp.readyState == 4 && xhttp.status == 200 && !request.onload)){
  58. lrequestInProgress = false;
  59. request.delay = request.delay > 20 ? request.delay : 20;
  60. setTimeout( XHttpRequestLight, request.delay );
  61. }
  62. };
  63. }
  64. });
  65. xhttp.send( request.data || null);
  66. }
  67. function createNewRequest( url, settings )
  68. {
  69. var key, val, request = {};
  70. for( key in settings )
  71. {
  72. val = settings[key];
  73. if( Object.prototype.hasOwnProperty.call( settings, key ) && val )
  74. request[key] = val;
  75. }
  76. request.url = url;
  77. return request;
  78. }
  79. window.ISL = window.ISL || {};
  80. // AJAX API
  81. ISL.lajaxAddXHR = function(){
  82. var request, url, settings;
  83. switch(arguments.length){
  84. case 0:
  85. return;
  86. case 1:
  87. request = arguments[0];
  88. if( request.length )
  89. lqueue = lqueue.concat( request );
  90. else
  91. lqueue.push(request);
  92. break;
  93. case 2:
  94. url = arguments[0];
  95. settings = arguments[1];
  96. if( url.length )
  97. url.forEach(function(u){ lqueue.push(createNewRequest(u, settings));} );
  98. else
  99. lqueue.push(createNewRequest(url, settings));
  100. break;
  101. default:
  102. console.error("[lajaxAddXHR] invalid number of arguments: " + arguments.length);
  103. return;
  104. }
  105. lqueueCleaned = false;
  106. };
  107. ISL.lajax = function(){
  108. ISL.lajaxAddXHR.apply(this, arguments);
  109. XHttpRequestLight();
  110. };
  111. ISL.lajaxClean = function(){
  112. lqueue.length = 0;
  113. lrequestInProgress = false;
  114. lqueueCleaned = true;
  115. };
  116. ISL.lajaxLength = function(){ return lqueue.length; };
  117. })();