在 javascript 中创建第二个 html 元素会删除第一个

Creating 2nd html element in javascript deletes the first

本文关键字:元素 删除 第一个 html 第二个 javascript 创建      更新时间:2023-09-26

我有一个javascript代码,可以动态创建一个包含文件数据的选择框。它们有点大,一旦一切正常,我将尝试移动到外部 js 而不是在 HTML 中。我的问题是,当我尝试在不同的文件上运行相同的脚本时,它似乎会清除第一个脚本中的信息。所以我最终填充了一个选择元素和一个空白。最后一个脚本是唯一成立的脚本,这就是为什么我认为它以某种方式清除了第一个脚本。任何建议。我正在构建一个菜单,所以我需要这段代码是模块化的。提前谢谢。

*更新*我已经拆分了 processcsv 文件,但我仍然得到相同的结果。在函数的每个秋天,我都会传递一个不同的选择元素。在网页上,我只会看到最后一个执行,选择的已处理的 earliar 显示为空白。我认为问题是我的第一个 xmlrequest 永远不会达到 readystate == 4,但最后一个可以。我不确定我能做些什么来控制它,为什么除了最后一个失败之外,它都是失败的。

我的网页

<div class="menu_container">
    <div class="menu_element" id="plant_div">
        <select  class="Menu" id="plant_select">
        <script>     
             <!--var plant_select = document.createElement("select");  -->
             var datafile = '';
             var xmlhttp = new XMLHttpRequest();
             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,"select plant");
                }
             }
        </script>
        </select>
    </div>
    <div class="menu_element" id="plantType_div">
        <select  class="Menu" id="plantType_select">
        <script>
             <!--var plant_select = document.createElement("select");  -->
             var datafile = '';
             var xmlhttp = new XMLHttpRequest();
             xmlhttp.open("GET","http://localhost:8080/res/planttypes.csv",true);
             xmlhttp.send();
             xmlhttp.onreadystatechange = function()
             {
                if(xmlhttp.status==200 && xmlhttp.readyState==4)
                {
                    processCSV(xmlhttp.responseText, plantType_select,"select PLant Type);
                }
             }
        </script>
        </select>
    </div>
</div>

一个单独的 js 文件,其中包含

function processCSV(file,parentNode,defaultmessage)
             {
                var frag = document.createDocumentFragment()
                , lines = file.split(''n'), option;                 
                var intial_option = document.createElement("option");
                intial_option.setAttribute("value","");
                intial_option.setAttribute("disabled","disabled");
                intial_option.setAttribute("selected","selected");
                intial_option.innerHTML = defaultmessage;
                frag.appendChild(intial_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);
                    }
                parentNode.appendChild(frag);
             }

具有相同名称的第二个函数将覆盖第一个函数。

在不同的.js文件中使用两种同名的方法

使用唯一的函数名称,或者只是将函数移出并调用两次。

function processCSV(file,parentNode) {...}
processCSV('/my/file/path', myParentNode);

您永远不会选择要向其添加项的元素。每次调用时,将document.getElementById(idOfParentNode)传递给processCSV。也不需要在 select 标记中内联调用。

(也就是说,plant_select 和 plantType_select 当前未定义为所示代码中的任何内容)

而且,因为你正在执行我们在全局范围内可以看到的所有javascript,所以这些变量都附加到window上。这意味着您正在通过重新初始化 XMLHTTP 对象来踩踏它。考虑将更多内容封装到单个脚本块中分解更好的函数中。