3 Commits bf692e9a53 ... bef81db0b2

Author SHA1 Message Date
  lsc bef81db0b2 update 6 days ago
  lsc a42ba62b3f update 6 days ago
  lsc 54b81463d0 update 6 days ago

+ 9 - 2
src/views/Student/index.vue

@@ -146,7 +146,7 @@
               <div class="slide-bottom-right" v-if="!isFullscreen">
                 <Refresh class="tool-btn" v-tooltip="lang.ssRefresh" @click="handleRefreshPage" v-if="currentSlideHasIframe && !currentSlideHasEnglishSpeaking"/>
                 <!-- <UpTwo @click="handleHomeworkSubmit" v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && !isSubmitting" class="tool-btn upBtn" v-tooltip="lang.ssSubmitHW"/> -->
-                <svg @click="handleHomeworkSubmit" v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && !isSubmitting && !currentSlideHasEnglishSpeaking" class="tool-btn upBtn" v-tooltip="lang.ssSubmitHW" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
+                <svg @click="handleHomeworkSubmit" v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && !isSubmitting && !currentSlideHasEnglishSpeaking && currentSlideIframeReady" class="tool-btn upBtn" v-tooltip="lang.ssSubmitHW" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
                   <!-- Document body -->
                   <path d="M15 10 L15 90 Q15 95 20 95 L80 95 Q85 95 85 90 L85 35 L60 10 Z"
                         fill="none" stroke="currentColor" stroke-width="6" stroke-linejoin="round" stroke-linecap="round"/>
@@ -181,7 +181,7 @@
         </div>
 
         <!-- 作业提交按钮 - 当当前幻灯片包含iframe时显示(排除B站视频) -->
-        <div v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && isFullscreen && !currentSlideHasEnglishSpeaking" class="homework-submit-btn" :class="{ 'submitting': isSubmitting }"
+        <div v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && isFullscreen && !currentSlideHasEnglishSpeaking && currentSlideIframeReady" class="homework-submit-btn" :class="{ 'submitting': isSubmitting }"
           :style="{ right: getHomeworkButtonRight() + 'px' }" @click="handleHomeworkSubmit"
           v-tooltip="isSubmitting ? lang.ssHwSubmitting : lang.ssHwSubmit">
           <!-- <IconEdit v-if="!isSubmitting" class="tool-btn" />
@@ -1088,6 +1088,13 @@ const currentSlideHasIframe = computed(() => {
   return elementList.value.some(element => element.type === ElementTypes.FRAME)
 })
 
+// 当前幻灯片的所有 iframe 是否都已 isDone 且 frameloading 已结束
+const currentSlideIframeReady = computed(() => {
+  const frames = elementList.value.filter(element => element.type === ElementTypes.FRAME)
+  if (frames.length === 0) return true
+  return frames.every(frame => frame.isDone === true && (frame as any).iframeLoading !== true)
+})
+
 const currentSlideToolType = computed(() => {
   const frame = elementList.value.find(element => element.type === ElementTypes.FRAME)
   return Number((frame as any)?.toolType) || 0

+ 9 - 2
src/views/Student/index2.vue

@@ -146,7 +146,7 @@
               <div class="slide-bottom-right" v-if="!isFullscreen">
                 <Refresh class="tool-btn" v-tooltip="lang.ssRefresh" @click="handleRefreshPage" v-if="currentSlideHasIframe && !currentSlideHasEnglishSpeaking"/>
                 <!-- <UpTwo @click="handleHomeworkSubmit" v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && !isSubmitting" class="tool-btn upBtn" v-tooltip="lang.ssSubmitHW"/> -->
-                <svg @click="handleHomeworkSubmit" v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && !isSubmitting && !currentSlideHasEnglishSpeaking" class="tool-btn upBtn" v-tooltip="lang.ssSubmitHW" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
+                <svg @click="handleHomeworkSubmit" v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && !isSubmitting && !currentSlideHasEnglishSpeaking && currentSlideIframeReady" class="tool-btn upBtn" v-tooltip="lang.ssSubmitHW" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
                   <!-- Document body -->
                   <path d="M15 10 L15 90 Q15 95 20 95 L80 95 Q85 95 85 90 L85 35 L60 10 Z"
                         fill="none" stroke="currentColor" stroke-width="6" stroke-linejoin="round" stroke-linecap="round"/>
@@ -181,7 +181,7 @@
         </div>
 
         <!-- 作业提交按钮 - 当当前幻灯片包含iframe时显示(排除B站视频) -->
-        <div v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && isFullscreen && !currentSlideHasEnglishSpeaking" class="homework-submit-btn" :class="{ 'submitting': isSubmitting }"
+        <div v-if="currentSlideHasIframe && !currentSlideHasBilibiliVideo && isFullscreen && !currentSlideHasEnglishSpeaking && currentSlideIframeReady" class="homework-submit-btn" :class="{ 'submitting': isSubmitting }"
           :style="{ right: getHomeworkButtonRight() + 'px' }" @click="handleHomeworkSubmit"
           v-tooltip="isSubmitting ? lang.ssHwSubmitting : lang.ssHwSubmit">
           <!-- <IconEdit v-if="!isSubmitting" class="tool-btn" />
@@ -1082,6 +1082,13 @@ const currentSlideHasIframe = computed(() => {
   return elementList.value.some(element => element.type === ElementTypes.FRAME)
 })
 
+// 当前幻灯片的所有 iframe 是否都已 isDone 且 frameloading 已结束
+const currentSlideIframeReady = computed(() => {
+  const frames = elementList.value.filter(element => element.type === ElementTypes.FRAME)
+  if (frames.length === 0) return true
+  return frames.every(frame => frame.isDone === true && (frame as any).iframeLoading !== true)
+})
+
 const currentSlideToolType = computed(() => {
   const frame = elementList.value.find(element => element.type === ElementTypes.FRAME)
   return Number((frame as any)?.toolType) || 0

+ 11 - 1
src/views/components/element/FrameElement/BaseFrameElement.vue

@@ -309,6 +309,11 @@ const getTypeLabel = (type: number): string => {
 
 const frameloading = ref(false)
 
+// 把 frameloading 同步到 slidesStore 元素数据,父页面(Student)可汇总判断 iframe 是否全部 ready
+watch(frameloading, (val) => {
+  slidesStore.updateElement({ id: props.elementInfo.id, props: { iframeLoading: val } })
+})
+
 // toolType=74 视频播放时:释放其他所有 video 的 src → 自己挂 src → play
 const onVideoPlay = () => {
   const video = video74Ref.value
@@ -332,7 +337,12 @@ const onVideoPlay = () => {
 
 // toolType=74 video 生命周期注册(manager track meta + release)
 onMounted(() => {
-  if (video74Ref.value) manager.register(video74Ref.value)
+  const v = video74Ref.value
+  if (!v) return
+  manager.register(v)
+  // ★ mount 时就挂 src(preload=none 不会立即下载),否则 native controls 的 ▶ 按钮
+  // 内部 play() 会因无 src 直接失败,@play 事件不触发 → onVideoPlay 永远跑不到
+  if (!v.src && elementInfo.url) v.src = elementInfo.url
 })
 onBeforeUnmount(() => {
   if (video74Ref.value) manager.unregister(video74Ref.value)