Super Light AJAX plugin

Super Light AJAX plugin by IvanSkvortsov

目前为 2017-08-04 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/32009/209846/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.4
  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. window.ISL = window.ISL || {};
  68. // AJAX API
  69. ISL.lajaxAddXHR = function(){
  70. var request;
  71. switch(arguments.length){
  72. case 0:
  73. return;
  74. case 1:
  75. request = arguments[0];
  76. if( request.length )
  77. request.forEach( function(req){ lqueue.push(req);} );
  78. else
  79. lqueue.push(request);
  80. break;
  81. default:
  82. console.error("[lajaxAddXHR] invalid number of arguments: " + arguments.length);
  83. return;
  84. }
  85. lqueueCleaned = false;
  86. };
  87. ISL.lajax = function(){
  88. this.lajaxAddXHR(arguments);
  89. XHttpRequestLight();
  90. };
  91. ISL.lajaxClean = function(){
  92. lqueue.length = 0;
  93. lrequestInProgress = false;
  94. lqueueCleaned = true;
  95. };
  96. ISL.lajaxLength = function(){ return lqueue.length; };
  97. })();