如何删除Stripe的iframe?

时间:2019-03-12 10:16:57

标签: javascript vue.js iframe stripe-payments

我在内部单页应用程序上使用带有vue-stripe-elements-plus的Stripe Elements。由于用户离开更改信用卡模块后无需保持条带代码运行,因此我想完全卸载Stripe,但这似乎并不那么容易。

在将其卸载到组件的var list = new List<ModelName>(); list = ctx.MemberTable .Where(c => c.sex==Sex) .Where(c => c.membercode==true) .ToList(); 挂钩中并删除添加的iframe后:

destroyed

由Stripe添加的iframe:

enter image description here

过一会儿(其中一个)再次出现:

enter image description here

像这样的iframe似乎是由Stripe的侦听器重新创建的,这些侦听器在发生消息事件时已附加到窗口对象。我无法删除此侦听器,因为处理函数位于iframe内的iframe中,因此浏览器不允许我访问其内部。

此外,该侦听器正在发出不需要的条纹请求:

destroyed () {
        this.$unloadScript('https://js.stripe.com/v3/');
        //delete window.Stripe; // commented because this makes stripe add iframes twice

        let stripeIframes = [
            document.querySelectorAll('[name^=__privateStripeMetricsController]'),
            document.querySelectorAll('[name^=__privateStripeController]'),
        ];

        stripeIframes.forEach(iframes => iframes.forEach(iframe => {
             iframe.parentNode.removeChild(iframe);
        }));
},

2 个答案:

答案 0 :(得分:0)

您可以使用setTimeout(destroyed, 1000)

答案 1 :(得分:0)

您应该使用Stripe element's official destroy method而不是从DOM中手动删除元素。它也应该清除所有Stripe侦听器。

有了这个库,您可以尝试一些like this

    <template>
     <div ref="card" />
    </template>
    
    <script>
    let stripe = window.Stripe('pk_test_xxxxxxxxxxxx'),
        elements = stripe.elements(),
        card = undefined;
    
    export default {
        name: 'Payment',
        mounted() {
          card = elements.create('card');
          card.mount(this.$refs.card);
        },
        beforeDestroy() {
          card.destroy(this.$refs.card);
        },
    }
    </script>