javascript 加载外部JS以在< script setup>Vue 3组件中可用

rlcwz9us  于 2023-05-16  发布在  Java
关注(0)|答案(2)|浏览(213)

我试图在我的Vue 3/InertiaJS/Laravel应用程序中实现一个令牌化的支付表单,并且无法加载外部脚本,以便在<script setup>中定义一个值并将其附加到DOM元素。根据文件,我正在做这个

<script setup> 
        const tokenizerScript = document.createElement("script");
        tokenizerScript.setAttribute(
            "src",
            "https://app.2apgateway.com/tokenizer/tokenizer.js"
        );
        tokenizerScript.setAttribute(
            'language',
            'javascript'
        )
        document.head.appendChild(tokenizerScript);

        const tokenizer = new Tokenizer({
            url: apiUrl, 
            apikey: publicApiKey,
            container: '#container', 
            // Callback after submission request has been made
            submission: (resp) => { // Figure out what response you got back
                switch(resp.status) {
                    case 'success':
                        // Successful submission
                        console.log(resp.token)
                        Inertia.post(`/users/${props.user.id}/dues/submit-online-payment`, {
                            token: resp.token
                        })
                        break;
                    case 'error':
                        // Encountered an error while performing submission
                        console.log(resp.msg)
                        break;
                    case 'validation':
                        // Encountered form validation specific errors
                        console.log(resp.invalid)
                        break;
                }
            }
        })
</script>

<template>
    <div id="container" />
</template>

不管我怎么做,无论是用这种方式,还是使用<link rel="prefetch">,或者试图在onMountedonBeforeMount钩子中加载它,我都会得到一个错误,Tokenizer is not defined.通常如果我使用浏览器返回按钮返回到前一页并返回,它会工作,但并不总是如此
如何加载此脚本,以便在<script setup>中调用它时完全可用?

8xiog9wr

8xiog9wr1#

你需要知道脚本什么时候准备好了才能使用它提供的代码,理论上你可能需要在onMounted中这样做,因为你只能在DOM存在的时候追加它。
在将tokenizerScript附加到文档之前,您需要考虑这是否已经运行过,如果脚本已经加载,我不能告诉您是否会有重复的行为,我没有加载这样的外部脚本超过10年。
您应该将tokenizer放在它自己的方法(funciton doTokenize() { ... new Tokenizer() ... })中,如果脚本已经加载,您可以调用该方法,或者在脚本加载后通过回调延迟调用它。
要等待tokenizer.js加载,您应该在执行appendChild(tokenizerScript)之前注册onload回调函数。

tokenizerScript.defer = true

tokenizerScript.onload = () => {
  doTokenize()
}

document.head.appendChild(tokenizerScript);
kd3sttzy

kd3sttzy2#

你可以通过在代码中使用mounted()函数来解决这个问题。

<script>
  export default {
    
    mounted() {
      let tokenizerScript= document.createElement('script')
      tokenizerScript .setAttribute('src', 'https://app.2apgateway.com/tokenizer/tokenizer.js')
      document.head.appendChild(tokenizerScript)
    }

  }
</script>

相关问题