ajax请求里面调用window.open会被浏览器拦截

本文介绍了解决在业务系统中使用window.open()方法跳转到支付页面时遇到的自动拦截问题。通过调整代码逻辑,确保了弹窗能够正常显示,并提供了两种不同业务场景下的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:
业务系统需要跳转到其他系统-支付平台去完成支付,使用的 window.open(url),跳转之前需要做一系列的ajax验证,
那么问题来了,window.open放在ajax校验完成并且成功后才会调用,这时浏览器会觉得这个弹窗不是用户操作想看到的,
所以自动进行了拦截!

上述问题在我解决问题时,也分为了两种场景:

一、ajax 返回成功后立即调用window.open()方法,代码如下:

//去支付
function gotoPay(param) {
	$.ajax({
		type: "post",
		url: "/xxxx/xxxx",
		data: {"param": param},
		error: function (data) {
			showError(data);
		},
		success: function (data) {
			if (data.errorFlag == 0) {
				window.open("www.baidu.com");
			} else {
				layer.alert(data.desc, {icon: 2, title: '提示信息'})
			}
		}
	});
}

对应的解决方案(在ajax执行前先打开窗口):

//去支付
function gotoPay(param) {
	// 新加
	var newTab=window.open('about:blank');
	$.ajax({
		type: "post",
		url: "/xxxx/xxxx",
		data: {"param": param},
		error: function (data) {
			showError(data);
		},
		success: function (data) {
			if (data.errorFlag == 0) {
				// 新加
				newTab.location.href = "www.baidu.com";
			} else {
				layer.alert(data.desc, {icon: 2, title: '提示信息'})
			}
		}
	});
}


二、 ajax执行后,还需要对ajax返回结果进行业务判断,根据不同的业务还需要弹出确认框进确认,然后根据相应的操作再决定是否跳转,

那么这里如果还是跟场景一一样的ajax调用执行前就打开窗口的话,很显然交互上面就不合适了,代码如下:

//去支付
function gotoPay(param) {
	$.ajax({
		type: "post",
		url: "/xxxx/xxxx",
		data: {"param": param},
		error: function (data) {
			showError(data);
		},
		success: function (data) {
			if (data.errorFlag == 0) {
				if (data.status == 1) {
				
					// 和场景一的区别就是这里需要根据业务状态弹框确认
					layer.open({
						//type: 1,
						icon: 3,
						area: ['500px', 'auto'],
						title: "支付",
						btn: ['确认支付', '取消'],
						content: "订单当前状态为xxxxxx,确认继续支付吗?",
						btn1: function (index) {
							layer.closeAll();
							window.open("www.baidu.com");
						},
						btn2: function (index) {
							layer.closeAll();
						}
					});
				} else {
					window.open("www.baidu.com");
				}
			} else {
				layer.alert(data.desc, {icon: 2, title: '提示信息'})
			}
		}
	});
}


对应的解决方案如下:

//去支付
function gotoPay(param) {
	$.ajax({
		type: "post",
		url: "/xxxx/xxxx",
		async: false,// 只加了个同步
		data: {"param": param},
		error: function (data) {
			showError(data);
		},
		success: function (data) {
			if (data.errorFlag == 0) {
				if (data.status == 1) {
				
					// 和场景一的区别就是这里需要根据业务状态弹框确认
					layer.open({
						//type: 1,
						icon: 3,
						area: ['500px', 'auto'],
						title: "支付",
						btn: ['确认支付', '取消'],
						content: "订单当前状态为xxxxxx,确认继续支付吗?",
						btn1: function (index) {
							layer.closeAll();
							window.open("www.baidu.com");
						},
						btn2: function (index) {
							layer.closeAll();
						}
					});
				} else {
					window.open("www.baidu.com");
				}
			} else {
				layer.alert(data.desc, {icon: 2, title: '提示信息'})
			}
		}
	});
}


综上,根据不同的业务需求,对应不同的解决方法,不过如果不是必须一定要用异步的话,场景二的解决办法改动最小,最实用!!!

上述两种方法测试通过 chrome   Firefox  ie 





### 如何使用 `window.open` 实现图片文件的下载功能 为了通过 `window.open()` 方法实现图片文件的下载功能,可以利用 HTTP 响应头中的 `Content-Disposition: attachment; filename="example.jpg"` 来指示浏览器将资源作为附件处理并触发下载行为[^1]。如果服务器端未设置此响应头,则可以通过前端代码手动创建一个临时链接来模拟下载操作。 以下是具体实现方式: #### 服务端配置 确保服务器返回的图片资源带有正确的 HTTP 头部信息: ```plaintext Content-Type: image/jpeg Content-Disposition: attachment; filename="example.jpg" ``` 当客户端访问该 URL 时,浏览器会自动识别为下载动作而不是直接显示图片内容。 #### 客户端实现 如果没有权限更改服务器逻辑或希望兼容更多场景,可以在前端封装一个函数用于强制下载图片文件。下面是一个基于 AJAX 和 Blob 对象的方法示例[^3]: ```javascript export function downloadImage(url, fileName) { const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'blob'; // 设置 responseType 为 blob 类型 xhr.onload = function () { if (this.status === 200) { const blobUrl = window.URL.createObjectURL(this.response); // 创建对象 URL const aTag = document.createElement('a'); // 动态生成 <a> 标签 aTag.href = blobUrl; aTag.download = fileName || 'image.jpg'; // 自定义文件名称,默认为 image.jpg aTag.style.display = 'none'; document.body.appendChild(aTag); aTag.click(); // 模拟点击触发下载 window.URL.revokeObjectURL(blobUrl); // 解除对象 URL 占用内存 document.body.removeChild(aTag); } }; xhr.onerror = function () { console.error('Failed to fetch the image.'); }; xhr.send(); } // 调用示例 downloadImage('http://example.com/path/to/image.jpg', 'custom_name.jpg'); ``` 上述代码片段展示了如何通过 JavaScript 下载远程图片资源,并允许开发者指定保存下来的文件名。 另外需要注意的是,在某些情况下单纯调用 `window.open()` 可能无法满足需求,因为部分现代浏览器出于安全考虑会对弹窗进行拦截[^4]。因此推荐采用更可靠的解决方案如上所示。 --- ### 注意事项 - 如果目标仅限于特定类型的图像(例如 PNG 或 JPG),则需确认这些格式能够被正确解析。 - 浏览器差异可能影响最终效果,请测试不同环境下的表现情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值