HTML阻止iframe跳转页面并使用iframe在页面内嵌微信网页版

昨天看到这篇文章[置顶]开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面

就想弄一个winform结合html5的一个小东西,突有兴致,想在里面嵌套一个微信网页版。

好了,想法一出来,就行动吧,最终效果如下图:

一开始就打算在页面里面嵌套一个iframe指向https://wx.qq.com就OK了,但是我还是太天真,微信网页版会自动跳转。结果如下图:

于是上网搜了一下阻止iframe跳转的办法,就是在iframe标签加上 security="restricted" sandbox="" 两个属性。前者是IE的禁止js的功能,后者是HTML5的功能。

使用 sandbox="allow-scripts allow-same-origin allow-popups"可以阻止跳转。然而......结果却是这样:

然后发现,这个跳转其实就是关闭原先页面之后在浏览到跳转页面。所以可以利用页面关闭事件onbeforeunload来阻止跳转。所以在页面加入如下代码:

1 document.body.onbeforeunload = function (event) {
2             var rel = "asdfawfewf";
3             if (!window.event) {
4                 event.returnValue = rel;
5             } else {
6                 window.event.returnValue = rel;
7             }
8         };

然后发现结果还是这样:

到底是什么原因呢?事件没反应?还是微信网页版的跳转太牛了?直接无视这个事件?于是我新建一个空白的html,单独加上该事件进行验证。

 1 <!DOCTYPE html>
 2
 3 <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5     <meta charset="utf-8" />
 6     <title></title>
 7 </head>
 8 <body></body>
 9 <script>
10 document.body.onbeforeunload = function (event) {
11     var rel = "asdfawfewf";
12     if (!window.event) {
13         event.returnValue = rel;
14     } else {
15         window.event.returnValue = rel;
16     }
17 };
18 </script>
19 </html>

结果却是可行的:

但是在页面里面嵌入iframe之后却直接就跳转了,大家可以尝试一下面的代码。

 1 <!DOCTYPE html>
 2
 3 <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5     <meta charset="utf-8" />
 6     <title></title>
 7 </head>
 8 <body>
 9     <iframe src="https://wx.qq.com/" frameborder="0" style="position: absolute;border: navajowhite;left: 0;height: calc(100% - 30px);width:100%">
10     </iframe>
11 </body>
12 <script>
13 document.body.onbeforeunload = function (event) {
14     var rel = "asdfawfewf";
15     if (!window.event) {
16         event.returnValue = rel;
17     } else {
18         window.event.returnValue = rel;
19     }
20 };
21 </script>
22 </html>

正在毫无计策的时候,我一直打开关闭尝试该方法是否生效。突然发现,如果页面在刚打开的很短时间内关闭页面,onbeforeunload事件是不会被触发的,在等待几秒之后再关闭页面就会触发事件出现提示。

来,试一下iframe延时对src赋值(这里引用了JQuery)。

 1 <!DOCTYPE html>
 2 <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta charset="utf-8" />
 5     <title></title>
 6     <script src="scripts/jquery-2.2.3.js"></script>
 7 </head>
 8 <body>
 9     <iframe id="iframe" frameborder="0" style="position: absolute;border: navajowhite;left: 0;height: calc(100% - 30px);width:100%">
10     </iframe>
11 </body>
12 <script>
13 $(function () {
14     setTimeout(function () {
15         iframe.src = "https://wx.qq.com/";
16     },5000);
17 });
18 document.body.onbeforeunload = function (event) {
19     var rel = "asdfawfewf";
20     if (!window.event) {
21         event.returnValue = rel;
22     } else {
23         window.event.returnValue = rel;
24     }
25 };
26 </script>
27 </html>

结果果然成功了,会出现提示是否离开此页面,点击留下按钮。成功没有跳转。下图为我成品图片。

 

大功告成,里面可以正常聊天和传文件,但是不能截图。

缺点不足的就是,完成登陆需要点击弹窗取消按钮,而且需要两次,第一次打开页面,第二次扫码结束后还会跳转一次页面。目前还没办法解决这个问题,希望有办法解决此问题的朋友们可以提点建议哈~~

好了,第一次写博客到此结束哈哈,写的不好请大家见谅哈哈。

原文地址:https://www.cnblogs.com/fanshaoO/p/8244695.html

时间: 2024-08-02 01:45:39

HTML阻止iframe跳转页面并使用iframe在页面内嵌微信网页版的相关文章

Android内嵌网页webview点击其中的链接跳转到我们应用内的Activity

