网页嵌入其他网站或新打开其他网页并发送消息

news/2024/5/12 5:51:09/文章来源:https://blog.csdn.net/u014523388/article/details/127233628

一、背景

公司A想开发一个包含功能1、2、3…的网站,经过调研发现,公司B开发的网站包含了其所需的一半功能,公司A想直接把公司B的网站嵌入到他们的网站中或通过一个按钮跳转到公司B的网站,并希望对公司B的网站做一些控制。

二、相关技术

2.1 网页嵌入

html提供了iframe标签用于在网页中嵌入其他网站,下面介绍几个主要的属性

2.1.1 src

用于设置嵌入网站的地址,如https://www.csdn.net,简单的使用如下,效果如下图

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8">
</head>
<body><h2>嵌入CSDN</h2><br><iframe id="child" src='https://www.csdn.net'></iframe><script></script>
</body>
</html>

初始

2.1.2 width和height

width用于设置嵌入网页的宽度,height为高度。从上图可以看出默认的范围比较小,想要嵌入的网页范围变大,可设置这两个参数,单位为像素。如将上述的iframe参数改为如下,可得到较大范围的嵌入网页

<iframe id="child" src='https://www.csdn.net' width="1600px" height="800px"></iframe>

2.1.3 frameborder

用于控制嵌入的网页是否有边框,1为有边框,0为无边框。从上图中可以看出默认是带边框的。下图为无边框的效果。
no-border

2.1.4 scrolling

用于控制嵌入的网页是否有滑动条,1为有,0为无,默认为有。

2.2 打开新网页

作用 在新的网页中打开网站
语法 window.open(URL)

  1. URL为打开的页面的网址。如果没有指定网址,则打开一个新的空白窗口
  2. 返回新网页的window对象

2.3 网页通信

2.3.1 postMessage

作用 向其他窗口发送消息
语法 otherWindow.postMessage(message, targetOrigin, [transfer])

  1. otherWindow为其他窗口的一个引用,比如 iframecontentWindow 属性
  2. message为将要发送到其他 window的数据,为字符串
  3. targetOrigin为能接收到消息事件的窗口,格式为窗口的网址,如果想要所有窗口都能接收到消息,可设置为*
  4. [transfer]为可选参数,是一串和 message 同时传递的 Transferable 对象。这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。此参数一般不使用

2.3.2 addEventListener

作用 接收消息
语法 window.addEventListener(event, function, useCapture)

  1. event为事件名称,一般为"message"
  2. function为消息处理函数,用户可自定义,输入参数为ee包含2个常用的参数,e.data为接收到的字符串消息;e.origin为发送消息的网址,可通过此参数来做判断是否需要处理,以防攻击
  3. useCapture用来处理当存在多级组件都有接收消息响应函数时的处理顺序,true表示从外向内,即外层的先响应,false为从内向外,默认为false

2.3.3 window.opener

window.opener为打开当前网页的网页对象,如winA.open(winB),则winB.openerwinA,使用该变量可实现被打开网页向主网页发送消息

2.4 使用window.onload来处理打开新窗口后异步执行的问题

  1. window.onload是一个在网页加载完成后自动执行的函数,用户可自定义该函数。
  2. 打开新窗口发送消息存在的问题:在向新窗口发送消息的案例中,由于window.open()需要时间,这个时间跟被打开的网站的加载速度有关,而该函数的执行是异步的,即该语句后面的代码不会等待新窗口完全加载后再执行,从而导致post的消息不起作用。
  3. 解决方法1:对window.open()后的代码使用setTimeout函数延迟执行,此方案严重依赖于设置的延迟时长,如果设置小了,代码执行不起作用;设置大了又会有明显的迟滞,且不同网站的加载速度不同,即便相同的网站,受限于网速,打开的速度也不一样,延迟时长很难设置。所以此方法不推荐。
  4. 解决方法2:在子页面的window中增加onload函数,在这个函数中我们使用window.opener来向主网页发送消息,告诉它子网页加载好了,然后主网页再发送消息给子网页进行处理,这样虽然会多一些交互代码,但可以精确地执行交互。所以推荐使用该方法,下述的案例中就使用了该方法。

三、代码案例

正常一般为网站服务,此处为了方便直接使用了html文件,其中postMessagetargetOrigin就无法设置html路径了,如果是服务的话可直接填网址,如"https://www.csdn.net",所以此处直接用"*"

3.1 主页面代码

