WaitUntil

等待满足某种条件后执行,目前不支持嵌套调用

目前为 2023-04-01 提交的版本。查看 最新版本

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

  1. // ==UserScript==
  2. // @name WaitUntil
  3. // @namespace http://bbs.91wc.net/?wait-until
  4. // @version 0.1.2
  5. // @description 等待满足某种条件后执行,目前不支持嵌套调用
  6. // @author Wilson
  7. // ==/UserScript==
  8.  
  9. var WaitUntil = (function(g){
  10. g._WaitUntil = g._WaitUntil || {};
  11. g._WaitUntil.timer = g._WaitUntil.timer||{};
  12. g._WaitUntil.counter = g._WaitUntil.counter||{};
  13. g._WaitUntil.timesCounter = g._WaitUntil.timesCounter||{};
  14. var timer = g._WaitUntil.timer;
  15. var counter = g._WaitUntil.counter;
  16. var timesCounter = g._WaitUntil.timesCounter;
  17. var waitUntil=function(condfunc, callback, interval, trys, times){
  18. var getGuid = getGuid||function() {
  19. var d = new Date().getTime();
  20. var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  21. var r = (d + Math.random()*16)%16 | 0;
  22. d = Math.floor(d/16);
  23. return (c=='x' ? r : (r&0x3|0x8)).toString(16);
  24. });
  25. return uuid;
  26. };
  27. var guid = guid || getGuid();
  28. timesCounter[guid] = times || 1;
  29. var isTimesInfinite = timesCounter[guid] === -1;
  30. var waiter = function(condfunc, callback, interval, trys, guid){
  31. interval = interval || 100;
  32. trys = trys || 300;
  33. counter[guid] = counter[guid] ? counter[guid]++ : 1;
  34. timesCounter[guid]--;
  35. if(counter[guid]>trys){
  36. if(timer[guid]) clearTimeout(timer[guid]);
  37. //callback('fail');
  38. return;
  39. }
  40. timer[guid] = setTimeout(function(){
  41. if(condfunc()){
  42. if(timer[guid]) clearTimeout(timer[guid]);
  43. callback('ok');
  44. if(isTimesInfinite || timesCounter[guid] > 0){
  45. waiter(condfunc, callback, interval, trys, guid);
  46. }
  47. } else {
  48. if(timer[guid]) clearTimeout(timer[guid]);
  49. waiter(condfunc, callback, interval, trys, guid);
  50. }
  51. }, interval);
  52. }
  53. waiter(condfunc, callback, interval, trys);
  54. }
  55. return waitUntil;
  56. })(this);
  57.  
  58. //使用示例
  59. //WaitUntil(function(){return typeof jQuery !=="undefined" && $(".test").length>0}, function(){
  60. // alert($(".test").html());
  61. //});
  62.  
  63. //其他参数
  64. //condfunc 满足条件的函数
  65. //callback 条件满足后执行的回调函数
  66. //interval 监听满足条件的时间间隔,单位毫秒,默认100
  67. //trys 尝试次数,超过这个数值就停止监听,默认为300(因默认间隔是100毫秒,所以默认停止监控时间为300*100毫秒,即30秒)
  68. //times 执行次数,默认执行1次