在一个大的Android项目中,由于客户端来不及更新和实现,经常会内嵌一些网页(在一些大型的互联网公司,PC的产品总是跑在客户端的前面),比如活动页面,通常可以内嵌用html5实现的页面,可以适配手机.但是这些网页中有好多链接,但是这些链接有些内容有是我们客户端已经实现的,比如有一个注册链接,其实客户端也实现了注册功能,我们不想再继续跳转到网页注册,而是打开客户端某个注册Activity,可以通过以下方式来实现: xml 文件,如下: java代码如下: ? 1 2 3 4 5 6 7 8 9

JSP中解决session超时跳转到登陆页面并跳出iframe框架或局部区域的方法

//方法1: 重定向到登录页,但是不支持跳出iframe//response.sendRedirect("/dormitory/toLoginPage"); //方法2:以输出页面并请求到登录页面的形式跳转到登录页面,可以跳出iframe(推荐)PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<script>"); ou

session过期跳转到登陆页面并跳出iframe框架的两个方法

最近在做拦截器,判断用户登录后操作超时,失去权限然后要重新登录,但是用的iframe,返回的登陆页总是在框架中显示,我百度了下,总是只有其中一个方法,现在分享下两种解决方法,希望对你们有帮助: 方法一: 一般使用filter过滤用户是否登录,如果用户没有登陆则转向登陆页面,这时候可以使用response.sendRedirect().但当在页面上使用了iframe后,发现被重定向的只是父页面中的iframe区域,登陆页面内容显示在该区域中.说明在过滤器中发送重定向请求时,是在iframe页面发送

iframe中请求页面而session失效时页面跳转问题

iframe中请求页面而session失效时页面跳转问题 分类: Web2009-12-11 15:01 656人阅读 评论(0) 收藏 举报 sessioniframejsp 有时候做了就忘了,我记得曾经在学校里老师教过这个问题,可一时就是想不起来,不过终于搜到了这么一篇文章,先记下来以便下次再得了遗忘症. 访问相关jsp页面时,往往要先判断用户session是否失效,以便决定是继续业务,还是跳转到登录页面.这个事情我们通常是用过滤器来实现的.由过滤器判断session是否失效,由此来决定请求

easyUI iframe中请求Session失效后iframe内跳转到首页的解决方案

最近用户easyUI搭了一套前端,后台是spring mvc + shiro,如果前端页面超过session过期时间再操作,iframe内的内容就会跳转到登录页面,而不是整个页面跳转到登录页. 原因:iframe内的请求因为请求超时后返回登录页面,还是会填充到iframe中. 解决方案: 1. 登录页中的body部分加入判断,载入页面时如果发现当前窗口不是顶级窗口,就将顶级窗口的内容更新为当前窗口的内容. 部分代码如下: </script> //判断当前窗口是否有顶级窗口,如果有就让当前的窗口

html判断当前页面是否在iframe中/顶级document中

在使用div+iframe布局的应用中,通常我们希望在session超时或者未登录访问时跳转到登录页面,默认情况下iframe中的页面无法直接覆盖父页面,因此需要在登录页面加载的时候判断一下当前是否为top页面,如果不是,则刷新主页面,这样就可以避免登录页面嵌入在iframe中的情况,如下: <script type="text/javascript"> if(self!=top){ parent.window.location.replace(window.locatio

iframe结构的网站按F5刷新子页面的实现方式

有的网站或者后台系统由于页面有公共的部分,比如菜单,会把公共的部分放在一个页面,这里称之为父页面,而把具体的内容放入一个iframe中,之后的请求改变iframe的内容.但是这样会有一个问题,因为浏览器的url是父页面的链接,当你按F5刷新的时候,并不是刷新iframe所对应的页面,而是刷新了父页面,使系统回到了最初的位置,这样对操作是很不爽的. 比如,页面的格式是这样的. 其中index是父页面,main_ifram是iframe对应的页面. 在index的部分,添加如下js代码,用来监听在i

父页面操作嵌套iframe子页面的HTML标签元素

一个页面A.html使用iframe嵌套一个页面B.html,在A页面写js操作B页面HTML元素,首先要获取到B页面document对象,才能对嵌套页面进行操作 请看一个实例,在A页面写js操作B页面div的内容: A.html代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="

asp.net中iframe页面用jQuery向父页面传值

在asp.net页面有时一个页面会通过iframe嵌套另一个页面,下面的例子讲述的是被嵌套的iframe页面向父页传值的一种方式,用jQuery即可. iframe页面代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Iframe页面<