jack преди 3 седмици
родител
ревизия
6b31b66135
променени са 1 файла, в които са добавени 18 реда и са изтрити 80 реда
  1. 18 80
      src/views/Student/index.vue

+ 18 - 80
src/views/Student/index.vue

@@ -1904,12 +1904,11 @@ const handleHomeworkSubmit = async () => {
             message.error(lang.ssFailedGetIframeBody)
             throw new Error('未能获取到iframe的body元素,无法截图')
           }
+
           try {
             const a = iframeBody.getElementsByTagName('img')
             const b = iframeBody.getElementsByTagName('video')
-            const webglCanvases = iframeBody.getElementsByTagName('canvas')
-
-
+            //const c = iframeBody.getElementsByTagName('canvas')
             iframeBody.style.cssText += 'width:100%;height:100%;position:absolute;top:0;left:0;'
             iframehtml.style.cssText += 'width:100%;height:100%;position:absolute;top:0;left:0;'
             for (let i = 0;i < a.length;i++) {
@@ -1919,83 +1918,22 @@ const handleHomeworkSubmit = async () => {
               b[i].crossOrigin = 'anonymous'
             }
             
-            try {
-              // 1. 转换所有 WebGL 画布为临时图片
-              const promises = [];
-              for (let i = 0; i < webglCanvases.length; i++) {
-                const originalCanvas = webglCanvases[i];
-                const promise = new Promise((resolve, reject) => {
-                  originalCanvas.toBlob(blob => {
-                    if (!blob) {
-                      reject(new Error('toBlob failed for canvas'));
-                      return;
-                    }
-                    const img = new Image();
-                    const url = URL.createObjectURL(blob);
-                    
-                    img.onload = () => {
-                      const rect = originalCanvas.getBoundingClientRect();
-                      img.style.position = 'absolute';
-                      img.style.left = rect.left + 'px';
-                      img.style.top = rect.top + 'px';
-                      img.style.width = originalCanvas.clientWidth + 'px';
-                      img.style.height = originalCanvas.clientHeight + 'px';
-                      img.style.zIndex = '9999';
-                      img.classList.add('temp-canvas-replacement');
-                      
-                      originalCanvas.parentNode.insertBefore(img, originalCanvas);
-                      originalCanvas.style.opacity = '0';
-                      
-                      resolve({
-                        originalCanvas,
-                        tempImage: img,
-                        blobUrl: url
-                      });
-                    };
-                    img.onerror = () => reject(new Error('Image load failed'));
-                    img.src = url;
-                  });
-                });
-                promises.push(promise);
-              }
-              
-              const replacements = await Promise.all(promises);
-
-              const html2canvas = await import('html2canvas')
-              // 2. 执行截图
-              const canvas = await html2canvas.default(iframeBody, {
-                scale: 2,
-                allowTaint: false,
-                useCORS: true,
-                logging: true,
-              });
-              
-              imageData = canvas.toDataURL('image/png', 0.95);
-              console.log('截图成功', imageData);
-              
-              // 3. 清理临时图片并恢复原画布
-              replacements.forEach(({ originalCanvas, tempImage, blobUrl }) => {
-                URL.revokeObjectURL(blobUrl);
-                tempImage.remove();
-                originalCanvas.style.opacity = '1';
-              });
-              
-              // 可选:将截图 canvas 添加到页面
-              document.body.appendChild(canvas);
-              
-              // 返回或使用 imageData
-              // return imageData;
-              
-            } catch (error) {
-              console.error('处理过程中出错:', error);
-              // 如果有部分替换成功,需要清理(这里简化处理,实际可以捕获已成功的替换)
-              // 可尝试清除所有带有 'temp-canvas-replacement' 类的图片
-              document.querySelectorAll('.temp-canvas-replacement').forEach(img => img.remove());
-              // 恢复所有被隐藏的画布
-              for (let i = 0; i < webglCanvases.length; i++) {
-                webglCanvases[i].style.opacity = '1';
-              }
-            }
+            // 直接对iframe内部的body进行截图
+            const html2canvas = await import('html2canvas')
+            const canvas = await html2canvas.default(iframeBody, {
+              // useCORS: true,
+              // allowTaint: true,
+              // scale: 1,
+              // backgroundColor: '#ffffff',
+              // logging: false,
+              // foreignObjectRendering: true,
+              // removeContainer: true
+              scale: 2, // 提高清晰度
+              allowTaint: false, // 是否允许跨域污染画布
+              useCORS: true, // 尝试跨域加载图片
+              logging: true,
+            })
+            imageData = canvas.toDataURL('image/png', 0.95)
             
             console.log('成功截图iframe内部内容')
           }