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

如何为<select><option>赋值以显示对应命名图片及处理下拉选项

配置器序列号生成与<option>赋值问题

我正在开发一个配置器,需要基于选项值生成序列号来显示指定图片。此前在根据标签值/图片名称隐藏部分<select>选项时遇到困难,目前已实现选项的显示与隐藏,但不清楚如何为<option>赋值。其中尺寸值可直接使用,而类型(如Stahl、Poly等)需转换为对应的字母(如F、B、A等)。


现有代码

HTML 代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<div class="buttonrow">
  <div class="Gewinde">
    <h4> Fußteller Art: </h4>
    <select name="teller2" id="teller2" onchange="dropdownTeller2(this)">
      <option value="0"></option>
    </select>
  </div>
</div>
<div class="buttonrow" id="durchmesser">
  <div class="Gewinde">
    <h4> Fußteller Größe: </h4>
    <select name="teller" id="teller" onchange="dropdownTeller(this)">
      <option value="0">Durchmesser (mm)</option>
    </select>
  </div>
</div>

CSS 代码

.buttonrow {
  display: flex;
  margin-bottom: 40px;
  margin-left: 100px;
}

.rightoption {
  margin-left: 100px;
}

.buttons {
  margin-top: 50px;
}

#test {
  width: 200px;
  height: 30px;
}

JavaScript 代码

let Laenge = 0;
let Teller = 0;
let KappeFarbe = 1;
let Teller2 = 0;
let GA = 0;
let GD = 0;
let VO = 0;
let VU = 0;

function dropdownTeller(element) {
  Teller = element.value;
  if (GA != 0 && GD != 0) {
    if (KappeFarbe = 1) {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + GA + GD + VO + VU + ".png)";
    } else {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + KappeFarbe + GA + GD + VO + VU + ".png)";
    }
  } else {
    if (KappeFarbe = 1) {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + ".png)";
    } else {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + KappeFarbe + ".png)";
    }
  }
}

function dropdownTeller2(element) {
  Teller2 = element.value;
  document.getElementById("durchmesser").style.visibility = "visible"
  if (GA != 0 && GD != 0) {
    if (KappeFarbe = 1) {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + GA + GD + VO + VU + ".png)";
    } else {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + KappeFarbe + GA + GD + VO + VU + ".png)";
    }
  } else {
    if (KappeFarbe = 1) {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + ".png)";
    } else {
      document.getElementById("image").style.backgroundImage = "url(konfig/" + Teller2 + Teller + KappeFarbe + ".png)";
    }
    const FVal = new Array("19", "20", "30");
  }
}

/* jQuery TEST */
var subjectObject = {
  "Stahlteller": [
    "19",
    "20",
    "30",
    "33",
    "35",
    "40",
    "45",
    "50",
    "60"
  ],
  "Stahlteller abgeschnitten": [
    "40/35",
    "40/30"
  ],
  "Stahlteller abgeschnitten mit 2 Anschraublöchern": [
    "40/35",
    "40/30"
  ],
  "Stahlteller mit 2 Anschraublöchern": [
    "30",
    "40",
    "45",
    "50",
    "60"
  ],
  "Stahlteller mit 3 Anschraublöchern": [
    "45"
  ],
  "Stahlteller mit 4 Anschraublöchern": [
    "80"
  ],
  "Stahlteller gewölbt": [
    "40"
  ],
  "Edelstahlteller": [
    "25",
    "30",
    "36",
    "40",
    "50",
    "60",
    "70",
    "75"
  ],
  "Edelstahlgelenkteller": [
    "60",
    "70"
  ],
  "Edelstahlteller STABIL": [
    "50"
  ],
  "Polyamidteller": [
    "20",
    "30",
    "36",
    "48",
    "50"
  ]
}

window.onload = function() {
  var subjectSel = document.getElementById("teller2");
  var topicSel = document.getElementById("teller");

  for (var x in subjectObject) {
    subjectSel.appendChild(new Option(x, x));
  }
  subjectSel.onchange = function() { //empty Chapters- and Topics- dropdowns

    //subjectSel.length = 1;   
    topicSel.length = 1;
    //display correct values
    for (var y in subjectObject[this.value]) {
      topicSel.appendChild(new Option(subjectObject[this.value][y], y));
    }
  }

}

解决方案

1. 创建类型到字母的映射表

定义一个映射对象,将类型名称转换为对应的序列号字母:

const typeMapping = {
  "Stahlteller": "F",
  "Stahlteller abgeschnitten": "F",
  "Stahlteller abgeschnitten mit 2 Anschraublöchern": "F",
  "Stahlteller mit 2 Anschraublöchern": "F",
  "Stahlteller mit 3 Anschraublöchern": "F",
  "Stahlteller mit 4 Anschraublöchern": "F",
  "Stahlteller gewölbt": "F",
  "Edelstahlteller": "B",
  "Edelstahlgelenkteller": "B",
  "Edelstahlteller STABIL": "B",
  "Polyamidteller": "A"
};

可根据实际需求调整字母对应关系。

2. 修正<option>赋值逻辑

  • 为#teller2的选项设置映射后的字母作为value
  • 为#teller的选项设置实际尺寸值作为value(原代码错误使用了数组索引)

修改window.onload中的代码:

window.onload = function() {
  var subjectSel = document.getElementById("teller2");
  var topicSel = document.getElementById("teller");

  for (var x in subjectObject) {
    // 使用映射后的字母作为选项value
    subjectSel.appendChild(new Option(x, typeMapping[x] || x));
  }
  subjectSel.onchange = function() {
    topicSel.length = 1;
    // 遍历尺寸列表,将尺寸值设为选项value
    subjectObject[this.value].forEach(size => {
      topicSel.appendChild(new Option(size, size));
    });
  }
}

3. 修复逻辑错误

原代码中存在**用赋值运算符=代替比较运算符===**的错误,会导致KappeFarbe被意外修改,需全部替换为严格相等判断:

// 错误写法
if (KappeFarbe = 1) 

// 正确写法
if (KappeFarbe === 1)

4. 优化序列号拼接逻辑

封装函数生成图片路径,避免重复代码:

function generateImagePath() {
  let parts = [Teller2, Teller];
  if (KappeFarbe !== 1) {
    parts.push(KappeFarbe);
  }
  if (GA !== 0 && GD !== 0) {
    parts.push(GA, GD, VO, VU);
  }
  return `url(konfig/${parts.join('')}.png)`;
}

// 在dropdownTeller和dropdownTeller2中调用
document.getElementById("image").style.backgroundImage = generateImagePath();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:17:31