当从一个页面快速导航到另一个脚本警报时,为什么?

时间:2014-12-13 10:36:34

标签: javascript jquery html ajax

我有一个Web应用程序(MVC 5),当我从索引页面快速移动到不同页面时,我得到一个javascript警告告诉我:" localhost:4332页面说:" (它没有说什么)。

当我按下OK按钮时,evertything恢复正常,继续到另一页,我想从pop弹出到客户端禁用此警报。

我正在思考它,因为我移动到另一个页面太快而且脚本无法完全运行。

我在脚本中做的是使用从Ajax post请求获得的值初始化下拉列表。 (为了节省加载页面时间的时间,我加载页面,然后初始化下拉列表。

这是我的代码:

$(document).ready(function () {

    $.ajax({
                type: 'POST',
                url: '/Home/GetProfiles',

                success: function (data) {
                    $.each(data, function (key, value) {

                        $('#filterSelect').append($("<option></option>").attr("value", value).text(key));

                    });

                },
                error: function (ts) { alert(ts.responseText) }

            }); 

})

我还做了一些事情,但我不想让我在这里发布的代码复杂化,我认为问题与这行代码有关。

我尝试添加&#34;尝试&#34;并且&#34;赶上&#34;使用console.log的异常,但我没有得到任何控制台,警报保持弹出

知道为什么会这样吗?我该如何解决?

2 个答案:

答案 0 :(得分:2)

您收到消息是因为浏览页面会取消任何AJAX请求,因此它们会出错。您有一个显示onerror的{​​{1}}回调,由于错误,因此无法显示任何文字。

答案 1 :(得分:0)

@Andrea Faulds是对的。发生这种情况是因为页面内容在ajax调用完成之前发生了变化。当您在ajax调用完成之前快速导航到另一个页面或重新加载当前页面时,可能会发生这种情况。

要获得适当的修复,请参阅以下网址:handle ajax error when a user clicks refresh

总而言之,很多人都这样做:

error: function (ts) {
    if (ts.readyState == 0 || ts.status == 0) return;
    alert(ts.responseText);
}

但是,这也可以抑制实际错误。例如,如果您开始ajax请求,然后禁用网络连接,则可能永远不会看到alert消息(因为在这些情况下,readyStatestatus也为零)。

另一种可能的解决方案是让你做这样的事情:

error: function (ts) {
    alert(ts.responseText || 'An asynchronous request was unable to complete.');
}

在这种情况下,通过使用||运算符,当ajax调用完成之前页面内容发生更改时,您的用户仍会看到警报。但是,警报不会为空,因为当它出现时,将显示另一条消息。