screenfull.js 3.4 KB

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