1

我有这个由点击事件触发的 JS 函数。它应该存储一些数据,然后打开一个带有输入表单的窗口。原始代码类似于:

function myClickFunction(){
    $('html').mask('Loading...');
    SaveData( function(){ //callback function
        window.open(...);
        $('html').unmask();
    });
}

问题是 window.open 被弹出窗口阻止程序阻止。如果我做:

function myClickFunction(){
    $('html').mask('Loading...');
    SaveData();
    $('html').unmask();
    window.open(...);
}

它工作得很好,但当然我只想在 SaveData() 完成时打开窗口。

SaveData() 执行 ajax 调用并试图使解决方案 #2 工作我尝试在 ajax 调用中设置 async: false 但这只会阻止我的 $('html').mask('Loading...') 调用.

我的设置类似于https://stackoverflow.com/a/11670238/1480182但另一个问题是它必须在 iPad 上的 Safari 上运行。在这个特定的浏览器中,无法与窗口/选项卡进行通信,这意味着当我打开新窗口时,我会在打开的选项卡上停止任何 js 执行:-(

我应该如何处理这个?

4

3 回答 3

2

如果弹出窗口不是直接响应用户操作而打开的,则弹出窗口阻止程序通常会阻止弹出窗口。因为 ajax 调用是异步的,所以它的完成功能是在用户操作之后的某个时间,并且就浏览器所知,它不是直接响应用户操作,因此它可能会被阻止。除了仅在直接响应用户操作时打开弹出窗口外,没有简单的方法可以解决此问题。

下一个明显的问题/解决方法是您是否真的需要一个单独的浏览器窗口/选项卡?您可以通过在原始窗口中使用叠加层来使您的应用程序正常工作吗?叠加层的限制为零,您可以使用它做任何您想做的事情。

于 2013-12-27T06:47:03.130 回答
1

您可以打开一个新窗口并让它处理保存和重定向,而不是在myClickFunction. 数据可以通过页面在页面之间传输localstorage

所以,例如,像

function myClickFunction(){
    window.localStorage.tmpData = JSON.stringify(getData());
    window.localStorage.tmpRedirecturl = '...';
    window.open('saveandredirect.html);
}

在 saveandredirect.html

$(function(){
    $('html').mask('Loading...');
    var data = JSON.parse(window.localStorage.tmpData);
    var redirecturl = localStorage.tmpRedirecturl;

    delete window.localStorage.tmpData; // clear storage
    delete localStorage.tmpRedirecturl;

    SaveData(data, function(){
        window.location = redirectUrl;
        $('html').unmask();
    });
})
于 2013-12-27T08:55:52.350 回答
0

通过使用弹出窗口,您可以触发对客户端计算机的操作。您无法控制客户端计算机上的操作。用户可以随时禁用弹出窗口...我建议考虑使用jquery 覆盖工具,它将您的目标页面放在覆盖上...

希望我有所帮助!

于 2013-12-27T07:02:15.320 回答