VueJS和AmazonPayButton javascript错误

问题描述

我正在尝试在我的VueJS应用中使用AmazonPay。我能够加载JavaScript,但是尝试显示按钮时出现错误。似乎那里会有很多AmazonPay的示例,但对于VueJS则没有。

这是Javascript控制台错误

Uncaught TypeError: Cannot read property 'getElementsByTagName' of null
    at Object.C.Button (Widgets.js:2)
    at window.onAmazonPaymentsReady (playmix.vue?4ede:39)
    at Widgets.js:2
    at Widgets.js:2
    at HTMLScriptElement.a (Widgets.js:2)

我将要由Amazon javascript调用的javascript放在组件的已安装部分中:

 mounted() {
    window.onAmazonLoginReady = function () {
      amazon.Login.setClientId(
        "CLIENT_ID"
      );
    };
    window.onAmazonPaymentsReady = function () {
      showButton();
    };
    function showButton() {
      var authRequest;
      OffAmazonPayments.Button(
        "AmazonPayButton","CLIENT_ID",{
          type: "PwA",color: "Gold",size: "medium",authorization: function () {
            loginoptions = { scope: "profile",popup: "false" };
            authRequest = amazon.Login.authorize(
              loginoptions,"https://localhost/test"
            );
          },}
      );
    }
    let amazonpay = document.createElement("script");
    amazonpay.setAttribute(
      "src","https://static-na.payments-amazon.com/OffAmazonPayments/us/sandBox/js/Widgets.js"
    );
    amazonpay.setAttribute("type","text/javascript");
    amazonpay.async = true;
    document.head.appendChild(amazonpay);
},

在我的组件中有一个标签。 我找到了一个用于AmazonPay的React包,但是到目前为止,我还没有找到在Vue中使用的许多示例。 Vue有一个功能完善的商业图书馆,但是对于我的项目而言似乎有些过时了。 关于如何解决此问题的任何想法?

解决方法

我刚刚遇到了同样的问题,并通过使用 Vue 的 showButton() 函数包装对 .$nextTick() 的调用解决了它。这将在模板渲染完成后运行您的函数。

如果您只是在 mounted() 部分中替换它,以下内容应该适用于您的示例。

如果你可以使用 ES6:

window.onAmazonPaymentsReady = () => {
  this.$nextTick(function(){
    showButton();
  })
};

如果没有,那么这应该有效:

var that = this;
window.onAmazonPaymentsReady = function () {
  that.$nextTick(function(){
    showButton();
  })
};

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...