screenfull.js 3.5 KB

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