PaymentRequest: paymentmethodchange 事件

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

当用户在给定的支付处理程序内更改支付方式时,paymentmethodchange 事件会被发送到 Payment Request APIPaymentRequest 对象。

例如,如果用户在他们的 Apple Pay 账户中从一张信用卡切换到另一张,则会触发 paymentmethodchange 事件,告知您此更改。

此事件不可取消,也不会冒泡。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("paymentmethodchange", (event) => { })

onpaymentmethodchange = (event) => { }

事件类型

一个 PaymentMethodChangeEvent。继承自 Event

Event PaymentRequestUpdateEvent PaymentMethodChangeEvent

事件属性

除了以下属性之外,此接口还包含从 PaymentRequestUpdateEvent 继承的属性。

methodDetails 只读

一个包含支付方法特定数据的对象,在处理支付方法更改时很有用。如果没有此类信息,则此值为 null

methodName 只读

一个字符串,包含支付方法标识符,该字符串唯一标识特定的支付方法。此标识符通常是在支付过程中使用的 URL,但也可以是标准化的非 URL 字符串,例如 basic-card。默认值为为空字符串 ""

示例

让我们来看一个例子。此代码创建了一个新的 PaymentRequest,通过调用请求的 addEventListener() 来添加 paymentmethodchange 事件的处理程序,然后调用 show() 向用户显示支付界面。

该代码假定存在一个 detailsForTransaction() 方法,该方法将返回一个对象,该对象可以作为 PaymentRequest 构造函数的 details 参数传递。

js
const paymentRequest = new PaymentRequest(
  paymentMethods,
  detailsForTransaction(),
);

paymentRequest.addEventListener("paymentmethodchange", handlePaymentChange);

paymentRequest
  .show()
  .then((response) => response.complete("success"))
  .catch((err) => console.error(`Error handling payment request: ${err}`));

事件处理程序本身 handlePaymentChange() 看起来像这样

js
handlePaymentChange = (event) => {
  const detailsUpdate = {};

  if (event.methodName === "https://apple.com/apple-pay") {
    const serviceFeeInfo = calculateServiceFee(event.methodDetails);
    Object.assign(detailsUpdate, serviceFeeInfo);
  }

  event.updateWith(detailsUpdate);
};

首先查看事件的 methodName 属性;如果该属性指示用户正尝试使用 Apple Pay,我们将 methodDetails 传递给一个名为 calculateServiceFee() 的函数。我们可以创建该函数来接收有关交易的信息,例如用于服务 Apple Pay 请求的底层信用卡,并计算并返回一个对象,该对象指定将应用于 PaymentRequest 的更改,以添加支付方法可能需要的任何服务费。

在事件处理程序返回之前,它会调用事件的 updateWith() 方法,将更改集成到请求中。

规范

规范
Payment Request API
# dfn-paymentmethodchange
Payment Request API
# onpaymentmethodchange 属性

浏览器兼容性

另见