iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >解决window.open()被浏览器拦截的问题
  • 445
分享到

解决window.open()被浏览器拦截的问题

2024-04-02 19:04:59 445人浏览 薄情痞子
摘要

一、问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截。何况当出现拦截时,很

一、问题描述

最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截。何况当出现拦截时,很多用户根本不知道发生了啥,不知道在哪里看被拦截的页面。因此必须通过代码来解决这个问题!

以下是浏览器拦截示例:

二、问题分析

浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了,即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截。

三、window.open()语法

window.open(url, name, features, replace)
  Arguments - 参数  url
  可选字符串参数,指向要在新窗口中显示的文档的URL。如果省略该参数,或者参数为空字符串,新窗口不会显示文档。
  name
  可选字符串参数,该参数可以设置新窗口的名称。
  相同name的窗口只能创建一个,要想创建多个窗口则name不能相同。
  features
  可选字符串参数,该参数用于设定新窗口的功能。因为该参数是可选的,如果没有指定该参数,新窗口有所有的标准功能。
  replace
  可选布尔参数,设置新窗口中的操作历史的保存方式。
  true - 创建新历史记录
  false - 替换旧的历史记录
Returns - 返回值
  一个根据name参数对新创建的或已存在的窗口对象的引用。
Description - 描述
  open()方法可以查找一个已经存在的或者新建的浏览器窗口。如果name参数指定了一个已经存在的刘浏览器窗口,则返回对该窗口的引用。返回的窗口中将显示URL中指定的文档,但是features参数会被忽略。open()方法是javascript中唯一通过名称获得浏览器窗口引用的途径。
  如果没有指定name参数,或者不存在name参数指定的名称的窗口,open()方法将创建一个新的浏览器窗口。
  name参数用于指定新窗口的名称,该名称必须由字母、数字和下划线字符组成。它可以被html文档中的<a>标记或<fORM>标记指向。
  当你使用window.open()方法加载一个新的文档到一个已经存在了命名的窗口中时,你可以通过replace参数设置历史记录的保存方式.。如果该参数是true, 新文档的历史记录将取代旧文档的历史记录。 如果该参数为false或这没有指定该参数,新的文件在窗口的浏览历史记录中将建立自己的条目。该参数提供了location.replace()相同功能的方式。
  不要把"Window.open( ) "和"Document.open( )"混淆;这是两个完全不一样的方法。为了让代码更明晰,你可以用"Window.open( )"代替 "open( )"。作为HTML属性定义事件处理程序时, "open( )" 一般被解释为"Document.open( )",所以在这种情况下,你必须使用"Window.open( )"。
Window Features - 窗口特性
  feature参数是一个用逗号分隔的功能列表。如果该参数为空或者没有指定该参数,新的窗口将拥有所有的功能。另一方面, 如果feature参数只指定了某一项或某几项功能,那么其他没有被指定的功能将不会出现在新的窗口中。该字符串不能包含任何空格或其它空字符串。
  列表中的每个元素的格式:功能[=值]
  对于绝大多数的功能来说,它们的值一般都是yes或no。对这些功能,等号和值都可以省略不写。 对于 width和height特性,必须给它们指定一个以像素为单位的值。
  一下是一些普遍支持的功能和它们的含义:
  height
  设定窗口显示区域的像素宽度
  left
  浏览器窗口距离屏幕左边的距离
  location
  指明地址栏在新窗口中是否可见
  menubar
  指明菜单栏在新窗口中是否可见
  resizable
  指明新窗口是否可以调整大小
  scrollbars
  指明滚动栏在新窗口中是否可见
  status
  指明状态栏在新窗口中是否可见
  toolbar
  指明工具栏在新窗口中是否可见
  top
  设定新窗口距屏幕上方的距离
  width
  设定窗口显示区域的像素宽度
  alwaysLowered
  指定窗口隐藏在所有窗口之下
  alwaysRaised
  指定窗口浮在所有窗口之上
  dependent
  指定打开的窗口为父窗口的一个子窗口。并随父窗口的关闭而关闭
  directions
  指定Navigator 2和3的目录栏是否在新窗口中可见
  hoTKEys
  在没有菜单栏的新窗口设置安全退出热键
  innerHeight
  设置新窗口中文档的像素高度
  innerWidth
  设置新窗口中文档的像素宽度
  menubar
  指明菜单栏在新窗口中是否可见
  outerHeight
  设定窗口(包括装饰边框)的像素高度
  outerWidth
  设定窗口(包括装饰边框)的像素宽度
  screenX
  设定新窗口离屏幕边界的像素长度
  screenY
  设定新窗口离屏幕上边界的像素长度
  titlebar
  指明菜单题目栏在新窗口是否可见
  z-look
  在文档中包含各个 <pplet>标签的数组
  fullscreen
  打开的窗体是否进行全屏显示

