jQuery - 使用Window.Open()防止弹出窗口阻止程序;

时间:2016-08-07 08:25:26

标签: javascript jquery

如果我在新窗口中使用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");
    });
});

1 个答案:

答案 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");
      }
    });
  });
});