这里是一个解决方案:
function appendToSelect() {
$("#mySelect").children().remove();
$("#mySelect").html(
'<option selected value="'+obj.data[0].value+'">'
+ obj.data[0].name
+ '</option>'
);
obj.data.splice(0, 1); // we only want remaining data
var appendOptions = function() {
var dataChunk = obj.data.splice(0, 10); // configure this last number (the size of the 'chunk') to suit your needs
for(var i = 0; i < dataChunk.length; i++) {
$("#mySelect").append(
'<option value="' + dataChunk[i].value + '">'
+ dataChunk[i].name
+ '</option>'
);
}
if(obj.data.length > 0) {
setTimeout(appendOptions, 100); // change time to suit needs
}
};
appendOptions(); // kicks it off
}
不一样优雅的@Borgar's解决方案,但你的想法。基本上,我正在做同样的事情,但都是在你的一个功能上,而不是像他那样把它分解成一个更高级的功能。我喜欢他的解决方案,但如果你不这样做,也许这会对你有用。
编辑:对于那些不立即看到它,这个解决方案和@Borgar's之间的主要区别之一是,该解决方案允许您设置之间处理数据的“块”的大小每个超时。 @Borgar's超时后处理数组中的每个单个成员。如果我有时间,我会尝试创建一个更高级的函数来处理这个问题,使它更优雅。没有承诺,但! ;)
编辑:所以,这里是我的@Borgar's解决方案,它允许设置一个“块”的尺寸和更容易配置的超时值调整:
function incrementallyProcess(workerCallback, data, chunkSize, timeout, completionCallback) {
var itemIndex = 0;
(function() {
var remainingDataLength = (data.length - itemIndex);
var currentChunkSize = (remainingDataLength >= chunkSize) ? chunkSize : remainingDataLength;
if(itemIndex < data.length) {
while(currentChunkSize--) {
workerCallback(data[itemIndex++]);
}
setTimeout(arguments.callee, timeout);
} else if(completionCallback) {
completionCallback();
}
})();
}
function appendToSelect() {
$("#mySelect").children().remove();
$("#mySelect").html(
'<option selected value="' + obj.data[0].value + '">'
+ obj.data[0].name
+ '</option>'
);
obj.data.splice(0,1); // we only want remaining data
incrementallyProcess(function(data) {
$("#mySelect").append(
'<option value="' + data.value + '">'
+ data.name
+ '</option>'
);
}, obj.data, 10, 100, removeAnimatedGifFunction); // last function not required...
}
希望帮助 - 我认为这结合了两种解决方案中最好的。 注意,第二个匿名函数不再使用索引值,而只是传入整个对象(使用值和名称属性);这使得它更清洁一些,因为当前对象的索引实际上不是,通常在遍历事物IMO时非常有用。
我相信还有些事情可以做得更好,但这只是对读者的一个练习。 ;)
告诉他们使用Chrome浏览器,他们将有JITted JavaScript :) – 2009-02-03 02:04:55