You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态创建下拉框值不更新及页面resize时重复渲染问题

解决动态创建下拉框的两个问题:选中值不更新、重复渲染

问题1:选中值始终显示为2023

原因

  1. 重复创建下拉框后,DOM中存在多个id="mySelect_tract"的元素,document.getElementById仅返回第一个匹配元素,你绑定的onchange事件只作用于最初创建的下拉框,操作后续生成的新下拉框时,打印的还是旧下拉框的默认值(2023)。
  2. 事件绑定时机错误:仅在$(document).ready中绑定一次事件,后续重新创建的下拉框未绑定事件逻辑。

解决方案

将事件绑定逻辑移到下拉框创建过程中,确保每个新生成的下拉框都能正确绑定事件,同时结合问题2的重复创建规避逻辑,彻底解决问题:

// 在addElement_Tract函数中创建select后直接绑定事件
selectList_tract.onchange = function() {
    const dropdown_val_tract = this.value; // 用this指代当前触发事件的select,避免重复查询DOM
    console.log("dropdown_val_tract is", dropdown_val_tract);
};

问题2:调整网页尺寸时重复渲染下拉框

原因

你应该是在窗口resize事件中调用了addElement_Tract(),但未判断目标元素是否已存在,导致每次窗口尺寸变化都会创建新的下拉框和容器。

解决方案

在addElement_Tract函数开头添加元素存在性检查,仅当容器不存在时才创建元素:

function addElement_Tract() {
    // 检查侧边栏容器是否已存在,存在则直接返回
    if (document.getElementById('sidebar_tract')) {
        return;
    }
    // ... 原有创建元素的代码 ...
}

如果resize事件中确实需要调用该函数,添加检查后就不会重复创建;若无需更新下拉框内容,也可直接移除resize事件中的addElement_Tract()调用。

完整修改后的代码示例

初始化代码

$(document).ready(function() {
    addElement_Tract();
});

动态创建下拉框的代码

function insertAfter_Tract(newNode, existingNode) {
    existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);
}

function addElement_Tract() {
    // 避免重复创建元素
    if (document.getElementById('sidebar_tract')) {
        return;
    }

    // 创建侧边栏容器
    const sidebar_tract = document.createElement("div");
    sidebar_tract.className = "sidebar_tract";
    sidebar_tract.id = "sidebar_tract";
    
    // 选项数据
    const display_array_tract = ["2023", "2022","2021","2020","2019", "2018"];
    const val_array_tract = [2023, 2022, 2021, 2020, 2019, 2018];
  
    // 创建下拉框
    const selectList_tract = document.createElement("select");
    selectList_tract.id = "mySelect_tract";
    selectList_tract.className = "mySelect_tract";
  
    // 添加选项
    for (let i = 0; i < display_array_tract.length; i++) {
        const option_tract = document.createElement("option");
        option_tract.value = Number(val_array_tract[i]);
        option_tract.text = display_array_tract[i];
        selectList_tract.appendChild(option_tract);
    }

    // 绑定选中事件
    selectList_tract.onchange = function() {
        const dropdown_val_tract = this.value;
        console.log("dropdown_val_tract is", dropdown_val_tract);
    };
  
    // 插入到DOM中
    const parentDiv_tract = document.getElementById("map_choropleth_state_tract").parentNode;
    const mapDiv_tract = document.getElementById("map_choropleth_state_tract");

    insertAfter_Tract(sidebar_tract, mapDiv_tract);
    sidebar_tract.appendChild(selectList_tract);
}

内容的提问来源于stack exchange,提问作者DiamondJoe12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:56