前端跨页面通信

在这里插入图片描述

什么意思?

在浏览器中,我们可以打开多个页面,假如把每个页面看做一个独立的运行环境,即使全局对象也不会在多个页面之间共享,但是有时候需求就是在这些独立的页面中同步数据信息等,这就属于白话,简要说明了页面通信
举个例子,有两个页面,两个页面都有“收藏”按钮,点击第一个页面中“收藏”按钮,状态会变为“已收藏”,第二个页面为第一个页面的详情页,详情页中的“收藏”按钮此时也更新为“已收藏”的状态,这就是跨页面通信的例子

通信

前端跨页面通信分为两种情况:
同源页面之间的跨页面通信
非同源页面之间的跨页面通信

同源

同源通信是指在 Web 开发中,两个页面的协议、域名和端口号完全相同,它们被认为具有相同的源。在同源情况下,这两个页面可以通过一些方法进行通信。

同源通信非常重要,因为浏览器为了保护用户的安全性采取了同源策略。同源策略限制了来自不同源的页面之间的访问和交互,以防止恶意代码的攻击。

具体来说,同源通信意味着以下条件满足:

  • 协议(Protocol):两个页面的协议必须相同,例如都是使用 HTTP 或 HTTPS。

  • 域名(Domain):两个页面的域名必须完全相同。

  • 端口号(Port):如果页面使用了非默认的端口号(如 https://www.example.com:8080),那么两个页面的端口号也必须相同。

只有当以上三个条件都满足时,浏览器才会允许这两个页面进行同源通信。否则,就会触发跨域问题,导致访问限制和安全性问题。

同源通信允许页面之间使用一些特定的 API 进行数据传递和消息交换,比如 PostMessage API、LocalStorage、Broadcast Channel API 等。这些方法可以保证在同源的情况下安全地进行跨页面通信,同时遵循浏览器的安全策略。

非同源

非同源通信是指在 Web 开发中,两个页面的协议、域名和/或端口号不完全相同,它们被认为具有不同的源。在这种情况下,浏览器会启动跨域限制策略并阻止不同源的页面之间的访问和交互。

浏览器的同源策略是为了保护用户的隐私和安全而设计的。如果没有同源策略,一个恶意的网站可以通过 JavaScript 等技术获取到其他网站的数据,包括用户的个人信息、登录凭证等,从而对用户进行攻击。

在非同源的情况下,浏览器将不允许使用一些常见的跨页面通信方法,如 XMLHttpRequest、Fetch API等,这些 API 通常只能用于同源通信。但是,开发者仍然可以使用一些特定的 API 来实现非同源通信,例如 JSONP、CORS、PostMessage API 等。

需要注意的是,在使用这些 API 进行非同源通信时,需要遵循浏览器的安全策略和跨域请求规范。比如,在使用 CORS 进行非同源通信时,需要在服务端设置允许跨域访问的响应头;在使用 PostMessage API 进行非同源通信时,需要确保只接受来自指定源的消息等。开发者需要仔细了解每种方法的使用方式和限制,以确保在安全的前提下实现跨页面通信。

方法

在同源情况下,可以使用以下方式进行跨页面通信:

  1. PostMessage API:可以在不同窗口之间安全地传递消息,只要它们具有相同的源。

  2. LocalStorage:同一源下的不同页面可以共享相同的 localStorage。

  3. Broadcast Channel API:可以在同一域名下的不同窗口之间广播消息。

  4. WebSocket:可以在同一源下建立客户端与服务端之间的双向通信。

在不同源情况下,常见的跨页面通信方式包括:

  1. 使用 PostMessage API 结合特定的 origin 参数来限制消息的接收范围,从而实现不同源之间的安全通信。

  2. 使用跨域资源共享(CORS)来允许跨源请求,使得不同源下的页面可以通过 AJAX 进行通信。

  3. 如果需要在不同源之间进行通信,也可以考虑使用代理服务器或者后端服务作为中介,来转发消息或数据

需要注意的是,跨源通信可能会受到浏览器的安全策略限制,如跨域请求时可能需要进行额外的配置或者在服务器端设置适当的响应头信息。因此,在不同源情况下,需要特别注意安全性和浏览器的安全策略限制。

当涉及同源和不同源的前端跨页面通信时,这里提供一些具体的示例:

同源通信示例:

假设我们有两个页面,一个是 https://www.example.com/pageA,另一个是 https://www.example.com/pageB。

  1. 使用 PostMessage API 进行同源通信: 在页面 A 中发送消息给页面 B:
const targetWindow = window.open('https://www.example.com/pageB');
targetWindow.postMessage('Hello from page A!', 'https://www.example.com');

在页面 B 中接收来自页面 A 的消息:

window.addEventListener('message', function(event) {
  if (event.origin === 'https://www.example.com') {
    console.log('Message received from page A:', event.data);
  }
});
  1. 使用 LocalStorage 进行同源通信: 在页面 A 中存储数据:
localStorage.setItem('sharedData', 'Hello from page A!');

在页面 B 中读取数据:

const sharedData = localStorage.getItem('sharedData');
console.log('Data received from page A:', sharedData);

不同源通信示例:

假设我们有两个页面,一个是 https://www.example.com/pageA,另一个是 https://www.example.net/pageB。

  1. 使用 PostMessage API 和指定 origin 进行不同源通信: 在页面 A 中发送消息给页面 B:
const targetWindow = window.open('https://www.example.net/pageB');
targetWindow.postMessage('Hello from page A!', 'https://www.example.net');

在页面 B 中接收来自页面 A 的消息:

window.addEventListener('message', function(event) {
  if (event.origin === 'https://www.example.com') {
    console.log('Message received from page A:', event.data);
  }
});
  1. 使用跨域资源共享(CORS)进行不同源通信: 在页面 A 中发送 AJAX 请求给页面 B:
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://www.example.net/pageB');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.withCredentials = true; // 设置允许跨域请求携带凭据
xhr.send();

在页面 B 的服务器端设置允许跨域资源共享:

// 在响应头中设置允许来自指定源的跨域请求
response.setHeader('Access-Control-Allow-Origin', 'https://www.example.com');

这些示例展示了同源和不同源情况下的前端跨页面通信方式。需要根据实际情况选择适合的通信方式,并确保在不同源的情况下遵循浏览器的安全策略和跨域请求的规范。

使用场景

前端跨页面通信主要用于在 Web 开发中,实现不同页面之间的数据传递和消息交换。以下是一些常见的使用场景:

  1. 多页面应用程序:对于一些复杂的应用程序,可能需要多个页面进行协同工作。这时,开发者可以通过跨页面通信来实现数据共享、状态同步等功能。

  2. 单页应用程序:对于一些单页应用程序,可能需要通过多个组件或模块之间进行数据传递和消息交换。这时,开发者可以通过跨页面通信来实现组件之间的数据共享、状态管理等功能。

  3. 第三方插件应用程序:对于一些第三方插件应用程序,可能需要与宿主页面进行数据交互和消息通知。这时,开发者可以通过跨页面通信来实现与宿主页面的通信。

  4. 外部 API 调用:对于一些外部 API,可能需要与多个页面进行数据交互和消息通知。这时,开发者可以通过跨页面通信来实现多个页面与 API 的通信。

需要注意的是,在使用跨页面通信时,开发者需要仔细考虑通信方式的选择,以便实现安全、高效的数据传递和消息交换。同时,为了保证用户隐私和安全,开发者需要遵循浏览器的安全策略和跨域请求规范。

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Chameleon简写CML,中文名卡梅龙;中文意思变色龙,意味着就像变色龙一样能适应不同环境的端整体解决方案。 支持平台:web、微信小程序、支付宝小程序、百度小程序、android(weex)、ios(weex)、qq 小程序、字节跳动小程序、快应用、持续更新中 一端所见即多端所见——多端高度一致,无需关注各端文档。 特点: 多端高度一致 深入到编程语言维度保障一致性,包括框架、生命周期、内置组件、事件通信、路由、界面布局、界面单位、组件作用域、组件通信等高度统一。 丰富的组件 在用 CML 写页面时,chameleon 提供了丰富的组件供开发者使用,内置的有button switch radio checkbox等组件,扩展的有c-picker c-dialog c-loading等等,覆盖了开发工作中常用的组件。 丰富的 API 为了方便开发者的高效开发,chameleon 提供了丰富的 API 库,发布为 npm 包chameleon-api,里面包括了网络请求、数据存储、地理位置、系统信息、动画等方法。 自由定制 API 和组件 基于强大的多态协议,可自由扩展任意 API 和组件,不强依赖框架的更新。各端原始项目中已积累大量组件,也能直接引入到端项目中使用。 基于强大的多态协议,充分隔离各端差异化实现,轻松维护一套代码实现多端。 智能规范校验 代码规范校验,当出现不符合规范要求的代码时,编辑器会展示智能提示,不用挨个调试各端代码,同时命令行启动窗口也会提示代码的错误位置。 渐进式端 既想一套代码运行多端,又不用大刀阔斧的重构项目?不仅可以用 cml 开发页面,也可以将多端重用组件用 cml 开发,直接在原有项目里面调用。 先进前端开发体验 Chameleon 不仅仅是端解决方案。基于优秀的前端打包工具 Webpack,吸收了业内多年来积累的最有用的工程化设计,提供了前端基础开发脚手架命令工具,帮助端开发者从开发、联调、测试、上线等全流程高效的完成业务开发。 业务线收集 使用CML业务线收集。
Vue前端页面的详细设计可以包括以下几个方面: 1. 页面布局:使用Vue的组件系统来构建页面布局,可以使用ElementUI框架提供的组件来快速搭建页面结构。例如,可以使用`el-row`和`el-col`组件来创建栅格布局,使用`el-container`组件来创建容器布局。 2. 数据绑定:Vue使用双向数据绑定的方式来实现页面和数据的同步更新。可以使用`v-model`指令将表单元素与数据进行绑定,也可以使用插值表达式`{{}}`将数据显示在页面上。 3. 事件处理:Vue提供了丰富的事件处理机制,可以使用`v-on`指令来监听DOM事件,并在触发时执行相应的方法。例如,可以使用`v-on:click`来监听点击事件,使用`v-on:submit`来监听表单提交事件。 4. 条件渲染:Vue提供了`v-if`和`v-else`指令来实现条件渲染。可以根据数据的值来决定是否显示某个元素或组件。 5. 列表渲染:Vue提供了`v-for`指令来实现列表渲染。可以使用`v-for`指令遍历数组或对象,并根据每个元素生成相应的DOM元素。 6. 组件通信:Vue提供了多种方式来实现组件之间的通信,包括父子组件通信、兄弟组件通信级组件通信。可以使用`props`属性来传递数据给子组件,使用自定义事件来在子组件中触发父组件的方法。 7. 路由管理:Vue提供了Vue Router插件来实现前端路由管理。可以使用Vue Router来定义路由规则,并在不同的路由之间进行切换。 8. 状态管理:Vue提供了Vuex插件来实现全局状态管理。可以使用Vuex来管理应用的状态,并在不同的组件中共享数据。 9. 动画效果:Vue提供了`transition`组件和`transition-group`组件来实现动画效果。可以使用这些组件来给页面元素添加过渡效果或动画效果。 10. 接口调用:在前端页面中,通常需要与后端接口进行数据交互。可以使用Vue的`axios`库来发送HTTP请求,并处理接口返回的数据。 下面是一个简单的示例,演示了如何使用Vue和ElementUI框架来设计一个前端页面: ```html <template> <div> <el-row> <el-col :span="12"> <el-input v-model="name" placeholder="请输入姓名"></el-input> </el-col> <el-col :span="12"> <el-button type="primary" @click="submit">提交</el-button> </el-col> </el-row> <el-row v-if="submitted"> <el-col :span="24"> <p>您好,{{ name }}!</p> </el-col> </el-row> </div> </template> <script> export default { data() { return { name: '', submitted: false } }, methods: { submit() { // 调用接口进行数据提交 // ... this.submitted = true; } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值