四、代码模拟

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>测试弹框拦截</title>
  <script>
    window.open("Http://www.cnblogs.com/chenyablog/","测试弹框","top=nInt,left=nInt,width=nInt,height=nInt,location=yes,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no");
  </script>
</head>
<body>
   <h1>测试弹框拦截</h1>
</body>
</html>

五、解决方案在

ajax请求之前,先用window.open 打开一个空白窗口,然后在ajax的响应函数中设置该窗口的location属性为新的url。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>测试弹框拦截</title>
  <script>
    async displayProjectileFrame (type) {
      const title = '测试弹框拦截'
      // 先打开一个窗口
      let newWindow = window.open()
      //给新窗口设置标题
      newWindow.document.title = title
      try {
        const base = 'xxxxxxxxxx'
          // 这里是模拟ajax,不同使用场景需要有所变化
        const openUrl = await this.$axiOS.$get('/xxx/xxxx', {
          params: {
            base
          }
        })
        if (openUrl) {
          // 重定向
          newWindow.location = openUrl
        }
      } catch (e) {
        this.$axiosError(e)
      }
    }
  </script>
</head>
<body>
   <h1>测试弹框拦截</h1>
</body>
</html>

六、小结

上面方法,存在一个问题时,因为先打开了空白窗口,如果ajax请求失败(网络或业务逻辑问题)后, 新窗口中就不会有正常的结果体现,有可能造成用户疑惑。

一个解决办法是,当ajax出现问题时,可以考虑给出一个提示,如   newWindow.document.write("服务器处理异常");

甚至为了防止ajax响应时间过长,当窗口新建后,立即给出提示  newWindow.document.write("服务器正在处理中,请稍后");

后面如果ajax正常返回,则因为设置了location值,原来打印的信息会被新的页面信息覆盖。

七、思考

对于动态打开新窗口,没有特别完美的方法。具体还需根据特定的业务场景来采取相应的做法!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 解决window.open()被浏览器拦截的问题

