场景是有一个主应用里面有多个子应用,其中a应用嵌入iframe(b应用)展示,可点击弹窗大屏展示;
问题1:a应用进来iframe展示操作没问题,但是点击大屏显示的时候控制台明明打印出来数据但是b应用页面没更新,使用强制刷新forceUpdate和局部刷新this.$nextTick都不好使,使用v-if也是初次进来有触发信息但是页面还是没有显示
问题2:c应用引入iframe(b应用),有复制和发送功能呢触发后postMessage给c应用,在谷歌浏览器操作时好使的,在360上报浏览器安全问题
Blocked a frame with origin "https://www.123.com" from accessing a cross-origin frame.
代码模拟:
<el-drawer title="我是标题" size="80%" :visible.sync="drawer" :with-header="false" :direction="direction"> <iframeTest v-if="drawer"></iframeTest> </el-drawer> <div style="margin-top: 20px"> <el-tabs v-model="activeName" @tab-click="handleClick"> <el-tab-pane label="智能辅助" name="global"> <iframeTest v-if="this.activeName === 'global'"></iframeTest> <div> <el-button @click="drawerClick" type="primary" style="margin-left: 16px"> 点我打开 </el-button> </div> </el-tab-pane> <el-tab-pane label="售后处理" name="channel">售后处理</el-tab-pane> </el-tabs> </div>
// 子组件<template> <div class="iframeTest pd20"> <iframe id="saasAiAssist" width="100%" height="500px" @load="iframeUpdatedHandle" src="引入地址" frameborder="0" scrolling="auto" class="iframe-con"></iframe> </div></template><script> export default { name: 'iframeTest', // components: {}, data() { return { drawer: false, direction: 'rtl' }; }, // created() {}, methods: { iframeUpdatedHandle() { const iframe = document.getElementById('saasAiAssist'); const res = { isSend: false, isUsage: false }; // res为可以往智能辅助的传递数据(当前需求是区分在线和电话,可以直接用module判断,后期数据多的话可以放到res里面) // type必传(父传子默认parent)moudule必传source必传res非必传 const messageObject = { type: 'parent', module: '自定义form应用', source: 'source-a', res }; iframe.contentWindow.postMessage(messageObject, '*'); } } };</script><style lang="scss" scoped> .pd20 { padding: 20px; }</style>
在iframe的src后面加个随机数/时间戳试下
这个问题涉及到Web安全和跨域资源共享(CORS)的问题。
问题1:在您的情况下,尽管控制台已经打印出了数据,但b应用的页面没有更新。这可能是由于页面没有正确地接收到更新的数据,或者在页面加载时有一些错误。请确保在b应用的iframe中正确地接收到数据,并检查是否有任何错误导致页面未能正确加载。您可能需要查看更多的控制台错误以确定问题的具体原因。
问题2:在您的代码中,您尝试通过postMessage将信息从一个iframe(b应用)发送到另一个iframe(c应用)。在谷歌浏览器中,这个操作是可行的,但在360浏览器中,您收到了一个安全错误。这是因为360浏览器阻止了跨域资源共享(CORS)。
CORS是一种Web安全机制,它阻止了一个网页的页面脚本(例如JavaScript)访问另一个网页的资源,除非那个网页明确地允许这种访问。这种机制是为了防止恶意脚本对用户的个人信息进行访问和利用。
在这种情况下,您需要确保b应用和c应用都允许彼此之间的跨域资源共享。这通常需要在服务器端进行配置,对于允许跨域请求的URL,需要在响应头中添加 Access-Control-Allow-Origin
,并且对于所有的请求(包括POST、GET等),都需要添加 Access-Control-Allow-Methods
。
如果您无法修改服务器端的配置,那么您可能需要考虑使用代理服务器来处理跨域请求。代理服务器可以处理所有的跨域请求,并且将请求转发到实际的服务器,并将响应返回给客户端。
另外,您也可以尝试使用JSONP或者CORS代替postMessage进行跨域通信。这两种方法都可以在服务器端进行配置来允许跨域请求。
如题。在掘金看到的一篇文章,但是作者对于具体的原因没有说明清楚,希望有大神能够解答。 描述如下: 最近做了个项目,其中有个页面是由 iframe 嵌套了一个另外的页面,在运行的过程中发现 KeepAlive 并不生效,每次切换路由都会触发 iframe 页面的重新渲染 文章中提到的原因 iframe 很特别,当其插入到页面时会重新加载,这是浏览器特性,与 Vue 无关 附上原帖链接: KeepAl
我是PWA的新手,我在一个简单的项目上接受培训。在goole chrome上的第一次运行之后,一切都运行正常,我更改了服务工作人员中的cacheName常量和index.html中的标题,以测试所有站点资产的重新缓存。从这里开始,缓存仍然创建,但它是空的,我得到错误未捕获(在promise)TypeError:请求失败提到SW的行,我们const static CacheName='site-st
主要内容:缓存穿透,缓存击穿,缓存雪崩在实际的业务场景中,Redis 一般和其他数据库搭配使用,用来减轻后端数据库的压力,比如和关系型数据库 MySQL 配合使用。 Redis 会把 MySQL 中经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到 MySQL 中去查询了,而是直接获取 Redis 中的缓存数据,从而降低了后端数据库的读取压力。如果说用户查询的数据 Redis 没有,此时用户的查询请求就会转到
我是flutter应用程序开发的初学者。当我在模拟器上运行我的flutter默认项目代码时,我面临这个问题: 在调试模式下在IA仿真器上的AOSP上启动lib\main.dart...运行Gradle任务'assembleDebug'... 失败:生成失败,出现异常。 错误:无法打开设置文件“C:\Users\Administrator\StudioProjects\myapp\android\s
主要内容:本节引言:,1.缓存的分类:,2.为WebView开启缓存功能,3.删除WebView的缓存数据,4.示例代码下载:,5.本节小结:本节引言: 现在很多门户类信息网站,比如虎嗅,ifanr,钛媒体等等的APP,简单点说是信息阅读类的APP,很多 都是直接嵌套一个WebView用来显示相关资讯的,这可能就涉及到了WebView的缓存了! 所谓的页面缓存 就是指:保存加载一个网页时所需的HTML,JS,CSS等页面相关的数据以及其他资源,当没网的时候或者 网络状态较差的时候,加载本地保存好