解决window.open()被浏览器拦截的问题
一、问题描述
最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截。何况当出现拦截时,很多用户根本不知道发生了啥,不知道在哪里看被拦截的页面。因此必须通过代码来解决这个问题!
以下是浏览器拦截示例:
文章图片
文章图片
文章图片
文章图片
二、问题分析
浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了,即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截。
三、window.open()语法
【解决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文档中的标记或
测试弹框拦截 - 锐客网 测试弹框拦截
五、解决方案在 ajax请求之前,先用window.open 打开一个空白窗口,然后在ajax的响应函数中设置该窗口的location属性为新的url。
测试弹框拦截 - 锐客网 测试弹框拦截
六、小结 上面方法,存在一个问题时,因为先打开了空白窗口,如果ajax请求失败(网络或业务逻辑问题)后, 新窗口中就不会有正常的结果体现,有可能造成用户疑惑。
一个解决办法是,当ajax出现问题时,可以考虑给出一个提示,如newWindow.document.write("服务器处理异常");
甚至为了防止ajax响应时间过长,当窗口新建后,立即给出提示newWindow.document.write("服务器正在处理中,请稍后");
后面如果ajax正常返回,则因为设置了location值,原来打印的信息会被新的页面信息覆盖。
七、思考 对于动态打开新窗口,没有特别完美的方法。具体还需根据特定的业务场景来采取相应的做法!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- vite项目require语法兼容问题解决 require is not defined
- Python包安装|解决安装matplotlib时的超时问题
- 在VMware|在VMware Workstation 16上安装Windows7虚拟机以及VMware tools安装失败解决方法
- 百度百家号连接飞书云文档(快速解决线索信息无法自动汇总到文档的问题)
- vs2022出现无法打开头文件:|vs2022出现无法打开头文件: “sys/socket.h”的解决办法
- 一个help函数解决了python的所有文档信息查看
- 电子烟:被资本“吸出”的新风口|灰飞烟灭,美国电子烟巨头遭遇灭顶之灾
- vue中radio根据动态值绑定checked无效的解决
- springcloud引入spring-cloud-starter-openfeign失败的解决
- Vue.js项目在apache服务器部署问题解决