当jQuery event.preventDefault()被设置时,绕过window.open的popup窗口拦截器

我想在一个超链接的点击事件中有条件地显示一个JQuery对话框。

我有一个像在condition1上打开一个JQuery对话的要求,如果不满足条件1,导航到页面,其引发点击事件的'href'标记。

我可以在链接的点击事件上调用一个函数。 此函数现在通过执行另一个URL(执行我的Spring控制器并返回响应)来检查所述条件。

所有的作品完美,只有window.open被popup式窗口拦截器阻止。

$('a[href*=/viewpage?number]').live('click', function(e) { e.preventDefault(); redirectionURL = this.href; pageId= getUrlVars(redirectionURL)["number"]; $.getJSON("redirect/" + pageId, {}, function(status) { if (status == null) { alert("Error in verifying the status."); } else if(!status) { $("#agreement").dialog("open"); } else { window.open(redirectionURL); } }); }); 

如果我删除e.preventDefault(); 从代码,popoup阻止不会阻止页面,但是,条件1然后打开对话,以及打开“href”页面。

如果我解决了这个问题,就会给另一个问题造成问 我无法同时对这两种情况给予正义。

你能帮我解决这个问题吗?

一旦解决了这个问题,我还有另外一个问题需要解决,即导航对话的OK事件:)

popup式窗口拦截器通常只允许处理用户事件(如点击) 期间使用window.open 。 在你的情况下,你稍后调用window.open ,而不是在事件期间,因为$.getJSON是asynchronous的。

你有两个select:

  1. 做别的,而不是window.open

  2. 使ajax调用同步,这是你应该避免像瘟疫一样,因为它locking了浏览器的用户界面。 $.getJSON相当于:

     $.ajax({ url: url, dataType: 'json', data: data, success: callback }); 

    …所以你可以使你的$.getJSON调用同步映射你的参数上面并添加async: false

     $.ajax({ url: "redirect/" + pageId, async: false, dataType: "json", data: {}, success: function(status) { if (status == null) { alert("Error in verifying the status."); } else if(!status) { $("#agreement").dialog("open"); } else { window.open(redirectionURL); } } }); 

    再一次,如果你能find任何其他的方式来实现你的目标,我不主张同步Ajax调用。 但是,如果你不能,那么你去。

    以下是由于asynchronous调用而导致testing失败的代码示例:

    现场示例 | 活的来源 (由于JSBin的变化,活的链接不再工作)

     jQuery(function($) { // This version doesn't work, because the window.open is // not during the event processing $("#theButton").click(function(e) { e.preventDefault(); $.getJSON("http://jsbin.com/uriyip", function() { window.open("http://jsbin.com/ubiqev"); }); }); }); 

    下面是一个使用同步调用的例子:

    现场示例 | 活的来源 (由于JSBin的变化,活的链接不再工作)

     jQuery(function($) { // This version does work, because the window.open is // during the event processing. But it uses a synchronous // ajax call, locking up the browser UI while the call is // in progress. $("#theButton").click(function(e) { e.preventDefault(); $.ajax({ url: "http://jsbin.com/uriyip", async: false, dataType: "json", success: function() { window.open("http://jsbin.com/ubiqev"); } }); }); }); 

你可以调用window.open而不用浏览器阻塞,只有当用户做了一些直接的操作。 浏览器发送一些标志,并确定用户操作打开的窗口。

所以,你可以试试这个场景:

  1. var myWindow = window.open('')
  2. 在此窗口中绘制任何加载消息
  3. 当请求完成时,只需调用myWindow.location =' http://google.com '

我有这个问题,我没有准备好我的url,直到callback将返回一些数据。 解决方法是在开始callback之前打开空白窗口,然后在callback返回时设置位置。

 $scope.testCode = function () { var newWin = $window.open('', '_blank'); service.testCode().then(function (data) { $scope.testing = true; newWin.location = '/Tests/' + data.url.replace(/["]/g, ""); }); }; 

试试这个,它适合我,

 $('#myButton').click(function () { var redirectWindow = window.open('http://google.com', '_blank'); $.ajax({ type: 'POST', url: '/echo/json/', success: function (data) { redirectWindow.location; } }); }); 

这小子是这个http://jsfiddle.net/safeeronline/70kdacL4/1/

Windows必须与用户启动的事件在相同的刻度/堆栈上创build,例如点击callback。

但是,您可以创build一个没有URL的窗口 ,然后可以在知道该窗口之后更改该窗口的URL,即使是asynchronous的!

 window.onclick = () => { // You MUST create the window on the same event // tick/stack as the user-initiated event (eg click callback) const googleWindow = window.open(); // Do your async work fakeAjax(response => { // Change the URL of the window you created once you // know what the full URL is! googleWindow.location.replace(`https://google.com?q=${response}`); }); }; function fakeAjax(callback) { setTimeout(() => { callback('example'); }, 1000); } 

现代浏览器最初会打开窗口about:blank ,假设你的asynchronous任务得到的URL很快,那么最终的用户体验大部分都是正常的。 如果您不想在用户等待时向窗口中显示加载消息(或任何内容),则可以使用数据URI 。

 window.open('data:text/html,<h1>Loading...<%2Fh1>'); 

这个事件必须由用户发起的观察帮助我弄清楚了第一部分,但即使在Chrome和Firefox之后,它仍然阻止了新的窗口。 第二部分是在链接中添加target =“_ blank”,在一个评论中提到。

总结:你需要从用户发起的事件中调用window.open,在这种情况下点击一个链接,那个链接需要有target =“_ blank”。

在下面的例子中,链接使用class =“button-twitter”。

 $('.button-twitter').click(function(e) { e.preventDefault(); var href = $(this).attr('href'); var tweet_popup = window.open(href, 'tweet_popup', 'width=500,height=300'); }); 

这段代码帮助我。 希望这对一些人有所帮助

 $('formSelector').submit( function( event ) { event.preventDefault(); var newWindow = window.open('', '_blank', 'width=750,height=500'); $.ajax({ url: ajaxurl, type: "POST", data: { data }, }).done( function( response ) { if ( ! response ) newWindow.close(); else newWindow.location = '/url'; }); }); 

尝试使用链接元素,并用javascriipt单击它

 <a id="SimulateOpenLink" href="#" target="_blank" rel="noopener noreferrer"></a> 

和脚本

 function openURL(url) { document.getElementById("SimulateOpenLink").href = url document.getElementById("SimulateOpenLink").click() } 

像这样使用它

 //do stuff var id = 123123141; openURL("/api/user/" + id + "/print") //this open webpage bypassing pop-up blocker openURL("https://www.google.com") //Another link