Код hubspot вставляет 2 js-файла в <head>
и вставляет некоторые встроенные таблицы стилей в <body>
- один из js-файлов (messages-embed.js) создает div с идентификатором #hubspot-messages-iframe-container
. Как следует из его названия, он содержит iframe с окном чата. Он также добавляет кучу CSS к телу.
Основная проблема заключается в том, что Turbolinks заменяет все, что указано в <body>
на смену страницы, в результате чего сценарий hubspot не знает о том, что страница изменилась . Поскольку все заменено, div, введенный скриптом и css, исчезает.
Моей первой попыткой было клонировать div контейнера чата в переменную окна и использовать appendChild(clonedNode)
для элемента event.data.newBody
в событии turbolinks:before-render
. Хотя это и работает, но не очень элегантно. Он исчезает и появляется каждый раз, когда вы меняете страницу. Кроме того, состояние не переносилось, поэтому, если я закрою окно, оно будет открыто на следующей странице и т. Д.
Что делает, так это перемещает #hubspot-messages-iframe-container
из тела в сам тег html, оставляя его в стороне от турболинков. Это состояние сохраняется (открыто, закрыто и т. Д.) И не мигает и не имеет побочных эффектов. Помните, что вы должны вручную удалить его со страниц, которые вам могут не понадобиться.
Я знаю, что это немного странно, но работает, и пока у них не будет своего рода API для повторной инициализации окна чата, это обходной путь:
document.addEventListener("turbolinks:load", function() {
let targetNode = document.body
let config = { childList: true }
let callback = function() {
if (document.body.querySelector('#hubspot-messages-iframe-container')) {
document.documentElement.appendChild(
document.getElementById('hubspot-messages-iframe-container')
)
observer.disconnect()
}
}
let observer = new MutationObserver(callback)
if (!document.querySelector("html > #hubspot-messages-iframe-container")) {
observer.observe(targetNode, config)
}
})
Вам также нужно будет скопировать стиль, введенный в тело, поскольку Turbolinks также заменит его. Вот чем я закончил (преобразован в Sass):
html.hs-messages-widget-open.hs-messages-mobile
height: 100% !important
overflow: hidden !important
position: relative !important
body
height: 100% !important
overflow: hidden !important
position: relative !important
margin: 0 !important
#hubspot-messages-iframe-container
display: initial !important
z-index: 2147483647
position: fixed !important
bottom: 0 !important
right: 0 !important
&.internal
z-index: 1016
iframe
min-width: 108px
.shadow
display: initial !important
z-index: -1
position: absolute
width: 0
height: 0
bottom: 0
right: 0
content: ""
&.internal
display: none !important
&.active
width: 400px
height: 400px
background: radial-gradient(ellipse at bottom right, rgba(29, 39, 54, 0.16) 0, rgba(29, 39, 54, 0) 72%)
iframe
display: initial !important
width: 100% !important
height: 100% !important
border: none !important
position: absolute !important
bottom: 0 !important
right: 0 !important
background: transparent !important