调试 jQuery 代码以获取所有行的总数(票证类型)

问题描述 投票:0回答:1

我正在开发一个票务小部件。门票类型很少,每种门票类型还有 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));
        });
      });
javascript jquery
1个回答
0
投票

我快速检查了你的 HTML 和 JS 代码,我发现“-”上应该使用“_”代替。

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

在编写可变代码时尽量避免使用

-
,练习使用
_
会更好。

© www.soinside.com 2019 - 2024. All rights reserved.