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

求助:打印类型与尺寸下拉框联动后价格未同步清除的解决方案

问题:下拉选择框更改选项后价格未清除的修复需求

我需要实现两个联动的下拉选择框:一个选择打印类型(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:50:35