<!-- main: child.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8">
</head>
<body><h2>这是主网页</h2><br><span>向内嵌网页发送的消息</span><input id="postMsg" type="text" value=""/><button onclick="handleSendMsgToCurWindow()">发送到内嵌网页</button><button onclick="handleSendMsgToNewWindow()">发送到新网页</button><iframe id="child" src='child.html' frameborder="1" scrolling="yes" style="position:fixed; top: 150px; left: 10px; width:400px; height:200px"></iframe><script>var newWindow = undefined; //子网页windowfunction handleSendMsgToCurWindow(){           let postMsg = document.getElementById("postMsg").value;if(postMsg == ""){alert("消息不能为空!");return;}// 获取内嵌网页framevar childFrame = document.getElementById('child');childFrame.contentWindow.postMessage(postMsg, '*');}function handleSendMsgToNewWindow(){           let postMsg = document.getElementById("postMsg").value;if(postMsg == ""){alert("消息不能为空!");return;}if(newWindow == undefined){// 如果子网页未打开,则打开newWindow = window.open("child.html");// 子网页打开需要时间且是异步的,需要监听子网页是否完成加载的反馈,等加载完后再发送消息window.addEventListener('message', (e)=>{   if(e.data == "childLoaded" && newWindow){let postMsg = document.getElementById("postMsg").value;newWindow.postMessage(postMsg, '*');}}, false)}else{// 如果子网页已经打开,则直接发送消息newWindow.postMessage(postMsg, '*');}}</script>
</body>
</html>

3.2 子页面代码

<!-- file: child.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8">
</head>
<body><h2>这是内嵌网页</h2><br><span>从主网页收到的消息</span><input id="recvMsg" type="text" value=""/><script>window.addEventListener('message', (e)=>{console.log(e);document.getElementById("recvMsg").value = e.data;}, false)// 网页加载完后向父窗口发送加载完成的消息window.onload = ()=>{if(window.opener){window.opener.postMessage("childLoaded", "*");}}</script>
</body>
</html>

3.2 向内嵌网页发送消息效果展示

cur

3.3 向新打开的网页发送消息效果展示

new

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_901776.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20个快速学习CSS的网站

1. A List Apart CSS Topics 老牌CSS站点&#xff0c;从1999年开始一直致力于整理收集面向标准网页开发的优秀文章。 2. CSS Help Pile 收集整理了大量的CSS相关资源&#xff0c;而且归档非常清晰&#xff0c;查询非常方便。 3. CSS Basics 通过一系列教程讲述了CSS的基本概…

个人网站重构

1 占位图片生成 <img src"http://placehold.it/350x150"> 不用引入任何外部文件&#xff0c;会自动形成对应数字大小的图片。 2 关于伪元素和伪类 css3 为了区分两者&#xff0c;已经明确规定了伪类用一个冒号来表示&#xff0c;而伪元素则用两个冒号来表示…

个人网站漏洞修复

环境&#xff1a;Centos 7 && Apache 目录遍历 1.打开Apache 配置文件夹 apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径&#xff1a;/usr/sbin/apachectl web目录:/var/www/html 2.打开httpd.conf,找到Options Indexes FollowSymLinks 将Options Ind…

Google Code项目代码托管网站上Git版本控制系统使用简明教程

转自http://blog.csdn.net/snowdream86/article/details/6706265 作为一个著名的在线项目代码托管网站&#xff0c;Google Code目前主要支持三种版本控制系统&#xff0c;分别为Git, Mercurial和 Subversion。Subversion即SVN相信大家都已经熟知了&#xff0c;这里我们要介绍的…

利用Vultr主机安转宝塔Web面板搭建wordpress博客建站教程

本篇文章是针对新手个人站长&#xff0c;来教大家利用Vultr主机如何安装宝塔Web面板搭建wordpress博客的方法。 1、一台Vultr VPS主机。 2、注册Vultr账号创建VPS实例 创建VPS实例 点击Deploy Now创建服务器实例&#xff0c;Status显示Running表示已经成功安装&#xff0c;…

阿里云服务器安装WordPress,搭建自己的博客网站

阿里云服务器安装WordPress&#xff0c;搭建自己的博客网站 很多人都想搭建自己的博客网站&#xff0c;如今要实现自己的博客网站已经很简单了。这几天我就尝试了一下&#xff0c;随便记录下来&#xff0c;方便后人。 一个自己的博客网站至少需要这几点: 1、服务器。现在有不少…

web前端开发项目资源网站,私家珍藏!分享给大家

1.CodePen&#xff1a; http://codepen.io/ 网站里有很多很酷的特效&#xff0c;而且可以看到效果的源代码&#xff0c;也可以看到实现效果&#xff0c;是一个非常不错的前端开发学习资源网站。 这个是CodePen网站里的一个效果的源码截图&#xff0c;是不是很酷呀&#xff0…

聊一聊如何搭建高性能网站哪一些事

