调用window.open打开页面,新打开的页面一段时间后自动关闭的问题

本文探讨了在使用AJAX获取数据后,如何避免window.open()方法导致的页面自动关闭问题,提出了通过定义隐藏按钮并触发其click事件,以及设置AJAX为同步模式两种解决方案。

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

window.open()方法写在ajax回调方法里,会出现问题。问题现象是新打开的页面一段时间后就自动关闭。源代码如下

$.get(url,{ran:Math.Random()},successed);

 

function successed(data){

      window.open("url?id=" + data.id );

}

 

网上查了好多资料,都说是在服务端用window.open弹出窗口会被IE阻止掉。而通过我们用鼠标点击弹出的窗口,它是不会阻止的。解决办法一,在jsp定义一个隐藏按钮,把window.open方法写在这个隐藏按钮的click事件中,在ajax回调方法里间接调用这个click事件。

jsp

<input type="button" id="hiddenButton" onclick="openNewPage()"/>

 

js

function openNewPage(){

      window.open("url");

}

 

function successed(data){

      $("#hiddenButton").trigger("click");

}

 

此解决方法还是不行。

 

解决办法二:

 

ajax 设置为同步,代码如下

    var  data = null;

     $.ajax({
         type: "POST", url: path,
         async:false,
         success:function(result){
          data = result;
         },
         error:function(XmlHttpRequest,textStatus, errorThrown){
          data={exception:{message:XmlHttpRequest.responseText}};
         }
     });

  

     if(!data && !data.exception){

              window.open("url?id=" + data.id);

 

    }

### 使用 `window.open` 加密 URL 参数并在页面解密 当通过 `window.open` 方法打开的浏览器窗口并希望安全地传递参数时,可以通过 Base64 编码来加密这些参数。Base64 是一种常见的编码方式,在URL中传输相对安全且简单。 #### 页面 A 中的加密过程 在源页面(即页面A),定义了一个用于加密字符串的方法: ```javascript const encryption = (str) => { return window.btoa(unescape(encodeURIComponent(str))); }; ``` 此函数接收一个字符串作为输入,并返回经过 Base64 编码后的版本[^1]。接着构建要跳转的目标链接,其中包含了已加密的形式提交给服务器端处理的数据: ```javascript const formUrl = 'https://example.com/pageB'; // 假设这是页面 B 的 URL const getHostIp = () => 'http://yourserveraddress/'; // 获取主机 IP 地址或其他路径前缀 const url = `${getHostIp()}CModel?url=${encryption(formUrl)}`; window.open(url, '_blank'); ``` 这段代码创建了一个指向特定资源的 URL,并将其作为参数附加到另一个页面上,最后调用了 `window.open()` 函数以弹出一个的浏览窗口加载该地址。 #### 页面 C 接收与解密参数的过程 对于接收到请求的服务端脚本来说,则需要解析传入的查询串并将之转换回原始形式以便进一步操作。假设服务端已经成功获取到了加密过的 URL 字符串,那么可以在客户端JavaScript里执行如下反向逻辑来进行解密展示: ```javascript function decryption(encodedStr){ try{ let decodedStr = decodeURIComponent(escape(window.atob(encodedStr))); console.log('Decrypted:',decodedStr); document.getElementById('output').innerText = decodedStr; }catch(e){ console.error('Failed to decrypt the string.', e); } } // 解析 URL 查询参数中的加密字段 (function(){ var query = {}; location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(a,name,value){query[name]=value}); if(query['url']){ decryption(query['url']); } })(); ``` 上述匿名立即执行函数会自动读取当前网页上的查询参数,并尝试从中提取名为 `'url'` 的键对应的值;如果存在这样的键值对,则对其进行解密处理。 #### 安全注意事项 虽然这里采用的是简单的 Base64 编码技术,但这并不意味着绝对的安全保障。实际上,Base64 只是一种编码而非真正的加密算法。为了增强安全性,建议考虑使用更高级别的加密标准如 AES 或 RSA 来保护敏感信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值