screenfull.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*!
  2. * screenfull
  3. * v5.0.0 - 2019-09-09
  4. * (c) Sindre Sorhus; MIT License
  5. */
  6. (function () {
  7. 'use strict';
  8. var document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};
  9. var isCommonjs = typeof module !== 'undefined' && module.exports;
  10. var fn = (function () {
  11. var val;
  12. var fnMap = [
  13. [
  14. 'requestFullscreen',
  15. 'exitFullscreen',
  16. 'fullscreenElement',
  17. 'fullscreenEnabled',
  18. 'fullscreenchange',
  19. 'fullscreenerror'
  20. ],
  21. // New WebKit
  22. [
  23. 'webkitRequestFullscreen',
  24. 'webkitExitFullscreen',
  25. 'webkitFullscreenElement',
  26. 'webkitFullscreenEnabled',
  27. 'webkitfullscreenchange',
  28. 'webkitfullscreenerror'
  29. ],
  30. // Old WebKit
  31. [
  32. 'webkitRequestFullScreen',
  33. 'webkitCancelFullScreen',
  34. 'webkitCurrentFullScreenElement',
  35. 'webkitCancelFullScreen',
  36. 'webkitfullscreenchange',
  37. 'webkitfullscreenerror'
  38. ],
  39. [
  40. 'mozRequestFullScreen',
  41. 'mozCancelFullScreen',
  42. 'mozFullScreenElement',
  43. 'mozFullScreenEnabled',
  44. 'mozfullscreenchange',
  45. 'mozfullscreenerror'
  46. ],
  47. [
  48. 'msRequestFullscreen',
  49. 'msExitFullscreen',
  50. 'msFullscreenElement',
  51. 'msFullscreenEnabled',
  52. 'MSFullscreenChange',
  53. 'MSFullscreenError'
  54. ]
  55. ];
  56. var i = 0;
  57. var l = fnMap.length;
  58. var ret = {};
  59. for (; i < l; i++) {
  60. val = fnMap[i];
  61. if (val && val[1] in document) {
  62. for (i = 0; i < val.length; i++) {
  63. ret[fnMap[0][i]] = val[i];
  64. }
  65. return ret;
  66. }
  67. }
  68. return false;
  69. })();
  70. var eventNameMap = {
  71. change: fn.fullscreenchange,
  72. error: fn.fullscreenerror
  73. };
  74. var screenfull = {
  75. request: function (element) {
  76. return new Promise(function (resolve, reject) {
  77. var onFullScreenEntered = function () {
  78. this.off('change', onFullScreenEntered);
  79. resolve();
  80. }.bind(this);
  81. this.on('change', onFullScreenEntered);
  82. element = element || document.documentElement;
  83. Promise.resolve(element[fn.requestFullscreen]()).catch(reject);
  84. }.bind(this));
  85. },
  86. exit: function () {
  87. return new Promise(function (resolve, reject) {
  88. if (!this.isFullscreen) {
  89. resolve();
  90. return;
  91. }
  92. var onFullScreenExit = function () {
  93. this.off('change', onFullScreenExit);
  94. resolve();
  95. }.bind(this);
  96. this.on('change', onFullScreenExit);
  97. Promise.resolve(document[fn.exitFullscreen]()).catch(reject);
  98. }.bind(this));
  99. },
  100. toggle: function (element) {
  101. return this.isFullscreen ? this.exit() : this.request(element);
  102. },
  103. onchange: function (callback) {
  104. this.on('change', callback);
  105. },
  106. onerror: function (callback) {
  107. this.on('error', callback);
  108. },
  109. on: function (event, callback) {
  110. var eventName = eventNameMap[event];
  111. if (eventName) {
  112. document.addEventListener(eventName, callback, false);
  113. }
  114. },
  115. off: function (event, callback) {
  116. var eventName = eventNameMap[event];
  117. if (eventName) {
  118. document.removeEventListener(eventName, callback, false);
  119. }
  120. },
  121. raw: fn
  122. };
  123. if (!fn) {
  124. if (isCommonjs) {
  125. module.exports = {isEnabled: false};
  126. } else {
  127. window.screenfull = {isEnabled: false};
  128. }
  129. return;
  130. }
  131. Object.defineProperties(screenfull, {
  132. isFullscreen: {
  133. get: function () {
  134. return Boolean(document[fn.fullscreenElement]);
  135. }
  136. },
  137. element: {
  138. enumerable: true,
  139. get: function () {
  140. return document[fn.fullscreenElement];
  141. }
  142. },
  143. isEnabled: {
  144. enumerable: true,
  145. get: function () {
  146. // Coerce to boolean in case of old WebKit
  147. return Boolean(document[fn.fullscreenEnabled]);
  148. }
  149. }
  150. });
  151. if (isCommonjs) {
  152. module.exports = screenfull;
  153. } else {
  154. window.screenfull = screenfull;
  155. }
  156. })();