screenfull.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*!
  2. * screenfull
  3. * v5.0.2 - 2020-02-13
  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. var returnPromise = element[fn.requestFullscreen]();
  84. if (returnPromise instanceof Promise) {
  85. returnPromise.then(onFullScreenEntered).catch(reject);
  86. }
  87. }.bind(this));
  88. },
  89. exit: function () {
  90. return new Promise(function (resolve, reject) {
  91. if (!this.isFullscreen) {
  92. resolve();
  93. return;
  94. }
  95. var onFullScreenExit = function () {
  96. this.off('change', onFullScreenExit);
  97. resolve();
  98. }.bind(this);
  99. this.on('change', onFullScreenExit);
  100. var returnPromise = document[fn.exitFullscreen]();
  101. if (returnPromise instanceof Promise) {
  102. returnPromise.then(onFullScreenExit).catch(reject);
  103. }
  104. }.bind(this));
  105. },
  106. toggle: function (element) {
  107. return this.isFullscreen ? this.exit() : this.request(element);
  108. },
  109. onchange: function (callback) {
  110. this.on('change', callback);
  111. },
  112. onerror: function (callback) {
  113. this.on('error', callback);
  114. },
  115. on: function (event, callback) {
  116. var eventName = eventNameMap[event];
  117. if (eventName) {
  118. document.addEventListener(eventName, callback, false);
  119. }
  120. },
  121. off: function (event, callback) {
  122. var eventName = eventNameMap[event];
  123. if (eventName) {
  124. document.removeEventListener(eventName, callback, false);
  125. }
  126. },
  127. raw: fn
  128. };
  129. if (!fn) {
  130. if (isCommonjs) {
  131. module.exports = {isEnabled: false};
  132. } else {
  133. window.screenfull = {isEnabled: false};
  134. }
  135. return;
  136. }
  137. Object.defineProperties(screenfull, {
  138. isFullscreen: {
  139. get: function () {
  140. return Boolean(document[fn.fullscreenElement]);
  141. }
  142. },
  143. element: {
  144. enumerable: true,
  145. get: function () {
  146. return document[fn.fullscreenElement];
  147. }
  148. },
  149. isEnabled: {
  150. enumerable: true,
  151. get: function () {
  152. // Coerce to boolean in case of old WebKit
  153. return Boolean(document[fn.fullscreenEnabled]);
  154. }
  155. }
  156. });
  157. if (isCommonjs) {
  158. module.exports = screenfull;
  159. } else {
  160. window.screenfull = screenfull;
  161. }
  162. })();