当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:
-
做别的,而不是
window.open
。 -
使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而不用浏览器阻塞,只有当用户做了一些直接的操作。 浏览器发送一些标志,并确定用户操作打开的窗口。
所以,你可以试试这个场景:
- var myWindow = window.open('')
- 在此窗口中绘制任何加载消息
- 当请求完成时,只需调用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; } }); });
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