被重定向到错误的地方 - 有时

时间:2009-06-24 22:11:12

标签: php javascript ajax

我有一个javascript setInterval,每隔5秒检查一次外部页面的邮件,我发现有时候如果我在请求发出的同时登录或点击表单提交,我有时会发现自己看着Y或者N(我的JS要截取的是什么)而不是我想去的真实链接。

如何调试这个?我使用firefox与firebug,我的应用程序使用PHP与JavaScript。

编辑:这几乎就好像java错过了onComplete,它只是在用户登录时转储它....它只会在有人更改页面并且java同时运行时发生。

编辑2:如果您想亲眼看到这一点,您需要访问我的网站并创建一个帐户并完成注册过程(2-3分钟即可完成)网站为http://mikesandmegs.com,测试版密码为金鱼。您要做的就是在检查邮件发送请求时登录。它就像我需要取消某些东西或告诉java抛出回调或其他东西。您应该每隔5秒钟看到一次请求,(每次请求增加5秒),但您会看到。 可能需要一些尝试或一些运气,但它是可重复的。

这是正在运行的javascript(我想我已将其全部发布)如果我似乎遗漏了任何内容,请告诉我。我还发布了一个htnl输入html javascript检查...

<input id="hasMail" type="hidden" value="y">

<script type='text/javascript'>
    mailTimer = setInterval("checkMail();", 10000);

function checkMail()
{
    // should we check the mail now?
    if ($('hasMail').value == "y")
    {
        // remove mail new mail alert (mail-check.php returns y or n
        new Ajax.Request('mail-check.php', 
        { 
            method: 'post', 
            postBody: '',
            onComplete: checkMailNotify 
        });
    }
}

    function checkMailNotify(req)
    {
        if (req.responseText.length > 5)
        {
            $('hasMail').value = "n";
            clearInterval (mailTimer);
            return;
        }

        if (req.responseText == "y")
        {
            $('hasMail').value = "n";
            $('topMessage').update('<a href="/mail-inbox.php">You have new mail...</a>');
            $('alertBox').appear();
            clearInterval (mailTimer);
        }
        else
        {
            clearInterval (mailTimer);
            mailInterval = mailInterval + 5000;
            mailTimer = setInterval("checkMail();", mailInterval);
        }
    }

</script>

2 个答案:

答案 0 :(得分:1)

我知道这远不是一个解决方案,但它将有助于增加5秒间隔,甚至达到30秒。我之前已经完成了对邮件服务器的工作,并且我们经常遇到人们可能会遇到的问题,例如他们的iphone以及他们的桌面邮件客户端以非常短的间隔ping服务器。由于锁定,这将导致混淆(对他们)失败。

所以是的,5秒的消息非常快(它看起来不像是聊天,而只是消息,是吗?)。充其量只要你这样做,那么如果全部问题将会发生更少的问题。然而,你会有可能发生的可怕知识。

请不要将此作为解决问题的尝试。只是一个建议。

答案 1 :(得分:0)

我认为正在发生的事情是,在更改页面时,来自mail-check.php的数据与同时从网络返回的新请求发生冲突。我认为一个可能的解决方案是每当您更改页面或提交表单时禁用setInterval,然后在加载新数据后重新启用它。

类似的东西:

<input type="button" onClick="clearInterval('mailTimer'); this.submit()" />
...