【问题标题】:Select list does not change selected item DHTML选择列表不会更改所选项目 DHTML
【发布时间】:2017-10-10 18:46:06
【问题描述】:

我开始开发网站(从 0 开始学习)。当然,我为我的健康无知(和我的英语水平)道歉。 我有 3 个按降序排列的选择:第一个包含从数据库加载的选项列表(目前,我只从 HTML 加载)。根据选择的选项,第二个选择将加载其选项,依此类推,直到第三个选择。问题本身已解决,但是当您要选择已在第二次选择中加载的选项时,请不要“单击”它们。只允许您选择第一个选项。在这里我留下代码,看看是否有人能找到任何可能的解决方案(还有很多错误^^)。

var carsAndModels = {};
carsAndModels['Volvo'] = ['V70', 'XC60']; 
carsAndModels['Volkswagen'] = ['Golf', 'Polo']; 
carsAndModels['BMW'] = ['M6', 'X5'];
    
var speedsAndModels = {};
speedsAndModels['V70'] = ['150km/h', '180km/h']; 
speedsAndModels['XC60'] = ['160km/h', '190km/h'];
speedsAndModels['Golf'] = ['170km/h', '190km/h']; 
speedsAndModels['Polo'] = ['180km/h', '200km/h'];
speedsAndModels['M6'] = ['190km/h', '2000km/h']; 
speedsAndModels['X5'] = ['200km/h', '210km/h'];
    
function ChangeCarList() {
  var carList = document.getElementById('car');
  var modelList = document.getElementById('carmodel');
  var speedList = document.getElementById('speed');
  var selCar = carList.options[carList.selectedIndex].value;
  while (modelList.options.length) {
    modelList.remove(0);
    speedList.remove(0);
  }
  var cars = carsAndModels[selCar];
  if (cars) {
    for (i = 0; i < cars.length; i++) {
      var car = new Option(cars[i], i+1);
      modelList.options.add(car);
    }
  }
  ChangeModelList();
}
function ChangeModelList() {
  var modelListM = document.getElementById('carmodel');
  var speedListM = document.getElementById('speed');
  var indMod = modelListM.selectedIndex;
  var selMod = modelListM.options[indMod].text;
  while (speedListM.options.length) {
    speedListM.remove(0);
  }
  var speeds = speedsAndModels[selMod];
  if (speeds) {
    for (i = 0; i < speeds.length; i++) {
      var speed = new Option(speeds[i], i+1);
      speedListM.options.add(speed);
    }
  }
}
<div class="">
  <div class="">
	  <span>Select the brand</span><hr>
		<select id="car" onchange="ChangeCarList()">
		  <option value="">-- Select --</option> 
			<option value="Volvo">Volvo</option> 
			<option value="Volkswagen">Volkswagen</option> 
			<option value="BMW">BMW</option> 
		</select>
	</div>
	<div class="">
		<span>Select the model</span><hr>
		<select id="carmodel" onchange="ChangeCarList()"></select>
	</div>
	<div class="">
		<span>Select the speed control</span><hr>
		<select id="speed"></select>
	</div>
</div>

问题:如何通过外部文件中的标准W3Schools调用函数(“ChangeCarList”和“ChangeModelList”)? 非常感谢:)。

【问题讨论】:

  • 仅供参考,不要将 W3Schools 用作初学者的学习工具。它更像是信息百科全书,而不是顺序教程。他们解释了每一点语法,但没有告诉你什么是你想要完成的特定事情的最佳实践。那里有更好的资源,例如 StackOverflow 上的文档选项卡
  • 你不想从第二个选择的 onchange 事件中调用 ChangeModelList 而不是 ChangeCarList 吗?

标签: javascript html select options dhtml


【解决方案1】:

它不起作用的原因是因为您正在删除选择其他选项的选项。您需要记住索引中的选定选项,如下所示。您可能需要进一步整理您的解决方案,但此解决方案将允许选择其他选项。 请注意我建议的解决方案中的这个添加部分。

var index;
  if (value) {
    index = modelList.selectedIndex;
  }

这里正在记住旧索引。完成添加选项后,此处将根据记住的索引选择选项。

modelList.selectedIndex = index;//<----This also is required

var carsAndModels = {};
carsAndModels['Volvo'] = ['V70', 'XC60'];
carsAndModels['Volkswagen'] = ['Golf', 'Polo'];
carsAndModels['BMW'] = ['M6', 'X5'];

var speedsAndModels = {};
speedsAndModels['V70'] = ['150km/h', '180km/h'];
speedsAndModels['XC60'] = ['160km/h', '190km/h'];
speedsAndModels['Golf'] = ['170km/h', '190km/h'];
speedsAndModels['Polo'] = ['180km/h', '200km/h'];
speedsAndModels['M6'] = ['190km/h', '2000km/h'];
speedsAndModels['X5'] = ['200km/h', '210km/h'];

function ChangeCarList(value) {
  var carList = document.getElementById('car');
  var modelList = document.getElementById('carmodel');
  var speedList = document.getElementById('speed');
  var selCar = carList.options[carList.selectedIndex].value;
  var index;
  if (value) {
    index = modelList.selectedIndex;
  }
  while (modelList.options.length) {
    modelList.remove(0);
    speedList.remove(0);
  }
  var cars = carsAndModels[selCar];
  if (cars) {
    for (i = 0; i < cars.length; i++) {
      var car = new Option(cars[i], i + 1);
      modelList.options.add(car);
    }
  }
  modelList.selectedIndex = index;
  ChangeModelList();
}

function ChangeModelList() {
  var modelListM = document.getElementById('carmodel');
  var speedListM = document.getElementById('speed');
  var indMod = modelListM.selectedIndex;
  var selMod = modelListM.options[indMod].text;
  while (speedListM.options.length) {
    speedListM.remove(0);
  }
  var speeds = speedsAndModels[selMod];
  if (speeds) {
    for (i = 0; i < speeds.length; i++) {
      var speed = new Option(speeds[i], i + 1);
      speedListM.options.add(speed);
    }
  }
}
<div class="">
  <div class="">
    <span>Select the brand</span>
    <hr>
    <select id="car" onchange="ChangeCarList()">
            <option value="">-- Select --</option> 
            <option value="Volvo">Volvo</option> 
            <option value="Volkswagen">Volkswagen</option> 
            <option value="BMW">BMW</option> 
        </select>
  </div>
  <div class="">
    <span>Select the model</span>
    <hr>
    <select id="carmodel" onchange="ChangeCarList(this.value)"></select>
  </div>
  <div class="">
    <span>Select the speed control</span>
    <hr>
    <select id="speed"></select>
  </div>
</div>

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多