我正在开发一个票证小部件.门票类型很少,每种门票类型还有3个门票选项.当用户开始输入一种票证类型的数量时,应禁用其他票证类型的票证选项.如果用户擦除这些值或将值重新设置为零,则应再次启用其他票证类型的票证选项.

汇总部分应根据输入内容显示总数量和总成本.

这是我的助手:https://codepen.io/CodingPupil/pen/zYbqPxw

启用/禁用票证选项工作正常.但它只计算第一行票据类型的总数.如果我输入第二或第三或任何其他门票类型的值,它不会计算总数.你能调试一下我的jQuery代码,让它显示所有门票类型的正确总数吗?

看看我的副手,我到目前为止都试过什么: https://codepen.io/CodingPupil/pen/zYbqPxw

Html:

<div class="ticket-section">
    <div class="ticket-type" data-ticket-type="grandstand">
      <h3>Grandstand</h3>
      <div class="ticket-options">
        <div class="ticket-option">
            <label>Adult:</label>
            <input type="number" class="ticket-qty" data-type="grandstand" data-option="adult" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Child/OAP:</label>
            <input type="number" class="ticket-qty" data-type="grandstand" data-option="child_oap" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Young Child:</label>
            <input type="number" class="ticket-qty" data-type="grandstand" data-option="young_child" min="0" value="0">
        </div>
      </div>
    </div>
    
    <div class="ticket-type" data-ticket-type="grandstand-side">
      <h3>Grandstand Side</h3>
      <div class="ticket-options">
        <div class="ticket-option">
            <label>Adult:</label>
            <input type="number" class="ticket-qty" data-type="grandstand-side" data-option="adult" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Child/OAP:</label>
            <input type="number" class="ticket-qty" data-type="grandstand-side" data-option="child_oap" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Young Child:</label>
            <input type="number" class="ticket-qty" data-type="grandstand-side" data-option="young_child" min="0" value="0">
        </div>
      </div>
    </div>
    
    <div class="ticket-type" data-ticket-type="ringside-row-1">
        <h3>Ringside Row 1</h3>
        <div class="ticket-options">
        <div class="ticket-option">
            <label>Adult:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-1" data-option="adult" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Child/OAP:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-1" data-option="child_oap" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Young Child:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-1" data-option="young_child" min="0" value="0">
        </div>
        </div>
    </div>
    
    <div class="ticket-type" data-ticket-type="ringside-row-2">
        <h3>Ringside Row 2</h3>
        <div class="ticket-options">
        <div class="ticket-option">
            <label>Adult:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-2" data-option="adult" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Child/OAP:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-2" data-option="child_oap" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Young Child:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-2" data-option="young_child" min="0" value="0">
        </div>
        </div>
    </div>
    
    <div class="ticket-type" data-ticket-type="ringside-row-3">
        <h3>Ringside Row 3</h3>
        <div class="ticket-options">
        <div class="ticket-option">
            <label>Adult:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-3" data-option="adult" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Child/OAP:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-3" data-option="child_oap" min="0" value="0">
        </div>
        <div class="ticket-option">
            <label>Young Child:</label>
            <input type="number" class="ticket-qty" data-type="ringside-row-3" data-option="young_child" min="0" value="0">
        </div>
        </div>
    </div>
    
    <!-- Add additional ticket types and options as needed -->
</div>
  
<div class="ticket-summary">
    <h3>Total Summary</h3>
    <div class="total-info">
      <p>Total Tickets: <span id="total-tickets">0</span></p>
      <p>Total Cost: £<span id="total-cost">0.00</span></p>
    </div>
</div>

JS:

jQuery(document).ready(function($) {
        const ticketPrices = {
          grandstand: {
            adult: 20,
            child_oap: 15,
            young_child: 10
          },
          grandstand_side: {
            adult: 25,
            child_oap: 18,
            young_child: 12
          },
          ringside_row_1: {
            adult: 30,
            child_oap: 22,
            young_child: 15
          },
          ringside_row_2: {
            adult: 35,
            child_oap: 25,
            young_child: 18
          },
          ringside_row_3: {
            adult: 40,
            child_oap: 30,
            young_child: 20
          }
        };
    
        $('.ticket-qty').on('input', function() {
          var currentType = $(this).data('type');
          var activeQuantity = parseInt($(this).val()) || 0;
    
          // Disable all inputs initially
          $('.ticket-qty').prop('disabled', true);
    
          // Enable inputs for the current ticket type
          $('.ticket-qty[data-type="' + currentType + '"]').prop('disabled', false);
    
          var totalTickets = 0;
          var totalCost = 0;
    
          $('.ticket-qty').each(function() {
            var ticketType = $(this).data('type');
            var ticketOption = $(this).data('option');
            var quantity = parseInt($(this).val()) || 0;
    
            if (quantity > 0) {
              $(this).closest('.ticket-type').addClass('active');
            } else {
              $(this).closest('.ticket-type').removeClass('active');
            }
    
            if (ticketPrices[ticketType] && ticketPrices[ticketType][ticketOption]) {
              var ticketCost = ticketPrices[ticketType][ticketOption];
              totalTickets += quantity;
              totalCost += quantity * ticketCost;
            }
    
            if ($(this).val().trim() === '') {
              $(this).val('0');
            }
          });
    
          // Check if all inputs of the active row are 0 to enable other rows
          if (activeQuantity === 0) {
            $('.ticket-qty').not('.ticket-qty[data-type="' + currentType + '"]').prop('disabled', false);
          }
    
          $('#total-tickets').text(totalTickets);
          $('#total-cost').text(totalCost.toFixed(2));
        });
      });

推荐答案

我已经快速判断了您的HTML和JS代码,我发现在"-"上应该使用"_".

data-type="grandstand-side"应为data-type="grandstand_side",与ringside-row-1相同应为ringside_row_1

在编程变量代码时尽量避免使用-,最好练习使用_.

Javascript相关问答推荐

将数据从strapi提取到next.js,但响应延迟API URL

如何获取转换字节的所有8位?

为什么从liveWire info js代码传递数组我出现错误?

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

嵌套异步JavaScript(微任务和macrotask队列)

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

使用JQuery单击元素从新弹出窗口获取值

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

如何在Svelte中从一个codec函数中调用error()?

为什么我的自定义元素没有被垃圾回收?

在数组中查找重叠对象并仅返回那些重叠对象

如何在Java脚本中对列表中的特定元素进行排序?

是否可以将Select()和Sample()与Mongoose结合使用?

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

图表4-堆叠线和条形图之间的填充区域

如何使用Astro优化大图像?

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

我在哪里添加过滤器值到这个函数?