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

如何在Ajax提交后更新PayPal按钮金额而非重复创建按钮

解决PayPal按钮重复生成的问题

我明白你的问题了——每次选择新的下拉选项提交后,PayPal按钮都会在旧按钮下面叠加生成,而不是更新现有按钮的价格。这是因为你每次Ajax请求成功后,都直接把完整的按钮渲染代码插入到页面中,没有清理掉之前的按钮实例或容器内容,导致重复渲染。

下面是两种可行的解决方案,优先推荐第一种,因为它更灵活、易维护:


方案一:前端维护按钮渲染逻辑,后端仅返回价格

这种方式把按钮的渲染逻辑放在前端,后端只返回计算后的价格,这样我们可以轻松控制按钮的销毁和重建:

步骤1:修改前端代码,封装按钮渲染函数

首先在你的JS中添加一个可复用的按钮渲染函数,并且保存按钮实例以便后续销毁:

// 全局变量保存PayPal按钮实例
let paypalButtonInstance;

// 渲染PayPal按钮的函数,接收价格参数
function renderPayPalButton(totalAmount) {
    // 如果已有按钮实例,先销毁它
    if (paypalButtonInstance) {
        paypalButtonInstance.close();
    }

    // 渲染新的按钮
    paypalButtonInstance = paypal.Button.render({
        env: 'sandbox', // sandbox | production
        style: {
            label: 'generic',
            size: 'small',
            shape: 'pill',
            tagline: false,
            color: 'gold'
        },
        client: {
            sandbox: 'AWqKtLAN25BqUyOzBLtH8deIFj-mNFrW4fqEie1Is6n4wnO0-bXTkoU5WJNtjLQSd_Uv5ax3bEUmeuuC',
            production: 'AZw2Rw7pnweBi5exyjuPUEzC5jo3L7x2ksE8FxHzKKXm4qNhUegsJm15icAyEk3IV6gg46Nib-D5Crm1'
        },
        commit: true,
        payment: function(data, actions) {
            return actions.payment.create({
                payment: {
                    transactions: [{
                        amount: {
                            total: totalAmount,
                            currency: 'GBP'
                        }
                    }]
                }
            });
        },
        onAuthorize: function(data, actions) {
            return actions.payment.execute().then(function() {
                return actions.redirect();
            });
        },
        onCancel: function(data, actions) {
            return actions.redirect();
        }
    }, '#paypal-button-container');
}

步骤2:修改Ajax提交逻辑,接收后端返回的价格

更新你的表单提交事件,让Ajax请求仅获取价格,然后调用渲染函数:

$('.myForm2').on('submit', function(e) {
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: 'submissionVAT.php',
        data: $(this).serialize(),
        success: function(server_response) {
            // 去除响应中的多余空格,确保价格格式正确
            const newPrice = server_response.trim();
            // 用新价格渲染按钮
            renderPayPalButton(newPrice);
        }
    });
});

步骤3:修改后端submissionVAT.php,仅返回价格

把原来输出完整按钮代码的逻辑改成只输出计算后的价格:

<?php
// 这里保留你获取选中选项、计算$randomItem的逻辑
// ...

// 只输出价格即可
echo $randomItem;
?>

方案二:保留后端生成按钮代码,前端清理容器后重新执行

如果你不想改动太多现有逻辑,可以在每次插入新代码前清空按钮容器,并且手动执行插入的JS代码:

修改前端Ajax的success回调:

$('.myForm2').on('submit', function(e) {
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: 'submissionVAT.php',
        data: $('.myForm2').serialize(),
        success: function(server_response) {
            // 先清空PayPal按钮容器,避免叠加
            $("#paypal-button-container").empty();
            // 更新result容器内容
            $(".result").html(server_response);
            // 手动执行插入的script代码(因为jQuery的html()不会自动执行script标签)
            $(".result script").each(function() {
                eval($(this).text());
            });
        }
    });
});

⚠️ 注意:eval函数存在安全风险,如果你的后端响应内容不可控,不建议使用这种方式。


内容的提问来源于stack exchange,提问作者Thomas Evans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:18:05