任何人都可以提供帮助,我有一些jquery和chrome正在阻止我正在创建的弹出窗口。经过一些调查后,似乎是window.open
成功发生ajax调用时的问题。这有什么方法吗?我的jquery ajax调用需要返回我需要打开的URL,所以我有点卡住了。
如果我将open.window
置于ajax调用之外,它会起作用,但在内部(成功)它会被阻止。我认为这与CONTEXT有关,但我不确定......
任何想法真的很感激......
这就是我所拥有的:
window.open("https://www.myurl.com"); // OUTSIDE OF AJAX - no problems
// with popup
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
// Normally loads msg.d that is the url that is returned from service but put static url in for testing
window.open("https://www.myurl.com"); // THIS IS BLOCKED
},
error: function(msg) {
//alert(error);
}
});
答案 0 :(得分:17)
有几个人指出,接受的答案不再有效。根据aidiakapi的评论,我首先打开窗口使用了一种解决方法。
window.open("about:blank", "myNewPage");
然后执行ajax业务并在done()
函数中,打开具有该名称的页面。
window.open("/foo.html", "myNewPage");
如果您执行异步操作,这也无关紧要。
答案 1 :(得分:7)
只需在成功回调中打开新窗口:
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
window.open("https://www.myurl.com");
},
error: function(msg) {
//alert(error);
}
});
请注意,您可能必须将$ .ajax的async选项设置为false,否则可以在收到响应之前评估$ .ajax调用之后的代码。
答案 2 :(得分:7)
您的代码在firefox和chrome中返回这些:
Firefox:“Firefox阻止此网站打开弹出窗口。” Chrome:“弹出窗口阻止”
要解决此问题,只需在您的ajax调用中添加async:false即可。
$.ajax({
type: "POST",
async: false,
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(url) {
window.open(url);
},
error: function(msg) {
//alert(error);
}
});
请注意,async:false会强制javascript等待jQuery ajax结果。这意味着它会冻结javascript直到ajax调用完成。
答案 3 :(得分:2)
Firefox根据导致javascript代码运行的事件执行弹出窗口阻止;例如,它将允许打开由onclick
触发的弹出窗口,但不允许弹出由setTimeout
触发的弹出窗口。多年来,由于广告商试图规避firefox的弹出窗口拦截器,它已经变得有点复杂。
答案 4 :(得分:1)
您仍然可以在成功事件中获得代码,但异步将需要为false。
答案 5 :(得分:1)
按照本文中描述的方法:
window.open without popup blocker using AJAX and manipulating the window.location
简而言之,方法是:
onclick
事件发起。window.open
---并存储对窗口的引用,以便您以后可以使用它。window.location.replace
操作已打开窗口的URL和所需的URL。答案 6 :(得分:1)
if you put async:true then you must do the following:
var safariOP = window.open("https://www.myurl.com"); // DEFINE BEFORE AJAX CALLBACK
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
if(safariOP){
safariOP.focus(); // IT'S OK ON SAFARI
}
},
error: function(msg) {
//alert(error);
}
});
答案 7 :(得分:0)
如果你把async:true,那么你必须执行以下操作:
var safariOp = window.open("https://www.myurl.com"); //define before callback ajax contains url .
$.ajax({
type: "POST",
url: "MyService.aspx/ConstructUrl",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
//it's ok on safari
safariOp.focus();
},
error: function(msg) {
//alert(error);
}
});
答案 8 :(得分:0)
这对我有用。
$(document).ready(function() {
$('#myLink').on( "click", function() {
var myNewTab = window.open('about:blank', '_blank');
$.ajax({
method: "POST",
url: "ajax.php",
data: { name: "John", location: "Boston" },
})
.done(function( msg ) {
myNewTab.location.href = "google.com";
});
});
});