2010-05-13 97 views
1

我有一个jQuery ajax函数来检索JSON数据。在成功块中,我调用另一个函数来解析数据并更新页面。在这个解析/更新函数结束时,会产生不同的ajax调用。除了Internet Explorer(7和8)以外,这在所有浏览器中都可以正常工作。问题是Internet Explorer认为脚本处理时间过长,因为第一个ajax调用的成功块在第二个Ajax调用完成之前并未完成。jQuery ajax成功链接Internet Explorer问题

我收到消息: “停止运行此脚本?此页面上的脚本导致您的Web浏览器运行缓慢,如果它继续运行,您的计算机可能无响应。

我的jQuery代码:

$("#id_select").bind("change", function(e){ 
    $.ajax({ 
    url: "/retrieve_data.js", 
    data: {id:$(e.target).children(":selected").attr("value")}, 
    type: "get", 
    dataType:"json", 
    success: function(data, status, form){    
     processData(data); 
    }, 
    error: function(response, status){ 
     alert(response.responseText); 
    } 
    }); 
}) 

如何让IE停止超时或不重写我所有的jQuery函数来完成这项任务的任何建议,将不胜感激。

+1

这是一个黑暗中的镜头,但是可能会将你的调用放到'setTimeout()'内部的'processData(data)'中(持续时间最短),这样'success'函数将立即返回?没有尝试过,但谁知道。 – user113716 2010-05-13 02:48:42

+0

如果您可以发布processData的代码,可能会有帮助,因为它可能是问题的原因。 – 2010-05-13 03:24:28

回答

0

我的解决方案实际上最终重构了整个事情。我认为这样做效果更好,而不是执行Ajax查询,解析这些结果,更新页面,然后在成功块中执行另一个Ajax查询,最终返回所有需要更新每个请求页面的JSON。所以每个请求都会返回更多的数据,然后将这些数据传递给更新页面的其他函数。这实际上使得事情变得更快,因为请求的数量较少,IE浏览器并没有在所有地方呕吐。

在我的重构过程中,我遇到了一个问题,在更新html之前需要调用$(“#selector”)。empty()。

前:
var my_new_html = ...;
$("#selector").html(my_new_html);

后:
var my_new_html = ...;
$("#selector").empty().html(my_new_html);

清空之前,首先更新造成IE不再回来与停止响应的错误内容。

希望这有助于一些人。

0

我实际上写了一些可能为你处理这个问题的东西,如果你可以分解你的代码。你实际上需要一些东西。首先是jQuery的这个扩展,它创建了工作队列:http://code.ghostdev.com/posts/javascript-threading-revisted-jquery。一旦你已经完成并进行了一些测试,可以进一步扩展以创建AJAX队列:http://code.ghostdev.com/posts/javascript-threading-ajax-queueing

对于我个人的情况,我有一个AJAX请求,它检索到一个相当庞大的JSON块,当它返回时我无法处理它,而没有产生无响应的脚本警告。这可以让函数返回,但会继续按常规的可配置间隔进行处理,直到它在整个块中处理完毕。