“停止运行此脚本” – IE用于大型AJAX请求

我正在使用jQuery.getJSON(…)为稍大的数据集进行调用/进程响应。 预计响应时间为几秒钟(有一个动画加载图形来安抚用户)。

总而言之,加载图形,响应,进程等在所有浏览器中都能正常工作。 但是,在Internet Explorer(6/7/8)中,出现“停止运行此脚本”错误。 如果允许继续,则脚本完成且没有问题。

$(document).ready(function() { $("#tree").treeview({ collapsed: true, animated: "slow" }); $("#tree").hide(); $("#loadingGraphic").fadeIn("slow"); $.getJSON("mygenerichandler.ashx", function(data) { //manipulate data and add to treeview $("#loadingGraphic").fadeOut("slow", function() { $("#tree").slideDown("slow"); }); }); }); 

我意识到这个Internet Explorer有一个可以通过Windows注册表设置的首选项,但是,我很好奇其他开发人员如何在AJAX请求中处理预期的大或慢响应。

慢速脚本通知很可能不是针对实际请求,而是针对您运行的脚本来处理请求接收的数据。 这也可以是解析JSON的jQuery代码。

如果您发布的脚本是“操纵数据”(即代码段中的注释部分),我们可能会帮助您优化它。

[编辑]你说得对。 你应该考虑延迟加载树。 你通常有多少根节点? 你可能有一些运气将appendTo()出循环。 要么一次构建整个HTML并执行大量的appendTo()要么使用未附加到DOM的中间div来累积节点,然后附加到主#tree元素。

 var tempDiv = $('
'); for (var i in data) { tempDiv.append($(buildHierarchy(data[i])); } $("#tree").append(tempDiv); $("#tree").treeview({ add: tempDiv }); //don't know if this works? Maybe tempDiv.children() ?

我的猜测是,这不是数据的加载,也不是您在代码中处理的数据。 我认为这是通过HTTP接收的JSON数据到Javascript对象的转换。

IE基本上做了一个eval()来从字符串数据构建一个哈希。 对于长字符串,这是非常非常非常低效的。 我怀疑它背后是施莱米尔的Painter算法。 我在一两年前完成了同样的事情,并通过从JSON字符串中删除未使用或冗余的数据来解决它。

如果你不能通过删除元素来缩短字符串,你可以尝试将服务器上的字符串分解成组件对象(如果你愿意话, “页面” ),并逐个获取它们。 这样,您就不必为长字符串支付低效的处理税,而是处理多个短字符串。

请问时间不是问题所在。 请求是异步的,因此在等待响应时没有运行脚本。

这是处理结果花费太长时间的脚本。 将其发送到处理部分数据的函数,并使用计时器调用自身以将控件返回给浏览器一会儿:

 function handleData(data, offset) { // pick the next 1000 items or so: var size = Math.min(1000, data.length - offset); // process [offset .. offset+size-1] of the data // ... offset += size; if (offset < data.length) { window.setTimeout(function() { handleData(data, offset); }, 1); } else { $("#loadingGraphic").fadeOut("slow", function() { $("#tree").slideDown("slow"); }); } } 

称之为:

 $.getJSON("mygenerichandler.ashx", function(data) { handleData(data, 0); }); 

您可以重构代码,以便在每次递归调用之前调用setTimeout(0),以便UI线程获得控制权并且可以响应。 谷歌的’setTimeout线程’获取更多信息。

您还可以将大型数据集拆分为由连续请求处理的块。 在IE8中,您可能需要仔细检查是否正在使用本机JSON.parse()方法,因为它比JS实现更快。