【问题标题】:Popup blocked when created in jQuery ajax success callback在 jQuery ajax 成功回调中创建弹出窗口时被阻止
【发布时间】:2009-07-06 12:21:03
【问题描述】:

Google Chrome 似乎阻止了我通过 jQuery 创建的弹出窗口。经过一番调查,在 ajax 调用的成功事件中调用 window.open 似乎是一个问题。有没有解决的办法?我的 jQuery ajax 调用返回要打开的 URL。所以我有点卡住了。

如果我将 window.open 放在 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 which is the url returned from service
            // static url below is for testing
            window.open("https://www.myurl.com");  // THIS IS BLOCKED
        },
        error: function(msg) {
            // alert(error);
        }
    });

【问题讨论】:

    标签: jquery ajax popup


    【解决方案1】:

    正如一些人指出的那样,接受的答案不再有效。根据 aidiakapi 的评论,我使用了一种解决方法,首先打开窗口。

    window.open("about:blank", "myNewPage");
    

    然后做ajax业务,在done()函数中,打开那个名字的页面。

    window.open("/foo.html", "myNewPage");
    

    这也无关紧要,如果你做异步或不。

    【讨论】:

    • 这适用于我最新版本的 Safari、Chrome 和 Firefox。它应该是公认的答案。
    • 如果您需要根据返回的数据有条件地打开一个新窗口,这将不起作用。在我们的例子中,只有在我们返回的 JSON 对象中找到某个值时,我们才应该打开一个新选项卡。使用这种方法,我们将打开/关闭窗口。
    • @geneb。你的答案很简单:你不能。如果您在没有用户操作的情况下打开一个窗口,它将被浏览器阻止。此解决方法有效,因为它打开了用户操作的窗口。您需要添加用户操作。所以你能做的最好的就是等待你的 JSON,然后显示一个“就绪”按钮供用户点击。
    • 工作得很好!救命的答案。 :)
    【解决方案2】:

    只需在成功回调中打开新窗口:

     $.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 的异步选项设置为 false,否则可能会在收到响应之前评估 $.ajax 调用之后的代码。

    【讨论】:

    • 卡里姆,你救了我的命!
    • 当您不使用异步 AJAX(毕竟这意味着“异步 Javascript 和 Xml”)时,它有什么用?有几种选择,例如使用模式、在请求之前打开窗口、显示加载文本以及在完成时重定向窗口。我认为这很脏。
    • @pst - 天哪。那时我还年轻。我会解决这个问题。
    • @karim79 我认为现在问题中的代码和您的答案中的代码是相同的。我也有同样的问题,也无法正常工作:如果在“成功”回调中使用了 window.open,它会被浏览器阻止。
    • @parrker9 如果您查看编辑历史记录,您会看到关于异步标志设置为 false 的注释。在目前的状态下,答案是没用的,恕我直言
    【解决方案3】:

    您的代码在 Firefox 和 chrome 中返回这些:

    Firefox:“Firefox 阻止此站点打开弹出窗口。” Chrome:“弹出窗口被阻止”

    要解决这个问题,只需将 async:false 添加到您的 ajax 调用中即可。

    $.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 调用完成。

    【讨论】:

    • 仅供参考,这不再适用于 Chrome 版本 30 或 IE 10.0.4
    • 在大多数情况下,锁定 UI 似乎是一个糟糕的计划。
    • 既然我们是在ajax调用后重定向到另一个页面,那么这不会是一个大问题。
    【解决方案4】:

    Firefox 会根据导致 javascript 代码运行的事件来阻止弹出窗口;例如,它将允许打开由onclick 触发的弹出窗口,但不允许打开由setTimeout 触发的弹出窗口。多年来,随着广告商试图绕过 Firefox 的弹出窗口拦截器,它变得有点复杂。

    【讨论】:

      【解决方案5】:

      您仍然可以在成功事件中包含代码,但 async 需要为 false。

      【讨论】:

      • 在大多数情况下,锁定 UI 似乎是一个糟糕的计划。
      【解决方案6】:

      按照这篇文章中描述的方法:

      window.open without popup blocker using AJAX and manipulating the window.location

      简而言之,方法是:

      1. 您的代码必须由 onclick 事件启动。
      2. 使用window.open 打开一个新窗口,最初可能没有内容,并存储对该窗口的引用,以便以后使用。
      3. 在 AJAX 操作的成功回调中,使用 window.location.replace 使用所需 URL 操作已打开窗口的 URL。

      【讨论】:

        【解决方案7】:
         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);
            }
        });
        

        【讨论】:

          【解决方案8】:

          如果您输入 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);
              }
          });
          

          【讨论】:

            【解决方案9】:

            这对我有用。

            $(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";
                        });
                    });
                });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-01-16
              • 1970-01-01
              • 1970-01-01
              • 2011-04-14
              • 2012-06-25
              • 1970-01-01
              • 1970-01-01
              • 2014-02-11
              相关资源
              最近更新 更多