JS select option 元素的大批量添加

最近项目须要这么一个很蛋疼的需求。

我都想知道、干吗要添加这么数据到select里面去呢、疯了吗(测试数据1W多条)?

结果是老总说必须加、功能没实现是咱们的问题、他们用不用得了、是他们的问题。

需求是这样的:json

用户选择完毕还能够删除所选的选项:浏览器



一两百条、添加那是毛毛雨、分分钟搞定啊!

可是数据多了的时候就老火了、浏览器直接假死、白屏、下面是最初的添加方法:

页面按钮:app

  
  
           
  
  
  1. <select name="sm_careReceivers" id="sm_careReceivers" 
  2. multiple="multiple" size="8"  
  3. style="width: 355px; color: #006CAD;"> 
  4. </select> 
  5. <button type="button" onclick="returnSelectCustomerInfo();">肯定</button> 

JS方法:ide

  
  
           
  
  
  1. var obj = $("#sm_careReceivers"); 
  2. var count = $("#sm_careReceivers option").length; 
  3. for(var o in json){  
  4.     listText = json[o].name; 
  5.     listValue = json[o].phone; 
  6.     listTypeValue = json[o].cusid;  
  7.     listTypeText = json[o].text;    
  8.     flag = true;       
  9.     //判断是否已存在                
  10.     for ( var i = 0; i < count; i++) { 
  11.         if (obj.get(0).options[i].value == listText + "/" 
  12.                 + listValue + "/" + listTypeValue) { 
  13.             flag = false
  14.             break
  15.         }   
  16.     } 
  17.     //给控件赋值 
  18.     if (flag) { 
  19.         if (listText == "") {    
  20.             obj.append("<option value='" + "佚名" + "/" 
  21.                     + listValue + "/" + listTypeValue + "'>" 
  22.                     + "佚名" + "/" + listValue + "/" + listTypeText 
  23.                     + "</option>"); 
  24.         } else { 
  25.             obj.append("<option value='" + listText + "/" 
  26.                     + listValue + "/" + listTypeValue + "'>" 
  27.                     + listText + "/" + listValue + "/" + listTypeText 
  28.                     + "</option>");   
  29.         } 
  30.     } 

如下是几种优化方案:

    第一种:

    采用字符拼接方式、先把全部的option所有组装成字符串、而后在渲染页面:测试

  
  
           
  
  
  1. var obj = $("#sm_careReceivers"); 
  2. var count = $("#sm_careReceivers option").length; 
  3. var sHtmlTest = ""
  4. for(var o in json){  
  5.     listText = json[o].name; 
  6.     listValue = json[o].phone; 
  7.     listTypeValue = json[o].cusid;  
  8.     listTypeText = json[o].text;    
  9.     flag = true;       
  10.     //判断是否已存在                
  11.     for ( var i = 0; i < count; i++) { 
  12.         if (obj.get(0).options[i].value == listText + "/" 
  13.                 + listValue + "/" + listTypeValue) { 
  14.             flag = false
  15.             break
  16.         }   
  17.     } 
  18.     //给控件赋值 
  19.     if (flag) { 
  20.         if (listText == "") {    
  21.             sHtmlTest+="<option value='" + "佚名" + "/" 
  22.                     + listValue + "/" + listTypeValue + "'>" 
  23.                     + "佚名" + "/" + listValue + "/" + listTypeText 
  24.                     + "</option>"
  25.         } else { 
  26.             sHtmlTest+="<option value='" + listText + "/" 
  27.                     + listValue + "/" + listTypeValue + "'>" 
  28.                     + listText + "/" + listValue + "/" + listTypeText 
  29.                     + "</option>";   
  30.         } 
  31.     } 
  32. obj.append(sHtmlTest);  

第二种:

             采用文档碎片(该方法不支持火狐——主要是innerText属性)优化

  
  
           
  
  
  1. var obj = $("#sm_careReceivers"); 
  2. var count = $("#sm_careReceivers option").length; 
  3. var warp = document.createDocumentFragment(); 
  4. for(var o in json){  
  5.     listText = json[o].name; 
  6.     listValue = json[o].phone; 
  7.     listTypeValue = json[o].cusid;  
  8.     listTypeText = json[o].text;    
  9.     flag = true;       
  10.     //判断是否已存在                
  11.     for ( var i = 0; i < count; i++) { 
  12.         if (obj.get(0).options[i].value == listText + "/" 
  13.                 + listValue + "/" + listTypeValue) { 
  14.             flag = false
  15.             break
  16.         }   
  17.     } 
  18.     //给控件赋值 
  19.     if (flag) { 
  20.         var objOption = document.createElement("OPTION"); 
  21.         objOption.value = listText + "/" + listValue + "/" + listTypeValue; 
  22.         objOption.innerText = listText + "/" + listValue + "/" + listTypeText; 
  23.         warp.appendChild(objOption); 
  24.     } 
  25. obj.append(warp); 

第三种:

              该方案结合第二个方案、使用setTimeout用setTimeout,每50个,就setTimeout一下、让出cpu渲染浏览器、防止页面假死:spa

  
  
           
  
  
  1. var obj = $("#sm_careReceivers"); 
  2. var count = $("#sm_careReceivers option").length; 
  3. var warp = document.createDocumentFragment(); 
  4. var number = 0; 
  5. for(var o in json){  
  6.     number++; 
  7.     listText = json[o].name; 
  8.     listValue = json[o].phone; 
  9.     listTypeValue = json[o].cusid;  
  10.     listTypeText = json[o].text;    
  11.     flag = true;       
  12.     //判断是否已存在                
  13.     for ( var i = 0; i < count; i++) { 
  14.         if (obj.get(0).options[i].value == listText + "/" 
  15.                 + listValue + "/" + listTypeValue) { 
  16.             flag = false
  17.             break
  18.         }   
  19.     } 
  20.     //给控件赋值 
  21.     if (flag) { 
  22.         var objOption = document.createElement("OPTION"); 
  23.         objOption.value = listText + "/" + listValue + "/" + listTypeValue; 
  24.         objOption.innerText = listText + "/" + listValue + "/" + listTypeText; 
  25.         warp.appendChild(objOption); 
  26.         if(number==50||o==(json.length-1)){ 
  27.             number = 0 ; 
  28.             fooAddNewSelectTest(obj,warp);  
  29.             warp = document.createDocumentFragment();    
  30.         } 
  31.     } 
  32. obj.append(warp);  

这样事后、内容到是加载进去了、可是去选择删除的时候、一样蛋疼......

o(︶︿︶)o 唉!

不知不觉、又要下班了、回家ing。xml

相关文章
相关标签/搜索