inject.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. window.Tracker = window.Tracker || {};
  2. /**
  3. * 此脚本是用于注入被检测的iframe中的,因为page-script无法与content-script交互,所以可以用一个button来作为代理
  4. * @param window
  5. * @param document
  6. * @constructor
  7. * @author xianliezhao
  8. */
  9. Tracker.Inject = function (window, document) {
  10. var getProxyEl = function () {
  11. return top.document.getElementById('btnTrackerProxy');
  12. };
  13. /**
  14. * 队列管理器
  15. * 钩子“tracker”会执行的非常频繁,如果每次执行都去trigger proxy click,性能会极其低下,所以需要用一个队列来批量执行
  16. */
  17. var QueueMgr = (function () {
  18. var _queue = [];
  19. var _limit = 500;
  20. var _lastPopTime = 0;
  21. // 检测队列是否已满
  22. var full = function () {
  23. return _queue.length >= _limit;
  24. };
  25. // 入队列
  26. var push = function (item) {
  27. _queue.push(item);
  28. };
  29. // 全部出队列
  30. var popAll = function () {
  31. var result = _queue.join(',');
  32. _queue = [];
  33. _lastPopTime = new Date().getTime();
  34. return result;
  35. };
  36. // 判断距离上一次出队列是否已经大于200ms
  37. var timesUp = function () {
  38. return (new Date().getTime() - _lastPopTime) >= 100;
  39. };
  40. return {
  41. full: full,
  42. timesUp: timesUp,
  43. push: push,
  44. pop: popAll
  45. };
  46. })();
  47. window.__tracker__ = function (groupId) {
  48. // 先入队列,不丢下任何一条消息
  49. QueueMgr.push(groupId);
  50. // 队列已满 or 等待时间到了
  51. if (QueueMgr.full() || QueueMgr.timesUp()) {
  52. var allGroupIds = QueueMgr.pop();
  53. var proxy = getProxyEl();
  54. proxy.setAttribute('data-type', '__tracker__');
  55. proxy.setAttribute('data-groupId', allGroupIds);
  56. proxy.click();
  57. }
  58. };
  59. window.__trackerError__ = function (codeId, msg) {
  60. var proxy = getProxyEl();
  61. proxy.setAttribute('data-type', '__trackerError__');
  62. proxy.setAttribute('data-codeId', codeId);
  63. proxy.setAttribute('data-msg', msg);
  64. proxy.click();
  65. };
  66. window.__trackerMockTop__ = function () {
  67. var proxy = getProxyEl();
  68. proxy.setAttribute('data-type', '__trackerMockTop__');
  69. proxy.click();
  70. };
  71. window.__trackerScriptStart__ = function (codeId, scriptTagIndex) {
  72. var proxy = getProxyEl();
  73. proxy.setAttribute('data-type', '__trackerScriptStart__');
  74. proxy.setAttribute('data-codeId', codeId);
  75. proxy.setAttribute('data-scriptTagIndex', scriptTagIndex);
  76. proxy.click();
  77. };
  78. window.__trackerScriptEnd__ = function (codeId) {
  79. var proxy = getProxyEl();
  80. proxy.setAttribute('data-type', '__trackerScriptEnd__');
  81. proxy.setAttribute('data-codeId', codeId);
  82. proxy.click();
  83. };
  84. window.onbeforeunload = function () {
  85. var proxy = getProxyEl();
  86. proxy.setAttribute('data-type', 'onbeforeunload');
  87. proxy.click();
  88. }();
  89. };
  90. Tracker.Inject(window, document);