明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1277, 文章 - 0, 评论 - 214, 阅读 - 321万
  博客园  :: 首页  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

window.open(url)打开链接被浏览器拦截解决方案

Posted on   且行且思  阅读(1829)  评论(0编辑  收藏  举报

浏览器为了维护用户安全和体验,禁止在JS中直接使用window.open(url)来打开新的链接(window.open(url,”_self”)改变当前的窗口是可以生效的)。下面采用几种变通方法解决:

1.表单提交的方式

var form = document.createElement('form');
form.action = 'www.baidu.com?id=1';
form.target = '_blank';

form.method = 'POST';

document.body.appendChild(form);
form.submit();

 


 

这种方式,如果需要传递参数时,需要使用 POST 方法, 默认的 GET 方法无法传递参数。也就是新页面的url中没有参数部分。

另外,Ajax下载文件时也是用form 表单来模拟下载。

2.直接将打开窗口操作放在按钮/链接的onclick事件中

如:

<a href="javascript:void(0)" onclick="window.open(url)"></a>

 

3.延迟这个打开操作

如:

setTimeout('window.open(url);', 500); // 延迟时间不能太短 否则也会被拦截

 

4.通过JS打开新窗口会被拦截,换一种实现方式

var tempwindow=window.open('_blank'); // 先打开页面
tempwindow.location='http://www.baidu.com'; // 后更改页面地址var newTab = window.open('about:blank', "_blank", "Height=500,Width=900,Left=" + iLeft + "px,Top=" + iTop + ",status=no,help=no,scrollbars=yes");;
 newTab.location.href = 'CostDetail/InvAmoutSplit?__tick=' + data;
        

5.模拟用户点击a标签的操作来实现 ,推荐这种:

复制代码
//新窗口打开网页
function openWin(url) {
    try {
        var el1 = document.createElement('a');
        el1.setAttribute("target", "_blank");
        el1.setAttribute("id", "openWin");
        el1.setAttribute("href", url);
        document.body.appendChild(el1);
        document.getElementById("openWin").click();//点击事件
        document.body.removeChild(el1);
    }
    catch (e) {
        window.open(url);
    }
}
复制代码

首先创建了个A标签,然后将url赋值给a标签,将设置好的a标签添加到Body中,js调用a标签的click事件。

6.模拟用户点击a标签的操作来实现 :

<a href="javascript:void(0)" id="openwin_screenshot" name="openwin_screenshot" target="_blank"></a>
$("#openwin_screenshot").attr("href", url);
document.getElementById("openwin_screenshot").click();//点击事件



//window.open新页,模拟模式弹窗
/*
1、直接设置父窗口的DOM对象的值:window.opener.document.getElementById(“parentWindowControlId”).value = "test";
2、id:"id",name:"name";  window.opener.DoAfterXXX(obj);  父窗口提供一个DoAfterXXX的函数就可以了。
*/
function openDialog(url, iWidth, iHeight) {
        var iTop = (window.screen.availHeight - 30 - iHeight) / 2;
        var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;
        var win = window.open(url, "弹出窗口", "width=" + iWidth + ", height=" + iHeight + ",top=" + iTop + ",left=" + iLeft + ",resizable=no,location=no, status=no,alwaysRaised=yes,depended=yes");

}
window.openex = function (url, w, h) {

    var width = isNaN(parseInt(w)) ? 800 : parseInt(w);
    var height = isNaN(parseInt(h)) ? 600 : parseInt(h);

    var iTop = (window.screen.height - height) / 2;
    var iLeft = (window.screen.width - width) / 2;

    returnData = window.open(url, "_blank", "Height=" + height + ",Width=" + width + ",Left=" + iLeft + "px,Top=" + iTop + ",status=no,help=no,scrollbars=yes");

    return false;
};
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2007-01-26 Active Directory如何用C#进行增加、删除、修改、查询用户与组织单位!
点击右上角即可分享
微信分享提示