recaptcha - 自定义元素 Web 组件影子 DOM 供应商脚本/元素

标签 recaptcha web-component shadow-dom custom-element

使用 Custom Elements 时那个杠杆Shadow DOM ,注入(inject)第 3 方脚本和元素(例如 Invisible reCAPTCHA)的官方方法是什么?这需要这样的脚本:

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

用于 HTML 元素,例如 <button>被引导并呈现 reCAPTCHA?

shadowRoot似乎没有head之类的东西, 脚本是否应该添加到创建的 templateinnerHTML ?或者是 <script>通过 appendChild 附加到 shadowRoot在connectedCallback() ?在 Shadow DOM 中使用第三方库的官方方法是什么?由于 Shadow DOM,在包含呈现的自定义元素的页面上加载脚本似乎不会触发呈现。

const template = document.createElement('template');
template.innerHTML = `
    <form>
        <button class="g-recaptcha" 
            data-sitekey="your_site_key" 
            data-callback='onSubmit'>Submit</button>
    </form>
`;

class CustomElement extends HTMLElement {
  constructor() {
    super(); // always call super() first in the ctor.
    this.attachShadow({mode: 'open'});
    this.shadowRoot.appendChild(template.content.cloneNode(true));
  }
  connectedCallback() {
    ...
  }
  disconnectedCallback() {
    ...
  }
  attributeChangedCallback(attrName, oldVal, newVal) {
    ...
  }
}

感谢您提供的任何指导。

最佳答案

没有官方方法,因为解决方案取决于第 3 方库的实现。

但是,对于 reCaptcha,解决方法是公开 <button>在普通 DOM 中,并通过 <slot> 将其注入(inject) Shadow DOM 中元素。

class extends HTMLElement {
    constructor() {
        super()
        this.attachShadow( {mode: 'open'} ).innerHTML= `
            <form>
                <slot></slot>
            </form>`                
    }

    connectedCallback() {
        this.innerHTML = `                  
            <button
                class="g-recaptcha"
                data-sitekey="your_site_key"
                data-callback="onSubmit">Submit</button>`
        }
    })

关于recaptcha - 自定义元素 Web 组件影子 DOM 供应商脚本/元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47226529/

相关文章:

javascript - 嵌套元素(Web 组件)无法获取其模板

javascript - 在被光 DOM 中的元素(不是父元素)覆盖的影子 DOM 元素上触发事件

javascript - ReCaptcha API v2 样式

javascript - Google reCaptcha 在 React.js 中工作?

web-component - 向开槽元素添加类(?)

import - 将 HTML 和 CSS 与 Javascript Lit 元素分离

jquery - <svg> 中的 <use> 在 IE 中找不到最接近的 <div>

python - 如何通过 Mechanize 传递隐藏的重新验证?

javascript - 如何将reCaptcha v2与JS和PHP表单集成?

javascript - document.registerElement 扩展 HTMLInputElement 原型(prototype),同时使用自定义标签名称以避免隐式浏览器样式