javascript间隔阻止点击元素(有时)

时间:2012-12-07 17:47:23

标签: javascript ajax intervals

我认为这不一定是间隔错误,但这就是正在发生的事情。

基本上,我为网站的这一部分构建了自己的“谷歌搜索”功能。它将列出一堆票证类型的项目,搜索功能允许他们像在Google中一样搜索票证。在您键入时,它会填充您正在进行的搜索。

因此,interval事件持续运行并调用一个AJAX函数(显然调用一个运行我编码的方法的.jsp文件,根据输入的文本搜索数据库)然后将返回的数据拆分并粘贴到网页,你知道,标准的AJAX东西。

但是,当我尝试点击其中一个链接时,它似乎忽略它就像我必须在特定时间点击它才能让页面注册点击。我可以减慢间隔,它可以缓解一些问题但是搜索似乎。并且它偶尔会忽略点击次数。链接是表元素内的标准链接。

AJAX函数 - 我在发回之前格式化了数据(我更喜欢Java编码到JavaScript,所以我在那里做了而不是XD)

间隔设置为500MS。所以它一次性替换文本而不是逐行替换。所以idk为什么这样做:/我在使用连续间隔的其他页面上没有这个问题。但是,该页面没有AJAX调用。

function getResults(supplier, request, cat, type, displayFiles, input)
{

    var output;
    //Ajax variable
    var xmlhttp;
            //Makes the call to the ajax engine based on browser
            if (window.XMLHttpRequest)
          {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
          }
        else
          {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }  

            var url = "getResults.jsp?supplier=" + encodeURIComponent(supplier) + "&request= " + encodeURIComponent(request) + "&cat= " + encodeURIComponent(cat) + "&type= " + encodeURIComponent(type)
            + "&displayFiles= " + encodeURIComponent(displayFiles) + "&input= " + encodeURIComponent(input);                        



            xmlhttp.open("POST",url,true);


            //Handling of the ajax call
            xmlhttp.onreadystatechange = function(){
                    if(xmlhttp.readyState == 4){             
                        output = xmlhttp.responseText;
                        //alert(output); //Gives the success or failure of the ajax call            
                        document.getElementById("resultsBox").innerHTML = output;

                    }
                }       

          xmlhttp.send(null); 
}

2 个答案:

答案 0 :(得分:0)

所以你有一个由setInterval创建的计时器,它每隔(至少)500ms触发一次搜索方法。

搜索方法是Async,因此您甚至可以在旧搜索请求完成之前触发新的搜索请求,这可以创建一系列对innerHTML属性的更新(取决于服务器的响应时间)。因为即使每隔500毫秒发出一次请求,您也不知道响应何时到达。

作为建议,尝试重做逻辑,用setTimeout(甚至requestAnimationFrame)替换setInterval,以避免"溢出"行为,而不是更新整个结果块只是新的。

答案 1 :(得分:0)

你可以像我为游戏那样做。

search() {
    do stuff
    setTimeout(search,500);
}

这就是我在javascript中进行连续循环的方法。这样它只是一个循环。 setTimeout只运行一次它的功能。 setInterval每隔一段时间运行它,它很容易被粗心大意。使用setTimeout,你可以让search()函数在完成时再次调用它。