Ajax方法在FF中不起作用

时间:2013-08-07 09:51:07

标签: javascript jquery ajax internet-explorer firefox

我正在使用以下JS代码来调用Web处理程序。 这段代码完美地调用处理程序,而不是FF。

$.ajax({ type: "GET",
            url: "../MasterPages/AHMHandler.ashx?T=1",
            dataType: "HTML",
            success: function (msg) {
                document.getElementsByName('cartId')[0].value = msg;
                }
            ,
            error: function (e) {
                return false;
            }
        });
        Sleep(2000);

我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

在您的代码中看到了Sleep()调用,以及您对alert()的评论,我会说您的问题是缺乏对Ajax代码工作方式的理解。

当你进行Ajax调用时,它被称为异步。这意味着进行了调用,然后当前函数的其余部分继续运行而不停止等待ajax代码运行。

最终将调用ajax success函数,但仅在http请求完成时才会调用。 同时,您当前的功能将继续运行

这里的要点是,如果你在ajax调用之后运行的代码中有代码,则不能依赖给定的事件序列。

放置Sleep()可能会使其看起来有效,因为某些浏览器可能会将休眠时间视为运行ajax成功函数的机会,因此您的代码似乎以正确的顺序运行。放置alert()将更有可能使其工作,因为alert()通常会在清除之前花费更多时间,因此ajax函数有更多机会运行。

但是你不应该依赖它们中的任何一个来使你的执行顺序正确。

你应该做的是把你想在ajax调用之后运行的代码放在success函数中。这是确保在ajax调用完成后运行它的唯一方法。

希望有所帮助。

[编辑] OP评论后进一步澄清:

  

Spudley,Sleep Function是我自己的功能,可以防止浏览器重定向2秒钟。 function Sleep(毫秒){var start = new Date()。getTime(); for(var i = 0; i< 1e7; i ++){if((new date()。getTime() - start)> milliseconds){break; }}

仅仅是为了参考,像这样的睡眠功能在Javascript中是一个非常可怕的想法。你应该使用setTimeout()来做这种事情。

但是,重点仍然是相同的 - 您的代码在$.ajax()之后运行,它将阻止执行您的ajax成功函数。如果你之后正在进行重定向,那么成功函数可能永远不会有机会运行。

alert()确实会使它工作,因为success函数会在调用Sleep之前清除警报时找到要运行的插槽,但您不应该依赖它在那。

答案保持不变:您应该在success函数内放置ajax调用之后要运行的代码。

以下是您所做更改的代码:

$.ajax({ type: "GET",
        url: "../MasterPages/AHMHandler.ashx?T=1",
        dataType: "HTML",
        success: function (msg) {
            document.getElementsByName('cartId')[0].value = msg;
            setTimeout(function() { //this instead of your Sleep function
                 //this is where you need to do your redirect, or whatever else you're doing after the ajax completes.
            }, 2000);
        }
        ,
        error: function (e) {
            return false;
        }
});
//don't put **any** code here after the ajax call! put it in the success function.