在开发中经常会遇到网站的性能平静下来&#xff0c;打开慢的情况。我们平常开发中怎么一步一步排查这些问题并 解决问题呢 在快节奏的时代中&#xff0c;慢是个不容忍受的事情。 一、 为什么会‘慢’呢&#xff1f; 慢的情况是多种多样的&#xff0c;比如&#xff1a; 用户体验…

java面试——面试题(大型网站数据瓶颈——数据库分库分表)

为什么要做读写分离&#xff1f;减少主库的压力数据库的分库分表

从知名网上展会平台matchupexpo.com分析SEO所必备的8项技能

尽管 SEO 已经存在了几十年&#xff0c;但许多大学仍然没有教授 SEO&#xff0c;也没有在大多数营销课程中提及&#xff08;至少我的经验告诉我是这样的&#xff09;。SEO 专业人员来自不同的背景。有些是程序员&#xff0c;有些是企业家&#xff0c;有些是传统营销人员&#x…

肉眼可见、当天会有效果的SEO方法(针对SEO初学者)

SEO立杆见影的方法简单的说就是以下5个&#xff1a; 选择正确的网址。 为每个页面创建标题和描述&#xff0c;例如&#xff1a; <title>2021中国世博会B2B电子商务批发产品线上展会平台</title>, <head> <meta name "description" conten…

如何判断一个网站是WordPress搭建的网站以及网站SEO网络推广

有很多做外贸的朋友们经常会碰到需要做自己的独立站。这个时候就需要找对应的制作网站的公司进行咨询和洽谈。这个时候常常就会听到对方口中提到一个词&#xff0c;叫“WordPress”。那么到底什么是WordPress? 如何判断一个网站是WordPress搭建起来的呢&#xff1f; 首先WordP…

中国贸易展联亚国际云会展在线B2B贸易线上展览平台Matchupexpo网站SEO日志

本周基本工作情况汇总&#xff1a; 1.维持matchupexpo线上展会网站Alexa排名在8000以内&#xff0c;目前全球排名为7876&#xff0c;排查百度收录异常情况&#xff0c;确保整体收录情况得到增长. 2.每天百度和谷歌端维持发帖发文。 3.清查出网站中的死链&#xff0c;并进行死…

MatchupExpo互联网展会平台网站SEO优化工作总结

1.上周百度端开始重点布局知乎平台&#xff0c;用知乎文章和视频加大力度进行招展工作。 接下来考虑如何迅速吸粉从而进行流量转化。 2.上周每天百度和谷歌端维持发帖发文。完全手工发帖&#xff0c;未使用外挂软件&#xff0c;健康有序的进行外链发布。 3.上周相关网站的死链…

如何设置网站的图标

打开一些比较大型的网站&#xff0c;网页的地址栏前面都有该网站的标志&#xff0c;网页标志ico如何设置?地址栏标志favicon.ico?如何让网站的图标出现在地址栏上?在收藏夹和地址栏前面添加ICO图标?如&#xff1a;百度&#xff0c;163&#xff0c;新浪等.如图:37计favicon图…

自然码辅助码在线查询网站

开门见山&#xff0c;先放网站&#xff1a; 自然码辅码在线查询https://copperay.github.io/AuxcodeQuerier 作者说 如今自然码式微&#xff0c;许多人连辅助码是什么都不甚清楚——他们不知道自然码是有辅助码的——就算有知道的&#xff0c;其中不少竟然以为自然码的辅助码…

为爱心助力!替换网站的404为宝贝回家把404页面利用起来!

我的主博客是可定博客(https://wnag.com.cn/) 原文链接&#xff1a;为爱心助力&#xff01;替换网站的404为宝贝回家把404页面利用起来&#xff01; 相信大家对404都是不陌生的&#xff0c;在一个站点的帖子找不到的时候都会进入404页面。 其实404页面真的没有什么用,那么如…

centos 7 搭建wordpress 网站

一.安装apache yum -y install httpd 注意&#xff1a; 该方法安装完毕后&#xff0c;Apache配置文件路径为 /etc/httpd/conf/httpd.conf 可使用命令查看Apache服务状态 service httpd status 开启服务 systemctl start httpd.service 关闭服务 systemctl stop httpd.…

公众号简单爬虫--把公众号文章全部转载到网站(一)

Ps&#xff1a;经历两个多月家里的麻烦事&#xff0c;泛舟终于又有空更新了。 起因是之前帮一个朋友做一个企业网站&#xff0c;没有啥功能&#xff0c;单纯的展示和发布信息。其实是很简单的事情&#xff0c;随便下载个个人博客源码&#xff0c;改一下&#xff0c;以为就可以…