H5GamesPreview.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <!-- eslint-disable vue/no-v-html -->
  2. <template>
  3. <div class="imageText-preview" :style="getAreaStyle()">
  4. <SerialNumberPosition v-if="isEnable(data.property.sn_display_mode)" :property="data.property" />
  5. <div ref="fullscreenElement">
  6. <el-button
  7. type="primary"
  8. :class="[full_type ? 'exit-btn' : '']"
  9. style="margin-bottom: 10px"
  10. :style="{
  11. background:
  12. data.unified_attrib && data.unified_attrib.topic_color ? data.unified_attrib.topic_color : '#165dff',
  13. borderColor:
  14. data.unified_attrib && data.unified_attrib.topic_color ? data.unified_attrib.topic_color : '#165dff',
  15. }"
  16. @click="toggleFullScreen"
  17. >{{ full_type ? convertText('退出全屏') : convertText('进入全屏') }}</el-button
  18. >
  19. <iframe
  20. :src="games_url"
  21. width="100%"
  22. :height="full_type ? '100%' : isMobile ? '400px' : '580px'"
  23. style="border: none"
  24. ></iframe>
  25. </div>
  26. </div>
  27. </template>
  28. <script>
  29. import PreviewMixin from '../common/PreviewMixin';
  30. import { getH5GamesData } from '@/views/book/courseware/data/h5Games';
  31. import { H5StartupFile } from '@/api/app';
  32. export default {
  33. name: 'H5GamesPreview',
  34. components: {},
  35. mixins: [PreviewMixin],
  36. props: {
  37. isMobile: {
  38. type: Boolean,
  39. default: false,
  40. },
  41. },
  42. data() {
  43. return {
  44. data: getH5GamesData(),
  45. games_url: '',
  46. full_type: false,
  47. };
  48. },
  49. watch: {
  50. 'data.file_list.length': {
  51. handler() {
  52. this.initData();
  53. },
  54. },
  55. },
  56. created() {
  57. this.initData();
  58. },
  59. mounted() {},
  60. methods: {
  61. initData() {
  62. this.data.file_list.forEach((item) => {
  63. const suffix = item.file_url.slice(item.file_url.lastIndexOf('.') + 1, item.file_url.length).toLowerCase();
  64. if (suffix === 'html') {
  65. this.games_url = item.file_url;
  66. } else {
  67. H5StartupFile({ file_id: item.file_id, index_file_name: 'index.html' }).then((res) => {
  68. this.games_url = res.file_url;
  69. });
  70. }
  71. });
  72. },
  73. toggleFullScreen() {
  74. const elem = this.$refs.fullscreenElement; // 获取需要全屏的元素
  75. if (!document.fullscreenElement) {
  76. this.full_type = true;
  77. if (elem.requestFullscreen) {
  78. elem.requestFullscreen(); // 现代浏览器,如Chrome, Firefox, Opera, Safari等
  79. } else if (elem.mozRequestFullScreen) {
  80. // Firefox
  81. elem.mozRequestFullScreen();
  82. } else if (elem.webkitRequestFullscreen) {
  83. // Chrome, Safari等
  84. elem.webkitRequestFullscreen();
  85. } else if (elem.msRequestFullscreen) {
  86. // IE/Edge
  87. elem.msRequestFullscreen();
  88. }
  89. } else {
  90. this.full_type = false;
  91. if (document.exitFullscreen) {
  92. document.exitFullscreen(); // 退出全屏模式
  93. } else if (document.mozCancelFullScreen) {
  94. // Firefox
  95. document.mozCancelFullScreen();
  96. } else if (document.webkitExitFullscreen) {
  97. // Chrome, Safari等
  98. document.webkitExitFullscreen();
  99. } else if (document.msExitFullscreen) {
  100. // IE/Edge
  101. document.msExitFullscreen();
  102. }
  103. }
  104. },
  105. },
  106. };
  107. </script>
  108. <style lang="scss" scoped>
  109. @use '@/styles/mixin.scss' as *;
  110. .exit-btn {
  111. position: fixed;
  112. top: 10px;
  113. left: 10px;
  114. }
  115. </style>