Кнопка аутентификации Google не работает с shadow dom

#polymer #google-authentication #shadow-dom #polymer-3.x

#polymer #google-аутентификация #shadow-dom #polymer-3.x

Вопрос:

Я пытаюсь добавить кнопку аутентификации Google в простой проект polymer 3, я следую этому руководству:https://developers.google.com/identity/sign-in/web/sign-in?authuser=0

Как сказано в руководстве, я включаю библиотеку платформы Google с:

 <script src="https://apis.google.com/js/platform.js" async defer></script>
  

А также у меня есть div для кнопки по мере необходимости:

 <div class="g-signin2" data-onsuccess="onSignIn"></div>
  

Проблема в том, что я хочу иметь эту кнопку внутри веб-компонента, а скрипт не работает, потому что он не может видеть div, который находится под shadow DOM (скрипт использует селектор запросов с именем класса, я думаю). Кнопка работает, только если она находится непосредственно в index.js (не под shadow root).

Есть ли какой-нибудь способ достичь того, что мне нужно?

Заранее спасибо.

Ответ №1:

Если вы хотите работать с Shadow DOM и выполнять вход в Google, вам следует поместить кнопку Google в Light DOM, чтобы быть уверенным, что она будет обнаружена скриптами Google.

 connectedCallback() {
    this.innerHTML = `<div class="g-signin2" data-onsuccess="onSignIn"></div>`
}
  

Затем, поскольку кнопка будет замаскирована теневым DOM, вам следует реализовать одно из следующих решений.

Вариант 1: Вставьте кнопку в Shadow DOM

Используйте <slot> элемент, чтобы кнопка Google отображалась в Shadow DOM.

 connectedCallback() {
    this.innerHTML = `<div class="g-signin2" data-onsuccess="onSignIn"></div>`
    this.shadowRoot.innerHTML = `Connect with Google: <slot></slot>`
}
  

Вариант 2: Нажмите на скрытую кнопку программно

Создайте свою собственную <button> в Shadow DOM и при нажатии на нее отправьте щелчок на кнопку Google.

 connectedCallback() {
    this.innerHTML = `<div class="g-signin2" data-onsuccess="onSignIn"></div>`
    this.shadowRoot.innerHTML = `<button>Connect with Google</button>`

    this.shadowRoot.querySelector( 'button' ).onclick = () => 
        this.querySelector( '.g-signin2 .abcRioButtonContentWrapper' ).click()
}
  

ПРИМЕЧАНИЕ: Возможно, вам не следует создавать новые пользовательские элементы с помощью Polymer, потому что эта библиотека больше не разрабатывается.