如果我在新窗口中使用jQuery打开,如何避免弹出窗口阻止程序中的浏览器。我一直在谷歌搜索这个问题但仍然坚持下去。这是我制作的代码,
$(document).ready(function(){
$('#newLink').click(function(event){
event.preventDefault();
var page = $(this).attr('href');
$.post(page,
{
pr_no : pr_no
})
.done(function(data){
window.open(page, "MsgWindow", "width=800,height=800");
});
});
答案 0 :(得分:2)
如果在处理用户事件(如点击)期间使用,弹出窗口阻止程序通常只允许使用window.open。在您的情况下,您之后调用window.open,而不是在事件期间,因为$ .getJSON是异步的。
您有两种选择:
做别的事,而不是window.open。 使ajax调用同步,这通常应该像瘟疫一样避免,因为它会锁定浏览器的UI。 $ .getJSON等同于:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
...所以你可以通过将params映射到上面并添加async来使$ .getJSON调用同步: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);
}
}
});
如果你能找到任何其他方法来实现你的目标,我也不会提倡同步ajax调用。但是,如果你不能,那就去吧。
这是由于异步调用而导致测试失败的代码示例:
实例|实时源(由于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");
}
});
});
});