2010-02-26 52 views
0

很慢尝试使用YUI的自动完成功能,我们遇到了一个事实,即它是非常慢上IE6含30000项的数据源在尝试键入时(自动填充字段,IE需要几分钟才能响应)。自动完成在YUI在IE6上的大数据集

但是,相同的确切代码在IE8中几乎可以实时运行。

我们做错了什么?我们可以以某种方式优化它吗? IE6 + YUI自动完成不是为这种大型数据集设计的吗?

这里是我们的代码初始化autocompleter:

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> 

searchOnEnter功能是一个标准的“抓按键和执行搜索JS功能,如果键== 13“。

+0

这是很难没有一些探查数据说。尝试使用Dynatrace(它支持IE6,我认为)分析您的应用程序http://ajax.dynatrace.com/pages/与更小的数据子集并查看运行缓慢。 – 2010-02-26 20:59:41

+0

这里的问题在哪里?当然IE6很慢,加上你为什么用这么大的数据集来初始化它? – ChaosPandion 2010-02-27 01:10:32

+0

@Chaos:问题出现在帖子的中间:“我们做错了什么?我们可以通过某种方式进行优化吗?IE6 + YUI自动完成不是为这样的大型数据集设计的吗?” – DVK 2010-02-27 04:37:46

回答

1

显而易见的答案是,IE有一个缓慢的JS引擎,而30000条记录是大量的数据。但是,筛选操作确实包含一个可能成为问题根源的调用。出来试试这个补丁,看看它是否有差别:

http://gist.github.com/316358

+0

@Luke - 我一定会尝试。我可以询问YUI的变化吗?我试图比较YUI本地filterResults的逻辑,这与YUI支持“仅字符串开始”逻辑的例外看起来几乎相同? – DVK 2010-02-27 05:00:16

+0

除了一些微观优化和您记下的内容,删除的关键行是 oParsedResponse = YAHOO.widget.AutoComplete._cloneObject(oParsedResponse); 做了包含所有30000条记录的未过滤响应的深层副本。没有必要,据我所知。 – Luke 2010-02-27 06:00:56

+0

该补丁有所帮助,但最终还不够 - 我们还不得不将分割成26个哈希子列表:( – DVK 2010-03-23 01:29:45