1

循环遍历 csv 文件时有点问题。我也不确定是否有更简单的加载文本文件的方法。我知道 for each 循环是有意义的,但我不确定 csv 文件中的单个项目。我想要整行文本,并将这两段文本分配给选项的值和选择部分。有什么建议可以清理吗?

*更新包含以下建议。没有错误,但我的 CSS 文件未捕获创建的元素,因此格式已关闭,选择框仅显示空白。

<script>
             function processCSV(file,parentNode)
             {
                var frag = document.createDocumentFragment()
                , lines = file.split('\n'), option;                 

                for (var i = 0, len = lines.length; i < len; i++){
                    option = document.createElement("option");
                    option.setAttribute("value", lines[i]);
                    option.innerHTML = lines[i];                        
                    frag.appendChild(option);
                    }
                plant_select.appendChild(frag);
             }

             var plant_select = document.createElement("select");  
             var intial_option = document.createElement("option");
             var datafile = '';
             var xmlhttp = new XMLHttpRequest();

             plant_select.setAttribute("class", "selectbox");   
             plant_select.setAttribute("id", "plant_select");
             intial_option.setAttribute("value","")
             intial_option.setAttribute("disabled","disabled")
             intial_option.setAttribute("selected","selected")
             intial_option.innerHTML = "Please select a Plant";
             plant_select.appendChild(intial_option)

             xmlhttp.open("GET","http://localhost:8080/res/plants.csv",true);
             xmlhttp.send();


             xmlhttp.onreadystatechange = function()
             {
                if(xmlhttp.status==200 && xmlhttp.readyState==4)
                {
                    processCSV(xmlhttp.responseText, plant_select);
                }
             }
        </script>
4

2 回答 2

1

假设显示文本是第一个元素,值是 CSV 中的第二个元素,并且您知道您的 CSV 格式正确。

var dflines = datafile.split("\n");
for (var i=0; i<dflines.length; i++) {
    dflines[i] = dflines[i].split(",");
    plant_select.options[plant_select.options.length+1] = new Option(dflines[i][0],dflines[i][1],false,false);
}

将为您当前的选择添加新的选择选项。

于 2013-10-04T19:07:10.360 回答
1

您需要在这里做很多事情:

  • 您需要正确处理您的文本。不要for...in在字符串或数组上使用。它没有做你想让它做的事情。而是将文件拆分为行数组并处理这些行。
  • 在您的处理循环中,您在每次运行时都在修改 DOM。这会导致不必要的回流和重绘。相反,使用文档片段
  • 您需要在回调中使用处理代码,或者最好在回调中调用的函数中使用。

所以你的处理功能:

    function processCSV(file,parentNode){
      var frag = document.createDocumentFragment()
        , lines = file.split('\n')
        , option
        ;
      for (var i = 0, len = lines.length; i < len; i++){
        option = document.createElement("option");
        option.setAttribute("value", "Choice"); 
        frag.appendChild(option);
      }
      parentNode.appendChild(frag);
    }

然后你的 XHR 回调:

xmlhttp.onreadystatechange = function(){
  if(xmlhttp.status==200 && xmlhttp.readyState==4){
    processCSV(xmlhttp.responseText, plant_select);
  }
}

这不会进行任何每行处理,但我需要您提供更多信息才能在那里提供任何帮助。您可能希望用逗号分隔并查看单个数据项,这可以通过processCSV函数中的嵌套循环来完成。

于 2013-10-04T19:19:38.843 回答