object.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.createSensor = void 0;
  6. var _debounce = _interopRequireDefault(require("../debounce"));
  7. var _constant = require("../constant");
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
  9. /**
  10. * Created by hustcc on 18/6/9.
  11. * Contract: i@hust.cc
  12. */
  13. var createSensor = function createSensor(element) {
  14. var sensor = undefined; // callback
  15. var listeners = [];
  16. /**
  17. * create object DOM of sensor
  18. * @returns {HTMLObjectElement}
  19. */
  20. var newSensor = function newSensor() {
  21. // adjust style
  22. if (getComputedStyle(element).position === 'static') {
  23. element.style.position = 'relative';
  24. }
  25. var obj = document.createElement('object');
  26. obj.onload = function () {
  27. obj.contentDocument.defaultView.addEventListener('resize', resizeListener); // 直接触发一次 resize
  28. resizeListener();
  29. };
  30. obj.style.display = 'block';
  31. obj.style.position = 'absolute';
  32. obj.style.top = '0';
  33. obj.style.left = '0';
  34. obj.style.height = '100%';
  35. obj.style.width = '100%';
  36. obj.style.overflow = 'hidden';
  37. obj.style.pointerEvents = 'none';
  38. obj.style.zIndex = '-1';
  39. obj.style.opacity = '0';
  40. obj.setAttribute('class', _constant.SensorClassName);
  41. obj.setAttribute('tabindex', _constant.SensorTabIndex);
  42. obj.type = 'text/html'; // append into dom
  43. element.appendChild(obj); // for ie, should set data attribute delay, or will be white screen
  44. obj.data = 'about:blank';
  45. return obj;
  46. };
  47. /**
  48. * trigger listeners
  49. */
  50. var resizeListener = (0, _debounce["default"])(function () {
  51. // trigger all listener
  52. listeners.forEach(function (listener) {
  53. listener(element);
  54. });
  55. });
  56. /**
  57. * listen with one callback function
  58. * @param cb
  59. */
  60. var bind = function bind(cb) {
  61. // if not exist sensor, then create one
  62. if (!sensor) {
  63. sensor = newSensor();
  64. }
  65. if (listeners.indexOf(cb) === -1) {
  66. listeners.push(cb);
  67. }
  68. };
  69. /**
  70. * destroy all
  71. */
  72. var destroy = function destroy() {
  73. if (sensor && sensor.parentNode) {
  74. if (sensor.contentDocument) {
  75. // remote event
  76. sensor.contentDocument.defaultView.removeEventListener('resize', resizeListener);
  77. } // remove dom
  78. sensor.parentNode.removeChild(sensor); // initial variable
  79. sensor = undefined;
  80. listeners = [];
  81. }
  82. };
  83. /**
  84. * cancel listener bind
  85. * @param cb
  86. */
  87. var unbind = function unbind(cb) {
  88. var idx = listeners.indexOf(cb);
  89. if (idx !== -1) {
  90. listeners.splice(idx, 1);
  91. } // no listener, and sensor is exist
  92. // then destroy the sensor
  93. if (listeners.length === 0 && sensor) {
  94. destroy();
  95. }
  96. };
  97. return {
  98. element: element,
  99. bind: bind,
  100. destroy: destroy,
  101. unbind: unbind
  102. };
  103. };
  104. exports.createSensor = createSensor;