Super Light AJAX plugin

Super Light AJAX plugin by IvanSkvortsov

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

此脚本不应直接安装,它是供其他脚本使用的外部库。如果你需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/32009/209784/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.04
  8. // @version 1.0.1
  9. // @grant none
  10. // ==/UserScript==
  11. (function(){
  12. var lqueue = [], lrequestInProgress = false, lqueueCleaned = true;
  13. function XHttpRequestLight(){
  14. var request = lqueue[0], xhttp = null, i, key,
  15. activeXs = ['Msxml3.XMLHTTP', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP',];
  16. if(!( request && (lrequestInProgress === 'false' || request.async === 'false') && lqueue.length > 0 ))
  17. return;
  18. // handle request:
  19. request.method = request.method || 'GET';
  20. if( request.method.toUpperCase() === 'GET' && request.data ){
  21. request.url += '?' + request.data;
  22. request.data = null;
  23. }
  24. request.async = typeof request.async === 'boolean' ? request.async : true;
  25. // createXmlHttpRequest:
  26. if( window.XMLHttpRequest )
  27. xhttp = new XMLHttpRequest();
  28. else if( window.ActiveXObject ){
  29. for( i = 0; i < activeXs.length; ++i ){
  30. try{xhttp = new ActiveXObject(activeXs[i]);}
  31. catch(error){continue;}
  32. break;
  33. }
  34. if( !xhttp ){
  35. console.error("[XHttpRequestLight] can't create ActiveXObject");
  36. return;
  37. }
  38. }else{
  39. console.error("[XHttpRequestLight] can't create XmlHttpRequest object");
  40. return;
  41. }
  42. xhttp.open( request.method, request.url, request.async );
  43. lrequestInProgress = true;
  44. lqueue.shift();
  45. for( key in request.headers )
  46. xhttp.setRequestHeader( key, request.headers[key] );
  47. xhttp.url = request.url;
  48. var events = ['onabort', 'onerror', 'onload', 'onloadend', 'onloadstart', 'onprogress', 'onreadystatechange', 'ontimeout',];
  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. }
  66. window.ISL = window.ISL || {};
  67. // AJAX API
  68. ISL.lajaxAddXHR = function(){
  69. var request;
  70. switch(arguments.length){
  71. case 0:
  72. return;
  73. case 1:
  74. request = arguments[0];
  75. if( request.length )
  76. request.forEach( function(req){ lqueue.push(req);} );
  77. else
  78. lqueue.push(request);
  79. break;
  80. default:
  81. console.error("[lajaxAddXHR] invalid number of arguments: " + arguments.length);
  82. return;
  83. }
  84. lqueueCleaned = false;
  85. };
  86. ISL.lajax = function(){
  87. this.lajaxAddXHR(arguments);
  88. XHttpRequestLight();
  89. };
  90. ISL.lajaxClean = function(){
  91. lqueue.length = 0;
  92. lrequestInProgress = false;
  93. lqueueCleaned = true;
  94. };
  95. ISL.lajaxLength = function(){ return lqueue.length; };
  96. })();