javascript - 推迟执行,直到外部脚本加载到 Vue.js 中

标签 javascript vue.js vuejs2 dom-events recaptcha

我想渲染一个 recaptchaVue.js之后组件已安装。它适用于正常加载和重新加载,但是当我导航到不同的 url 时然后单击浏览器后退按钮,它会引发错误。

这是我的设置:

  • 我正在加载 api页面底部的脚本:

    <script src='https://www.google.com/recaptcha/api.js' async></script>

  • 在该页面上,我呈现了一个名为 Contact.vue 的全局注册组件。包含名为 Recaptcha.vue 的本地组件:

    <app-recaptcha @recaptchaResponse="updateRecaptchaResponse"></app-recaptcha>

Recaptcha.vue 的代码看起来像这样:

<template>
    <div id="app-recaptcha">
        <div :id="placeholderId"></div>
    </div>
</template>


<script>
    export default {
        data() {
            return {
                sitekey: 'key_here',
                placeholderId: 'grecaptcha',
                widgetId: null
            }
        },


        mounted() {
            this.$nextTick(function () {
                this.render();
            });
        },


        methods: {
            render() {
                this.widgetId = window.grecaptcha.render(this.placeholderId, {
                    sitekey: this.sitekey,
                    callback: (response) => {
                        this.$emit('recaptchaResponse', response);
                    }
                });
            },

            reset() {
                window.grecaptcha.reset(this.widgetId);
            }
        }
    }
</script>


<style>...</style>

正常页面加载/重新加载this.render()正常执行。然而,当我导航到另一个 url并通过后退按钮返回我得到:Error in nextTick: "TypeError: window.grecaptcha.render is not a function" .

我尝试过:

  • onload 上设置一个变量api 事件脚本:

    <script src='...' onload="window.script = { recaptcha: 'ready' }" async></script>

  • 然后将其作为属性添加到 data() 中的 Recaptcha.vue :

    ready: window.script.recaptcha

  • 接下来,我在 ready 上添加了一个观察者属性并在那个观察者中我试图运行 this.render()

没有成功,错误依然存在。我认为即使在正常的加载/重新加载情况下,我也很“幸运” api在安装组件之前加载脚本,然后放置 this.render()mounted()里面钩子(Hook)没有帮助。

你知道我怎么发信号吗Recaptcha.vue外部脚本已完成加载,然后才呈现 recaptcha

最佳答案

好吧,这是一个理论:添加数据属性

captchaReady: false, 
checkingInterval: null,

创建

let localThis = this 
this.checkingInterval = setInterval(function(){
  if (window.grecaptcha) {
    localThis.captchaReady = true
  }
}, 500) //or whatever interval you want to check 

然后

watch: {
  captchaReady: function(data) {
    if (data) { 
       clearInterval(this.checkingInterval) 
       this.render()
    }
  }
}

关于javascript - 推迟执行,直到外部脚本加载到 Vue.js 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48693664/

相关文章:

javascript - 过渡组动画在添加第三个元素时改变行为

javascript - 如何在 vue-routers 中使用参数重定向到路由器

javascript - 如何将 cytoscape 对象存储在 Vue.js 数据实例中?

javascript - 不在 html 页面上显示来自 API 的值,而是加载 JSON

php - ajax 无法在 Chrome 中运行

javascript - 在现有应用程序中响应组件

node.js - Axios前端到Golang后端的CORS问题

javascript - Vuejs 2 服务器端渲染 - 不工作

javascript - 渲染错误 : "TypeError: Cannot read property ' length' of undefined"

javascript - 用于删除灯箱联系表单滚动条的CSS