求助:打印类型与尺寸下拉框联动后价格未同步清除的解决方案
问题:下拉选择框更改选项后价格未清除的修复需求
我需要实现两个联动的下拉选择框:一个选择打印类型(PRINT TYPE),一个选择尺寸(SIZE)。例如选“LUSTRE”时,尺寸框只显示“17x25.5”“13x19”“10x15”,不同打印类型对应不同尺寸范围。
目前已实现匹配打印类型和尺寸显示对应价格的功能,但存在问题:用户选完两个选项后,若更改其中一个(比如改成“SATIN”+“SELECT SIZE”),价格仍保留之前的数值,点击加入购物车会携带错误的“SATIN”“SELECT SIZE”和旧价格信息。需要实现更改选项后自动清除已设置的价格。
现有代码
HTML部分
<div class="shop-item"> <span class="shop-item-title">19</span> <img id="cars1" class="shop-item-image shop-item-image1" src="../IMG/ESPSTORE41.jpg"> <span class="shop-item-src1">../IMG/ESPSTORE41.jpg</span> <div class="shop-item-details"> <select name="menu1" id="print-type1"> <option id="print-type-button1" value="24x36,20x30,17x25.5,16x24,13x19,12x18,10x15">SELECT PRINT TYPE</option> <option id="satin-button1" value="24x36,20x30,16x24,12x18">SATIN</option> <option id="lustre-button1" value="17x25.5,13x19,10x15">LUSTRE</option> <option id="canvas-button1" value="24x36">CANVAS</option> <option id="aluminum-button1" value="24x36,20x30">ALUMINUM PHOTO PANEL</option> </select> <select name="menu2" id="size-type1"> <option id="size-button1" value="">SELECT SIZE</option> <option id="24x36-button1" value="24x36">24x36</option> <option id="20x30-button1" value="20x30">20x30</option> <option id="17x25.5-button1" value="17x25.5">17x25.5</option> <option id="16x24-button1" value="16x24">16x24</option> <option id="13x19-button1" value="13x19">13x19</option> <option id="12x18-button1" value="12x18">12x18</option> <option id="10x15-button1" value="10x15">10x15</option> </select> <span id="shop-item-price1" class="shop-item-price shop-item-price1"></span> <button id="shop-item-button1" class="btn btn-primary shop-item-button" type="button">ADD TO CART</button> </div> </div>
JavaScript部分
//checking print to size to display price var typeElement1 = document.getElementById('print-type1') var checkTypeText1 = typeElement1.options[typeElement1.selectedIndex].text typeElement1.addEventListener("change", (e) => { var typeText1 = typeElement1.options[typeElement1.selectedIndex].text var sizeElement1 = document.getElementById('size-type1') var checkSizeText1 = sizeElement1.options[sizeElement1.selectedIndex].text sizeElement1.addEventListener("change", (e) => { var sizeText1 = sizeElement1.options[sizeElement1.selectedIndex].text if(sizeText1 == 'SELECT SIZE') { document.getElementById('shop-item-price1').innerText = '' } if(typeText1 == 'SATIN' && sizeText1 == '24x36') { document.getElementById('shop-item-price1').innerText = '$200' } else if(typeText1 == 'SATIN' && sizeText1 == '20x30') { document.getElementById('shop-item-price1').innerText = '$170' } else if(typeText1 == 'SATIN' && sizeText1 == '16x24') { document.getElementById('shop-item-price1').innerText = '$150' } })}) ////checking size to print to display price var sizeElement1 = document.getElementById('size-type1') var checkSizeText1 = sizeElement1.options[sizeElement1.selectedIndex].text sizeElement1.addEventListener("change", (e) => { var sizeText1 = sizeElement1.options[sizeElement1.selectedIndex].text var typeElement1 = document.getElementById('print-type1') var checkTypeText1 = typeElement1.options[typeElement1.selectedIndex].text typeElement1.addEventListener("change", (e) => { var typeText1 = typeElement1.options[typeElement1.selectedIndex].text if(typeText1 == 'SELECT PRINT TYPE') { document.getElementById('shop-item-price1').innerText = '' } if(typeText1 == 'SATIN' && sizeText1 == '24x36') { document.getElementById('shop-item-price1').innerText = '$200' } else if(typeText1 == 'SATIN' && sizeText1 == '20x30') { document.getElementById('shop-item-price1').innerText = '$170' } else if(typeText1 == 'SATIN' && sizeText1 == '16x24') { document.getElementById('shop-item-price1').innerText = '$150' } })}) //selecting which display options to show or hide const sizeType1 = document.getElementById("size-type1"); const sizeType1Options = [...sizeType1.children]; document.querySelector("#print-type1").addEventListener("change", (e) => { sizeType1.innerHTML = sizeType1Options .filter((o) => e.target.value.includes(o.value)) .map((o) => o.outerHTML) .join(""); }); //grabbing selected info from boxes to move to cart page function addToCartClicked(event) { var button = event.target var shopItem = button.parentElement.parentElement var title = shopItem.getElementsByClassName('shop-item-title')[0].innerText var price = shopItem.getElementsByClassName('shop-item-price')[0].innerText var imageSrc = shopItem.getElementsByClassName('shop-item-image')[0].src if(price == '') { alert('Please select Size and Type') return; } if (title == "19") { addItemToCart1() } else if (title == "20") { addItemToCart2() } } //adding info to localStorage function addItemToCart1() { var cartRowSrc1 = `${document.getElementsByClassName('shop-item-src1')[0].innerText}` var cartRowPrice1 = `${document.getElementsByClassName('shop-item-price1')[0].innerText}` localStorage.setItem("naturesrc1", cartRowSrc1) localStorage.setItem("natureprice1", cartRowPrice1) var typeElement1 = document.getElementById('print-type1') var checkTypeText1 = typeElement1.options[typeElement1.selectedIndex].text var typeText1 = typeElement1.options[typeElement1.selectedIndex].text var sizeElement1 = document.getElementById('size-type1') var checkSizeText1 = sizeElement1.options[sizeElement1.selectedIndex].text var sizeText1 = sizeElement1.options[sizeElement1.selectedIndex].text var cartRowTitle1 = typeText1 + sizeText1 localStorage.setItem("naturetitle1", cartRowTitle1) alert("Added To Cart") }
解决方案
1. 重构价格计算逻辑,统一处理所有选项变更
原代码重复绑定事件、逻辑分散,导致状态不同步。统一写一个价格更新函数,在打印类型和尺寸变更时都调用:
// 定义统一的价格更新函数 function updatePrice() { const typeElement = document.getElementById('print-type1'); const sizeElement = document.getElementById('size-type1'); const priceElement = document.getElementById('shop-item-price1'); const selectedType = typeElement.options[typeElement.selectedIndex].text; const selectedSize = sizeElement.options[sizeElement.selectedIndex].text; // 先清空价格,再根据有效选择设置新价格 priceElement.innerText = ''; // 基础校验:如果是默认选项,直接返回 if (selectedType === 'SELECT PRINT TYPE' || selectedSize === 'SELECT SIZE') { return; } // 价格匹配逻辑,可扩展所有类型的价格 if (selectedType === 'SATIN') { switch(selectedSize) { case '24x36': priceElement.innerText = '$200'; break; case '20x30': priceElement.innerText = '$170'; break; case '16x24': priceElement.innerText = '$150'; break; } } else if (selectedType === 'LUSTRE') { switch(selectedSize) { case '17x25.5': priceElement.innerText = '$180'; // 示例价格,按需修改 break; case '13x19': priceElement.innerText = '$120'; break; case '10x15': priceElement.innerText = '$100'; break; } } // 其他打印类型的价格逻辑继续在这里扩展 } // 给打印类型选择框绑定事件:更新尺寸选项后立即更新价格 document.getElementById('print-type1').addEventListener('change', (event) => { const sizeType1 = document.getElementById("size-type1"); const sizeType1Options = [...sizeType1.children]; const selectedTypeValue = event.target.value; sizeType1.innerHTML = sizeType1Options .filter((o) => selectedTypeValue.includes(o.value)) .map((o) => o.outerHTML) .join(""); updatePrice(); }); // 给尺寸选择框绑定事件:变更时更新价格 document.getElementById('size-type1').addEventListener('change', updatePrice);
2. 移除冗余代码
删除原代码中两段重复的价格监听逻辑(//checking print to size to display price和////checking size to print to display price部分),避免多次绑定导致的逻辑冲突。
3. 强化加入购物车的校验(可选)
在addToCartClicked里新增校验,确保打印类型和尺寸都不是默认选项:
function addToCartClicked(event) { var button = event.target; var shopItem = button.parentElement.parentElement; var title = shopItem.getElementsByClassName('shop-item-title')[0].innerText; var price = shopItem.getElementsByClassName('shop-item-price')[0].innerText; var imageSrc = shopItem.getElementsByClassName('shop-item-image')[0].src; // 新增校验:检查打印类型和尺寸是否为默认选项 const typeElement = document.getElementById('print-type1'); const sizeElement = document.getElementById('size-type1'); const selectedType = typeElement.options[typeElement.selectedIndex].text; const selectedSize = sizeElement.options[sizeElement.selectedIndex].text; if(price === '' || selectedType === 'SELECT PRINT TYPE' || selectedSize === 'SELECT SIZE') { alert('Please select Size and Type'); return; } if (title === "19") { addItemToCart1(); } else if (title === "20") { addItemToCart2(); } }
关键改进点
- 统一价格更新逻辑:无论哪个选择框变更,都先清空价格再重新计算,确保状态同步。
- 事件绑定更清晰:每个选择框只绑定一次事件,避免重复触发逻辑混乱。
- 尺寸联动后自动更新价格:打印类型变更、更新完尺寸选项后立即调用价格更新,避免用户看到旧价格。
内容的提问来源于stack exchange,提问作者Eric Skakum
相关产品推荐
相关产品推荐