本文链接: https://www.lsjlt.com/news/152626.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决window.open()被浏览器拦截的问题
    一、问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截。何况当出现拦截时,很...
    99+
    2024-04-02
  • window.open()被浏览器拦截怎么解决
    本篇内容介绍了“window.open()被浏览器拦截怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、问题描述以下是浏览器拦截示例...
    99+
    2023-07-02
  • windows谷歌浏览器flash插件被拦截如何解决
    本篇内容主要讲解“windows谷歌浏览器flash插件被拦截如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows谷歌浏览器flash插件被拦截如何解决”吧!解决方法:进入浏览器...
    99+
    2023-07-01
  • vue 路由跳转打开新窗口被浏览器拦截问题处理
    触发事件请求接口根据条件去判断在进行路由跳转:   <a @click="getGetMyPortfolioById(scope.row) ">查看</a> ...
    99+
    2024-04-02
  • Ajax打开新窗口被浏览器拦截怎么办
    小编给大家分享一下Ajax打开新窗口被浏览器拦截怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近在做支付时发现打开支付窗...
    99+
    2024-04-02
  • 解决使用security和静态资源被拦截的问题
    目录使用security和静态资源被拦截解决方法Spring Security踩坑记录(静态资源放行异常)问题描述解决1.首先尝试使用网上的方法继承 WebSecurityConfi...
    99+
    2024-04-02
  • Struts2拦截器 关于解决登录的问题
    拦截器的工作原理如图 拦截器是由每一个action请求(request)都包装在一系列的拦截器的内部,通过redirectAction再一次发送请求。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。我们可...
    99+
    2023-05-31
    struts2 登录 拦截器
  • 如何解决跨浏览器的问题
    这篇文章主要为大家展示了“如何解决跨浏览器的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决跨浏览器的问题”这篇文章吧。1. 前缀 CSS3 样式如果您正在使用任何类型的现代 CSS ...
    99+
    2023-06-08
  • mybatis拦截器无法注入springbean的问题解决
    公司要整合rabbitmq与mybatis拦截器做一个数据同步功能。 整合过程中大部分环节都没什么问题,就是遇到了mybatis拦截器 @Intercepts(@Signature(...
    99+
    2024-04-02
  • Mybatis拦截器打印sql问题怎么解决
    本篇内容介绍了“Mybatis拦截器打印sql问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.log4j2配置修改关闭log4...
    99+
    2023-07-05
  • 如何解决Win10系统IE浏览器主页被锁定的问题
    这篇文章将为大家详细讲解有关如何解决Win10系统IE浏览器主页被锁定的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。IE浏览器主页被锁定的解决方法/步骤:打开控制面板界面并选择以下“程序和功能”进入...
    99+
    2023-06-27
  • 如何解决台式机ie浏览器主页被篡改的问题
    小编给大家分享一下如何解决台式机ie浏览器主页被篡改的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!台式机ie浏览器主页被篡改解决方法/步骤:调出运行窗口,输入gpedit.msc命令后回车。在打开的界面中依次展开以下...
    99+
    2023-06-27
  • 如何解决浏览器跨域问题
    这篇文章主要介绍如何解决浏览器跨域问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、什么是跨域问题在页面中使用js访问其他网站的数据时,就会出现跨域问题,比如在网站中使用ajax...
    99+
    2024-04-02
  • JavaScript浏览器的兼容问题如何解决
    本文小编为大家详细介绍“JavaScript浏览器的兼容问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript浏览器的兼容问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。inn...
    99+
    2023-07-04
  • 如何解决IE浏览器的兼容问题
    这篇文章主要介绍如何解决IE浏览器的兼容问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!怎么用一行代码解决CSS各种IE各种兼容问题<meta http-equiv...
    99+
    2024-04-02
  • springboot项目拦截器重定向循环问题的解决
    目录springboot项目拦截器重定向循环解决办法springboot拦截器无限循环报错springboot项目拦截器重定向循环 本菜鸟很久没写东西了,这回是解决了一个小问题,希望...
    99+
    2024-04-02
  • 浏览器不能正常访问Github的问题解决
    目录引言一、查询IP地址二、修改配置hosts文件三、检测引言 作为一个合格的开发者,对Github肯定不陌生,有些人可能每天都会到这个开源平台,学习、Clone、Fork各种项目。...
    99+
    2024-04-02
  • 如何解决浏览器输入http被自动跳转至https问题
    小编给大家分享一下如何解决浏览器输入http被自动跳转至https问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在将服务尝试着从http协议往https协议迁...
    99+
    2023-06-15
  • 完美解决浏览器输入http被自动跳转至https问题
    在将服务尝试着从http协议往https协议迁移成功之后,又出于测试调试的目的将服务转回到http协议,却发现在浏览器输入http会被自动跳转到https。 HTTP Strict...
    99+
    2024-04-02
  • VueSPA如何解决浏览器缓存问题
    目录Vue SPA 解决浏览器缓存Vue 微信浏览器缓存问题Vue SPA 解决浏览器缓存 如何让发布到线上的 vue 单页应用能及时更新到浏览器,而无需用户强制刷新页面呢? 因为 ...
    99+
    2022-11-13
    Vue浏览器缓存 Vue缓存 Vue SPA 浏览器缓存
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作