Передача переменных из HTML в файл Javascript, использующий addEventListener

Я использую Stripe для приема платежей Apple pay (здесь это не очень важно). Я использую Django. Код отлично работает для обработки платежей, но у меня проблемы с передачей переменной в отдельный .js файл. (сумма для оплаты) из моего HTML файла в Javascript файл, который фактически обрабатывает платежи.

home.html

{% load static %}
<!DOCTYPE html>
<html>
<head>
    import more scripts here
    <script src="https://js.stripe.com/v3/"></script>
    <script src="{% static 'interface/utils.js' %}" defer></script>
    <script src="{% static 'interface/apple-pay.js' %}" defer></script>
</head>
<body>
    <header class="text-center">
        <div id="rectangle"></div>
    </header>
    <section>
        <div class="text-center">
            <div class="container container--narrow">
                <script>amount=parseInt("{{event.price}}")</script>
                <div id="payment-request-button">
                    <!-- A Stripe Element will be inserted here if the browser supports this type of payment method. -->
                </div>
            </div>            
        </div>
    </section>
</body>
</html>

Файл Javascript, который вызывается для обработки платежа: apple-pay.js

document.addEventListener('DOMContentLoaded', async () => {
    const stripe = Stripe('pk_test_testkey');

    const paymentRequest = stripe.paymentRequest() ({
        currency: 'usd',
        country: 'US',
        requestPayerName: true,
        requestPayerEmail: true,
        total: {
            label: 'Test payment',
            amount: amount, //trying to pass the variable in here
        }
    });

  // Other functions that get called go here
});

Ошибка, которую я вижу в консоли, заключается в том, что 'total' в вызове API больше не является объектом. Console.log(typeof amount) возвращает число, а console.log(amount) возвращает число, которое я ожидаю. Но как мне передать это в файл Javascript?

Используйте атрибуты data. То, как вы сейчас это делаете, теоретически может работать, если вы все правильно настроите, но это определенно не лучшая практика. Простым решением является:

Вместо этого кода,

<script>amount=parseInt("{{event.price}}")</script>

просто прикрепите атрибут data-amount к элементу рядом с деревом. Возможно, вам даже удастся обойтись без того, чтобы поместить его на payment-request-button следующим образом:

<div id="payment-request-button" data-amount="{{event.price}}">

Затем в вашем javascript:

//...
    amount: document.querySelector("#payment-request-button").dataset.amount
//...

Если вы не можете редактировать файл javascript, тогда все намного сложнее, поэтому я надеюсь, что вы сможете!

Вернуться на верх