window.open打开的页面怎样显示在全屏application之前

解决全屏程序与新窗口显示优先级问题
本文探讨了在使用SWT开发的全屏程序环境下,如何通过特定方法确保新打开的窗口能够在全屏程序之前显示,避免了浏览器事件操作带来的IE反对现象。重点介绍了使用`window.showModelessDialog`实现非模式窗口优先显示的方法,并对比了其与模式窗口的区别。

如题:

 

当我用window.open打开一个新页面的时候,如果当前是有全屏的程序(比如一个用SWT开发的总是显示最前的程序)在的,并且全屏的程序也是置顶显示的,那么怎么才能让我新打开的页面在全屏程序之前呢?

 

貌似这个是IE一直在反对的?因为感觉这样相当于操作浏览器的事件。。。

 

我试过window.showModelessDialog弹出的页面是显示在最前的,但非模式窗口是多线程的,也就是当有新窗口打开时,总是打开一个新的窗口,不能在同一个窗口中打开。

<template> <!-- 所有 UI 隐藏 --> <view class="container" style="display: none;"> <!-- 隐藏的 file input(备用) --> <input type="file" ref="fileInputRef" :accept="acceptTypes" :multiple="!isSingle" @change="handleFiles" style="display: none;" /> </view> </template> <script setup> import { ref, onMounted } from 'vue' // 解析 URL 参数 const getUrlParameter = (name) => { const regex = new RegExp(`[?&]${name}=([^&#]*)`) const results = regex.exec(window.location.search) return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')) } // 从 URL 获取配置参数 const maxCount = ref(parseInt(getUrlParameter('maxCount')) || 10) // 最大文件数 const maxSize = ref(parseInt(getUrlParameter('maxSize')) * 1024 * 1024 || Infinity) // 最大单文件大小(单位 MB) const acceptParam = getUrlParameter('accept') || '' const acceptTypes = ref( acceptParam || 'image/*,video/*,.pdf,.doc,.docx,.xls,.xlsx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document' ) const isSingle = ref(getUrlParameter('isSingle') === 'true') // 是否单选 // 存储已选文件 const files = ref([]) // 工具函数:格式化文件大小 const formatSize = (bytes) => { if (!bytes) return '0 B' const k = 1024 const sizes = ['B', 'KB', 'MB', 'GB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] } // 工具函数:获取文件扩展名 const getFileExt = (filename) => { if (!filename) return '' const match = filename.trim().toLowerCase().match(/\.([a-z0-9]+)$/) return match ? match[1] : '' } // 读取文件为 base64(仅元数据时可跳过,这里保留结构灵活性) const readFileAsBase64 = (file) => { return new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = () => resolve(reader.result) reader.onerror = () => reject(new Error('文件读取失败')) reader.readAsDataURL(file) }) } // 触发系统文件选择器 const triggerFileInput = () => { const input = document.createElement('input') input.type = 'file' input.accept = acceptTypes.value input.multiple = !isSingle.value input.style.display = 'none' document.body.appendChild(input) input.onchange = async (event) => { await handleFiles(event) document.body.removeChild(input) // 清理 } input.click() // 打开选择器 } // 处理文件选择事件 const handleFiles = async (event) => { const selectedFiles = event.target.files if (!selectedFiles || selectedFiles.length === 0) { // 即使未选择,也通知小程序空数组 sendFilesToMiniProgram([]) closePage() return } const remainingSlots = maxCount.value - files.value.length const filesToProcess = Array.from(selectedFiles).slice(0, remainingSlots) for (const file of filesToProcess) { if (file.size > maxSize.value) { console.warn(`文件 "${file.name}" 超出大小限制 (${formatSize(maxSize.value)})`) continue } try { // 只读取元信息,不强制读 base64(节省性能) // 若需 base64 可取消注释下一行 // const base64 = await readFileAsBase64(file) files.value.push({ name: file.name, size: file.size, type: file.type, // base64, // 按需开启 }) } catch (err) { console.error(`处理文件失败: ${file.name}`, err) } } // 发送文件信息给小程序 sendFilesToMiniProgram(files.value) // 完成后关闭或返回 closePage() } // 发送消息到小程序 const sendFilesToMiniProgram = (fileList) => { const fileInfo = fileList.map(file => ({ name: file.name, size: file.size, type: file.type, // base64: file.base64 // 可选:传 base64,注意长度限制(通常不超过 10MB) })) console.log('[H5 → 小程序] 发送文件列表:', fileInfo) // 方法1:标准 postMessage(推荐) window.parent.postMessage?.({ type: 'selectedFiles', data: fileInfo }, '*') // 方法2:兼容旧写法 window.postMessage?.({ type: 'selectedFiles', data: fileInfo }, '*') } // 尝试关闭当前页面或返回 const closePage = () => { setTimeout(() => { // 微信浏览器中 web-view 无法直接 close,应优先 back if (window.history.length > 1) { window.history.back() } else { // 尝试关闭(仅在 window.open 打开时有效) window.open('', '_self') window.close() } }, 600) } // 页面加载完成后自动触发文件选择 onMounted(() => { console.log('页面已挂载,即将自动触发文件选择...') // 延迟确保 DOM 和环境准备就绪 setTimeout(triggerFileInput, 300) }) </script> <style scoped> /* 确保完全隐藏界面 */ .container { display: none; } </style> 进入页面后未正常出现文件选择界面
最新发布
09-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值