Интерфейс чата hubspot отсутствует на посещенной странице Turbolinks, но работает для полного обновления страницы
Я хочу интегрировать интерфейс чата hubspot в мое приложение Rails 4 + Turbolinks. Я настроил Диспетчер тегов Google для отображения интерфейса поддержки чата в каждом событии загрузки страницы, которое работает нормально.
Тег GTM (пользовательский HTML)
<!-- Start of HubSpot Embed Code -->
<script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/xxxxxx.js"></script>
<!-- End of HubSpot Embed Code -->
ПРОБЛЕМА
- Когда я обновляю страницу вручную (полное обновление страницы), появляется интерфейс клиента hubspot (окно чата).
- когда я захожу на страницу с Turbolinks, она не появляется.
Для отладки я следовал
как-д-я-знаю-если-моя-HubSpot-кода отслеживания, является работоспособной
Я могу видеть этот тег, добавленный в тело документа (DOM), проверяя элемент или проверяя его в исходной странице просмотра браузера. Также на вкладке Сеть отображается сетевой вызов, выполненный для js.hs-script.com
,
ОЖИДАЕТСЯ
- Интерфейс чата hubspot для работы с посещением страницы турболинков:
1 ответ
У меня также была эта проблема, и я решил ее, удалив все существующие сценарии Hubspot из заголовка до (повторно), включая загрузчик сценариев Hubspot. Я просто добавил следующий скрипт прямо перед добавлением загрузчика Hubspot:
<script>
// Remove Hubspot <head> scripts after a Turbolinks page load
// so it can re-initialize properly. Paste this code immediately
// before the hubspot loading script in the <body>
(function() {
var scripts, script;
// Remove scripts added by hs-scriptloader
scripts = document.querySelectorAll('script[data-loader="hs-scriptloader"]');
for (var script of scripts) {
script.remove();
}
// Remove Hubspot Analytics
script = document.getElementById('hs-analytics');
if (script != undefined) {
script.remove();
}
// Avoid duplicate chat warning and allow chat to load
window.hubspot_live_messages_running = undefined
})()
</script>
<!-- Now add the script to load Hubspot-->
<script async="" defer="defer" id="hs-script-loader" src="//js.hs-scripts.com/xxxxxxx.js" type="text/javascript"></script>
Это все еще хрупкое решение, поскольку Hubspot может изменить селекторы (загрузчик данных и т. Д.) В любое время.
Код hubspot вставляет 2 файла JS в <head>
и вводит некоторые встроенные таблицы стилей в <body>
- один из файлов js (разговор-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