AJAX'成功'在AJAX执行之前调用IE

时间:2014-07-15 10:18:40

标签: javascript php jquery ajax internet-explorer

简要说明

要添加到列表中的另一个Internet Explorer问题...我的页面上有一个关闭当前标签/窗口的按钮,但在此之前它会执行一个AJAX请求以删除文档会话&#39 ;。非常简单的东西:

MN.ajax({
    url: url,
    dataType: "JSON",
    errorText: 'There was a problem deleting the session, please retry later',
    success: function(data){
        // Close the tab/window
        window.open(window.location, '_self').close();
    }
});

忽略MN.ajax(),这只是$.ajax()的包装函数,它的工作方式相同,但有一些额外的位,例如' errorText'

问题

上述代码适用于除IE之外的每个浏览器。在IE中,它在实际执行AJAX请求之前关闭窗口/选项卡。 AJAX请求应删除我的数据库中的记录,但除非我注释掉window.open(window.location, '_self').close();

,否则不会删除任何记录

可能的解决方案

我没有对此进行过测试,但我认为如果我用setTimeout包装关闭窗口那么它应该可以工作。但是,我想知道的是为什么!!?为什么它会成功地实现“成功”。在AJAX请求实际完成之前的函数?

我尝试了什么......

我尝试过的另一件事就是关闭'关闭窗口'将代码转换为complete回调而不是success回调,但这绝对没有区别......

更新

这是完整的包含功能:

/**
 * Close the Document
 */
MN.closeDocument = closeDocument;
function closeDocument(document_reference,session_id){
    // Show the loading dialog
    MN.loadingDialog('Closing Document...',function(){
        // Execute the autosave function to save the session
        MN('#document-modify-form').autosave('save',function(){
            MN.ajax({
                url: '//api.example.net/document/session/'+document_reference+'/',
                dataType: "JSON",
                errorText: 'There was a problem getting the documents session',
                success: function(data){
                    // Only close if there are no changes
                    switch(data.status){
                        // There is no session or no changes
                        case 'no_session':
                        case 'no_changes':
                            // Delete the session
                            MN.ajax({
                                url: '//api.example.net/document/delete-session/'+document_reference+'/',
                                dataType: "JSON",
                                errorText: 'There was a problem deleting the session, please retry later',
                                success: function(data){
                                    // Close the tab/window
                                    window.open(window.location, '_self').close();
                                },
                                error: function(msg){
                                    // Error code here
                                }
                            });
                        break;
                        // Other cases here
                    }
                },
                error: function(msg){
                    // Error code here
                }
            });
        });
    });
}

2 个答案:

答案 0 :(得分:0)

我已经从您的代码构建了以下简化的测试页面。这可以在我的系统(Win8.1 x64,IE11)上正常工作:窗口在3秒后关闭,当ajax调用完成时。

<强> ajax.php:

<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
sleep(3);
?>
<!DOCTYPE html>
<html>
<head>
    <title>ajax test</title>
    <script type="text/javascript" src="jquery-1.11.1.min.js"></script>
    <script type="text/javascript">
        function test_click()
        {
            $.ajax({
                url: 'ajax.php',
                success: function(data)
                {
                    // Close the tab/window
                    window.open(window.location, '_self').close();
                }
            });
        }
    </script>
</head>
<body>
    <a href="#" onclick="test_click()">Close</a>
</body>
</html>

答案 1 :(得分:0)

经过大量测试后,我发现了问题所在。 $.ajax的功能在成功回调中调用window.open(window.location, '_self').close();绝对没有错。这有效!

我试图删除的文档会话实际上已被删除,但由于窗口正在重新打开然后由window.open(window.location, '_self').close();关闭,会话正在重新创建!所以似乎会话永远不会被删除。

这意味着我的问题有两个解决方案,不要使用window.location,因为这会重新打开相同的页面,从而重新创建会话,或者找到另一种方法来使用javascript关闭选项卡/窗口。

感谢您的帮助,抱歉浪费您的时间! : - )