2016-07-08 75 views
0

我有一个代码在javascipt填充下拉选项列表。 该列表包含超过10,000个数据。 我调查了这个问题,发现原因是大量的数据。如何防止无响应的脚本?

这里是代码:

$("select#mdl-criteria-category").change(insertCriteriaOptions); 
$("select#mdl-criteria-level").change(insertCriteriaOptions); 
$("select#mdl-criteria").change(checkIfCriteriaExists); 


function insertCriteriaOptions() { 
    var skillId = $("select#mdl-criteria-category").val(); 
    var level = $("select#mdl-criteria-level").val(); 

    if (skillId != '-' && level != '-') { 
     removeAllOptions("#mdl-criteria"); 
     addDefaultOption(); 
     filterCriteriaOptions(skillId, level); 
    } 
} 

function filterCriteriaOptions(skillId, level) { 
    var optionId = skillId + "-" + level; 

    for (var key in criteriaOptionList) { 
     var id = key.split("-"); 
     if (id[0] == skillId && id[1] == level) { 
      var option = document.createElement("option"); 

      option.text = criteriaOptionList[key]; 
      option.value = id[2]; 
      document.getElementById("mdl-criteria").add(option); 
     } 
    } 
} 

function populateCriteriaOptionList() { 
    $("#mdl-criteria option").each(function() { 
     if (this.id != '-') { 
      var id = this.id + '-' + this.value; 
      criteriaOptionList[id] = this.text;   
     } 
    }); 
} 

我调查的结果表明,这是因为populateCriteriaOptionList()函数,因为这种方法需要得到10,000个数据是criteriaOptionList阵列英寸 任何人都知道在这种情况下如何解决任何问题? 也许有人在那里可以帮助我解决我的问题。先谢谢了。

+0

问题是? –

+0

你在jQuery Load上调用populateCriteriaOptionList函数吗? –

+0

嗯,我希望选项元素的id不是“ - ”,如代码所示,id应该是唯一的。此外,我认为你知道问题是什么,太多的项目,迭代10,000个项目需要时间... – Esko

回答

0

所以,你有你需要处理非常大的数组,但它是如此之大,它会阻止执行线程,使页面看起来反应迟钝。

这就是我们设计的WebWorkers。有一些限制,例如他们无法操作DOM,但这对您而言可能不是问题。可能看看Polymer的iron-list。它是用于显示极大数量数据的组件。再次,这取决于你的特定用例。

另一种方式可能是将数组拆分为更小的块(例如,每个100个项目),然后稍后处理它们。

+0

谢谢@Martin,会检查这个链接。 –