Pull to refresh

Comments 26

UFO just landed and posted this here
у меня весь домен jivosite.com заблочен целиком
Ctrl+Shift+I (в FF) -> Adblock Plus (вкладка) -> Show items of SCRIPT (выпадающее меню). Блокируем по очереди, нажимаем кнопку справа «Block item». Правило: ||code-jvs.jivosite.com/widget.js
UFO just landed and posted this here
Будет ли чат надоедливым или нет, зависит от того как его настроить, аналогично тому, как в одном оффлайн магазине вас может донимать продавец-консультант, а в другом магазине вы будете спокойно выбирать товар и при необходимости, сами обратитесь к нему.
Dimox уже ответил выше.

На мобильных сайтах он надоедлив всегда. Это большая, как правило мигающая кнопка поверх страницы, мешающая просмотру содержимого.
Будьте людьми, реализуйте возможность пользователю её убрать (кроме пунктов позвонить/написать — "спрятать кнопку").
А то надимаешь, посылаешь хозяев сайта в пешее эротическое и закрываешь со страницей вместе.

А главное, они это вечно-дергающую всплывашку периодически включают самовольно "в подарок" с утверждениями что она круто повышает конверсии. Только по отзывам аудитории она очень бесит, особенно на мобилках.

Попадался даже чат со звуком, который булькал во время фейкового сообщения а-ля «Чем могу помочь?». Очень весело ловить такое в полной тишине с громкими колонками.
В общем и целом да, бесит эта штука на сайтах, но за статейку kudos! Мельком пробежался, много интересного. Дома внимательнее почитаю.
да-да — очень интересует статистика живых / полезных операторов, которые таки отвечают на вопросы посетителей сайтов.
Мы не используем ботов, у нас отвечают только «живые» операторы, мы уделяем много внимания качеству обслуживания. Например измеряем среднее время ответа оператора, кол-во времени проведенное в онлайн, процент положительных оценок диалога и тд. Об этом подробнее мы расскажем в след. статье, чтобы развеять основные мифы.
Сириосли? Тогда почему ни на одном сайте ни разу мне не смогли ответить и всегда весь диалог сводится к оставьте телефон, мы перезвоним?
Скорее всего в тот момент времени операторов не было в сети и контактные данные нужны были, чтобы с вами смогли связаться позже, когда операторы появятся в сети.
UFO just landed and posted this here
Смотрите, как это работает. Мы предоставляем сервис — это чат на сайт (на самом деле гораздо больше, но сейчас мы говорим именно о чате), который можно очень гибко настраивать. Как его настраивать (какое задавать рабочее время, какие активные предложения, время на странице, после которого срабатывает активное приглашение, звуки чата и т. д.), решают наши клиенты (владельцы сайтов) самостоятельно. Если не задано время работы, чат может быть онлайн круглосуточно, но ответить вам будет некому. Главное — у нас нет ботов, в принципе нет такого инструмента, по ту сторону чата всегда живые люди. Их квалификация и способность помочь — уже ответственность каждого конкретного нашего клиента. При этом у нас есть гайдланы, рекомендации по скорости ответа на входящие сообщения, по уровню оценок и куче других параметров. Но опять же, заставить их соблюдать каждого из 270 тысяч наших клиентов мы не можем и не будем, мы можем лишь рекомендовать.
Какой нужен штат операторов, чтобы обслужить, как Вы написали выше, 1М коннектов?
1М коннектов — это то, с чем приходится иметь дело нам, как компании, предоставляющей сервис. Это число складывается из контактов на 270 тысячах сайтов (на стольких установлен наш виджет). Соответственно, число операторов каждый клиент определяет самостоятельно, в соответствии со своими возможностями и потребностями. У самых крупных наших клиентов — по несколько сотен операторов.
В коде file.js можно выбросить специальное «фейковое» исключение, обернутое в try/catch

А что, new Error().stack недостаточно?

P.S. Присоединяюсь ко всем тем, кого бесят всплывающие чатики на сайтах. Правда, не отслеживал, ваше ли это.
Принцип то же, но скорее у вас более элегантное решение, спасибо!
Я так и не понял «как правильно подключить скрипт на сторонний сайт» — на каком варианте вы остановились? А то везде минусы и баги…
Для идентификации мы используем вариант #3, для настроек подход #2, в нашей схеме это наиболее оптимально.
Спасибо за статью, как раз делаем подобную штуку. Возникает пару вопросов.

Решение

<script type='text/javascript'>
   (function(){
       var initCode = function () {
         // insert script tag
       };
       document.readyState === 'complete' ?
           initCode() :
           w.addEventListener('load', initCode, false);
   })();
</script>


Решение простое, надо подписаться на событие полной загрузки сайта и только потом загружать скрипт, для этого надо использовать код-вставки, а не тег script.


1) На случай, если ваш сервис недоступен, чтобы не ломать партнёрский сайт, у которого есть скрипты завязанные на событие 'load', вы в коде вставки инициализируете сервис/виджет после этого события.

В нашем случае — код вставки (в конце body) добавляет в head страницы тег script, который асинхронно скачивает код запуска, и после чего партнёр отдельным кодом инициализирует виджет (типа WIDGET_NAME.init() ). Так вот, а как грамотно отследить окончание скачивания кода запуска, чтобы не вызвать WIDGET_NAME раньше времени когда он ещё = undefined? Учитывая, что само событие 'load' уже наступило, т.к. мы только после него начали грузить наш код (чтоб не ломать партнёрский сайт как описано выше).

2) Второй вопрос. Вы как-то отслеживаете блоки вне основного потока документа, у которых завышенный z-index? Высчитывае ли как-то этот z-index, чтобы своему виджету присвить значение чуть больше? Или просто на угад установили кучу девяток?)

сброс стилей
может кому будет полезно, подсмотрел на докладе — сброс стилей для встаиваемых виджетов на «вражеские» сайты:

#mydiv {
  all: initial; /* blocking inheritance for all properties */
}

#mydiv * {
  all: unset; /* allowing inheritance within #mydiv */
}

#mydiv::before,
#mydiv::after,
#mydiv *::before,
#mydiv *::after {
  all: unset;
}




1) Без модификации кода инициализации никак. Например можно обернуть WIDGET_NAME.init() в функцию, которою будет вызывать ваш код, после загрузки или объявит параметры которые передаются в init в глобальную переменную из которой ваш код будет их читать после загрузки.
2) Нет, мы прописываем максимальный z-index: 2147483646
3) Мы использовали unset, но в некоторых мобильных и старых Chrome'ум браузерах это вызывает баги рендера, в итоге мы переделали на «стандартный» сброс.
Чем ошибки собираете? Что-то типа sentry или все свое?
Мы используем свое решение, потому что есть особенности связанные c SOP и CSP, в одной из следующих статей мы расскажем, как мы собираем ошибки, очень интересный опыт у нас.
Sign up to leave a comment.