Javascript 在大型数据集上,YUI中的自动完成在IE6中非常慢

Javascript 在大型数据集上,YUI中的自动完成在IE6中非常慢,javascript,autocomplete,yui,Javascript,Autocomplete,Yui,尝试使用YUI的自动完成功能时,我们遇到了这样一个事实:对于包含30000项的数据源,IE6的速度非常慢(当尝试键入自动完成字段时,IE需要几分钟才能响应) 然而,同样的代码在IE8中几乎可以实时工作 我们做错什么了吗?我们能以某种方式优化它吗?IE6+YUI autocomplete不是为如此大的数据集设计的吗 下面是初始化自动完成程序的代码: Y.namespace( 'YAHOO.program' ); Y.program.AllTreeItemsArr = new Array(); //

尝试使用YUI的自动完成功能时,我们遇到了这样一个事实:对于包含30000项的数据源,IE6的速度非常慢(当尝试键入自动完成字段时,IE需要几分钟才能响应)

然而,同样的代码在IE8中几乎可以实时工作

我们做错什么了吗?我们能以某种方式优化它吗?IE6+YUI autocomplete不是为如此大的数据集设计的吗

下面是初始化自动完成程序的代码:

Y.namespace( 'YAHOO.program' );
Y.program.AllTreeItemsArr = new Array();
// Populate the array with 30000 elements
Y.program.BasicLocal = function() {
        var oDS = new YU.LocalDataSource(Y.program.AllTreeItemsArr);
        oDS.responseSchema = {fields : ["portfolio"]};
        var oAC = new Y.widget.AutoComplete("selected"
                                          , "autocomplete_container", oDS);
        oAC.prehighlightClassName = "yui-ac-prehighlight";
        oAC.useShadow = true;
        oAC.typeAhead = true;
        oAC.queryDelay = .05;
        oAC.typeAheadDelay = .5;

        return {
            oDS: oDS,
            oAC: oAC
        };
     }();
下面是使用它的HTML:

    <span id="port_autocomplete" class="yui-skin-sam" style='position: relative;'>
         <input type='text' id='selected' maxlength=10 name='selected'
                value='' isSelected=1 onkeyup="searchOnEnter();">
         <div id="autocomplete_container" style="position: absolute"></div>
    </span>


searcheonenter
函数是一个标准的“如果key==13,则捕获一个按键并执行一个搜索JS函数”。

显而易见的答案是IE的JS引擎很慢,30000条记录是大量数据。但是,过滤操作确实包括一个可能是您问题根源的调用。尝试此修补程序,看看它是否有所不同:


如果没有一些探查器数据,很难说。尝试使用Dynatrace(我认为它支持IE6)和较小的数据子集来分析你的应用程序,看看什么运行缓慢。这里的问题在哪里?当然IE6很慢,而且你为什么要用这么大的数据集初始化它?@Chaos:问题就在帖子的中间:“我们做错了什么吗?我们能以某种方式优化它吗?IE6+YUI autocomplete不是为这么大的数据集设计的吗?”@Chaos:我知道IR6很慢。但我很难相信它会慢几个数量级(几分钟与亚秒响应差)@Chaos:因为我们需要在数据集上搜索字段(该数据集已经存在于页面中)。@Luke-我一定会尝试的。我可以问一下YUI发生了什么变化吗?我试着比较一下YUI的原生filterResults的逻辑,除了YUI中支持“仅字符串开头”的逻辑外,它似乎几乎完全相同?除了一些微优化和您注意到的内容之外,删除的关键行是oParsedResponse=YAHOO.widget.AutoComplete.\u cloneObject(oParsedResponse);这是一个包含所有30000条记录的未过滤响应的深度副本。据我所知,这不是必需的。补丁有一定的帮助,但最终还不够——我们还不得不将列表分成26个哈希子列表:(