IE8在setTimeout中调用自身的javascript函数出现问题

3
我在JavaScript中定义了一个定位函数。
var locID;

function locateMe()
{
    if(locID > 0)
    {
        // i do a jquery post here
    }

    setTimeout(locateMe, 2000);
} 

// my document ready function is here, and inside it, at the end of it
// i do this
locID = 0;
locateMe();

当我在火狐浏览器中测试这段代码时,locateMe函数每两秒钟被调用一次并且按预期工作。但是当我在IE8中测试代码时,该函数从未被调用(至少从IE的开发工具中看不到有被调用)。请注意:“zone_row”类别的点击事件处理程序中定义了代码来修改locID。同样,在火狐浏览器中一切都按预期工作。奇怪的是,在IE中,当zone_row被单击时,该函数将被调用一次。我可以通过开发人员工具和jquery post的结果看到这一点。我认为这只是IE上的某些异常情况,我尚未熟悉它。我做错了什么?注意:将“locateMe();”更改为setTimeout调用内部的locateMe。更新:添加我的更多代码(根据评论请求)以显示放置位置(尽管比第一篇文章的代码少得多)。
<script type="text/javascript">
    var z_items;
    var locID;

    function locateMe()
    {
            if(locID > 0)
            {
                    // my jquery post is here                   
            }   

            setTimeout(locateMe, 2000);
    }

    $(document).ready(function()
    {
            // ... some click events and get requests here ...

            locID = 0;
            locateMe();
    });
</script>

我还尝试了将调用包装在setTimeout中(没有效果),并更改了DOCTYPE(这实际上导致IE从未调用该函数,与现在只调用一次不同,之后就再也不调用了)。


2
首先将 setTimeout("locateMe()", 2000); 更改为 setTimeout(locateMe, 2000);。 - Sean
1
实际上,setTimeout("locateMe()",2000); 对我来说完全没问题(Win7中的FF3.6和IE8)。你使用的是什么 DOCTYPE?此外,你的代码放在哪里?你尝试过将第一个 locateMe() 调用包装在超时中吗(也许在页面加载期间有些东西正在破坏你)?最后,用 testID++;test=document.getElementById("TEST");test.innerHTML=testID; 替换你的 if(locId>0){...} - Brett Pontarelli
嗯...我没有考虑DOCTYPE。现在它被设置为严格模式。这是个坏主意吗?(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">) - trh178
@Brett - 太棒了!testID建议真是太好了。这就是我在“调试”互联网内容时从未想到的事情(因为我不习惯这种编程方式)。我尝试了一下,IE8警告我不要运行ActiveX控件。当我点击“允许阻止的内容”后,testID开始递增。 - trh178
仍然无法工作。我以为由于Brett的评论起作用,POST现在会起作用。但它没有。我已经将计数器和POST都放在那里了。我可以看到计数器增加,表示函数实际上正在被调用。我下载了Fiddler来监视流量。我只看到一个POST被发送出去。另外一点,我还在计数器下面显示了locID。每次它确实是正确的ID(即不为零),所以我应该进入if来发送post。我又迷失了。我不确定如何使用正确的locID调用函数而不发送post? - trh178
3个回答

2
问题得到解决。我从这篇文章中找到了另一个问题的答案:防止浏览器缓存jQuery AJAX调用结果。在我的文档准备函数中添加$.ajaxSetup({ cache: false });,它也解决了这个问题。看起来一直是一个缓存问题。

1

我发现对于IE(甚至是IE9),如果将自调用函数嵌套在匿名函数中,它就可以工作。但看起来Toddeman的问题与ajax部分有关。

因此,代码应该是:

function locateMe()
{
    /* ... */   

    //IE way (still works in Chrome and FF):
    setTimeout(function () { locateMe(); }, 2000);

    //original: setTimeout(locateMe, 2000);
}

0

使用

setTimeout( locateMe, 2000 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接