监听iframe路由变化

时间: 2023-07-06 20:43:31 浏览: 65
要监听一个 `iframe` 的路由变化,可以使用 `window.onhashchange` 事件和 `window.location.hash` 属性。当 `iframe` 的路由发生变化时,会触发 `window.onhashchange` 事件,我们可以在事件处理程序中获取 `iframe` 的当前路由信息。 以下是一个示例代码,假设我们有一个 `iframe` 元素的 `id` 是 `myFrame`: ```javascript // 获取 iframe 对象 var myFrame = document.getElementById('myFrame'); // 监听 window.onhashchange 事件 window.onhashchange = function() { // 获取 iframe 当前的路由信息 var iframeHash = myFrame.contentWindow.location.hash; console.log('iframe 路由变化:', iframeHash); }; ``` 在上面的代码中,我们获取了 `myFrame` 元素的对象,并监听了 `window.onhashchange` 事件。当事件触发时,我们通过 `myFrame.contentWindow.location.hash` 获取了 `iframe` 内部的路由信息,并将其打印到控制台上。 需要注意的是,如果 `iframe` 的源与主页面的源不同,那么在监听 `iframe` 的路由变化时,需要处理跨域访问限制的问题。
相关问题

iframe嵌套vue页面

iframe是一个HTML标签,用于在网页中嵌入另一个HTML页面。Vue是一个用于构建Web用户界面的JavaScript框架。当我们需要将Vue页面嵌套在iframe中时,需要注意以下几点。 首先,因为Vue是单页应用程序(SPA),所以它的路由是基于浏览器的history API。在iframe中,浏览器的历史记录是独立的,因此需要在Vue路由中使用base选项。 其次,由于iframe中的内容是异步加载的,所以需要使用Vue的异步组件来确保Vue组件在iframe中渲染之前加载。对于异步组件,Vue提供了两种方式:通过工厂函数返回组件或使用动态import(ES2015特性)。 最后,与普通的Vue应用程序不同,iframe中的Vue应用程序需要与宿主页面进行通信。通过postMessage() API,可以通过消息传递进行跨域通信。需要在Vue应用程序中监听消息,处理来自宿主页面的消息。同时,在宿主页面中,需要订阅来自iframe中Vue应用程序发送的消息。 总之,将Vue页面嵌套在iframe中需要注意Vue路由中的base选项、使用异步组件和处理宿主页面与iframe中Vue应用程序之间的跨域通信。这样才能确保Vue应用程序在iframe中正常渲染并与宿主页面进行通信。

router-view 换成iframe

你可以将router-view替换为iframe来显示外链页面。可以通过以下步骤来实现: 1. 在使用vue-router的时候,确保你已经安装了vue-router,并且在main.js中正确引入了Vue、App和router。 2. 在router中定义你的路由配置,包括内嵌的组件和外链的URL。 3. 在App.vue中将router-view替换为iframe标签,并通过watch监听路由的变化。 4. 在watch的回调函数中,使用.slice(0, 4)来判断是否是外链URL。如果是外链URL,则使用iframe来显示;如果不是外链URL,则继续使用router-view来显示组件。 以下是一个示例代码片段,展示了如何将router-view替换为iframe: ```javascript // main.js import Vue from 'vue'; import App from './App'; import router from './router'; new Vue({ router, render: h => h(App) }).$mount('#app'); // App.vue <template> <div id="app"> <iframe v-if="isExternalLink" :src="currentRoute"></iframe> <router-view v-else></router-view> </div> </template> <script> export default { data() { return { currentRoute: '', isExternalLink: false }; }, watch: { $route(to) { this.currentRoute = to.path; this.isExternalLink = this.currentRoute.slice(0, 4) === 'http'; } } }; </script> ``` 请注意,以上代码仅作为示例,具体实现还需要根据你的项目结构和需求进行适当调整。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [vue-router 中router-view不能渲染的解决方法](https://download.csdn.net/download/weixin_38663608/13582607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue3 二级路由-内嵌外链解决方案(iframe)](https://blog.csdn.net/qq_28805447/article/details/127566199)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

相关推荐

/* * @Author: LinLong * @LastEditors: LinLong * @Description: 上课进度上传 */ import { ref, onMounted, onUnmounted } from 'vue' import { getItem, setItem } from '@/hooks' import { uselearningProgress } from '@/stores' import { updatedLearningProgress } from '@/apiList/learningProgress' const learningProgressStore = uselearningProgress() //学习进度仓库 const currentProgressFile = ref(null) //当前学习进度文件 const heartbeatTime = 30 * 1000 //30秒 let timer = null //时间函数 export function useClassProgress(onBeforeRouteLeave) { //从仓库获取用户点击的课程->项目->任务->文件 learningProgressStore.$subscribe((mutation, state) => { const { currentProgress } = state // console.log('%c--currentProgress-->', 'background:#18C36E;color:#3F4040;', currentProgress) currentProgressFile.value = { classId: currentProgress.classId, courseId: currentProgress.courseId, courseId_text: currentProgress.courseId_text, projectId: currentProgress.pid == 0 ? currentProgress.id : currentProgress.pid, // projectId: currentProgress.id, taskId: currentProgress.pid == 0 ? null : currentProgress.id, pid_text: currentProgress.pid_text, name: currentProgress.name, file: currentProgress.url, userId: getItem('userInfo').id, } // console.log('%c-----state 学习进度------->', 'background:#18C36E;color:#3F4040;', currentProgress) }) //生命周期页面挂载完毕 onMounted(() => { //接收iframe 异步框架消息 window.addEventListener('message', (e) => { if (e.origin.includes('8013')) { const data = e.data setItem('postMessage', data) // console.log('%c-----监听postMessage子级------->', 'background:#18C36E;color:#3F4040;', JSON.parse(data)) } }) //浏览器tab标签切换或最小化事件设置暂停提交 上课记录 document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') { timer ? clearTimeout(timer) : (timer = null) //清除定时器 } else if (document.visibilityState === 'visible') { timer ? clearTimeout(timer) : (timer = null) //先清除一次定时器 sendMessage() //继续发送学习进度 } }) //发送统计信息至后端 sendMessage() function sendMessage() { console.log('%c---对方水电费水电费水电费->', 'background:#18C36E;color:#3F4040;') timer ? clearTimeout(timer) : (timer = false) //先清除一次定时器 timer = setTimeout(() => { const sendData = { ...getItem('postMessage'), ...currentProgressFile.value, } // console.log('%c------准备发送的信息sendData------>', 'background:#18C36E;color:#3F4040;', sendData) updatedLearningProgress(sendData).then((res) => { if (res.success) sendMessage() }) }, heartbeatTime) //heartbeatTime } }) //生命周期页面销毁之前 onUnmounted(() => { clearTimeout(timer) // //路由离开 // onBeforeRouteLeave(() => { // clearTimeout(timer) // }) }) }

最新推荐

recommend-type

Python持续监听文件变化代码实例

主要介绍了Python持续监听文件变化代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

AngularJS 监听变量变化的实现方法

今天小编就为大家分享一篇AngularJS 监听变量变化的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Vue 监听元素前后变化值实例

我就废话不多说了,大家还是直接看代码吧~ export default { data() { return { item: '' } }, watch: { item(now, before){ let remove = before.filter(x =&gt; now.indexOf(x)...补充知识:Vuejs+Element监听-
recommend-type

vue 监听屏幕高度的实例

项目用vue版本是2.0的,项目中用到es6 首先需要在data里面定义页面的高度 data (){ return { fullHeight: document.documentElement.clientHeight } } 把[removed]事件挂在到mounted mounted() { ...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依