Запретить Яндекс.Метрике "видеть" кое-какие внешние переходы

Joker-jar
На сайте с 26.08.2010
Offline
167
871

Доброго времени суток всем. В общем, суть в заголовке. У Я.Метрика есть отчет "Внешние переходы". Предлагаю обсудить возможности сокрытия переходов по определенным ссылкам. Не вижу, чтобы скрипт Метрики вешал какие-либо event'ы на ссылки. Попробовал вызывать метод event.stopImmediatePropagation() при клике на нужные ссылки, эффекта, вроде, не дало. Кто-нибудь ковырял?

ДП
На сайте с 23.11.2009
Offline
203
#1
Joker-jar:
Не вижу, чтобы скрипт Метрики вешал какие-либо event'ы на ссылки.

В хромовском инстпекторе во вкладке Event Listeners при выбранном элементе видно, что событие висит на document. Так что вешает. По поводу того как убрать - хз, если переходы определяются не по наличию метрики на принимающем сайте - то отправляйте юзера через редирект.

Причем можно в href прописывать нормальную ссылку для роботов, а пользователям её подменять на редиректную со своего же домена.

Joker-jar
На сайте с 26.08.2010
Offline
167
#2

По идее, если свое событие "повесить" раньше метриковского, то stopImmediatePropagation должен заглушить его. Мое событие срабатывает позже, по всей видимости (создается в $(document).ready() ). С редиректом и прочим вряд ли пройдет ввиду того, что ссылки тизерные, не хотелось бы с этим махинировать.

ДП
На сайте с 23.11.2009
Offline
203
#3

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

В принципе, это легко проверяется. через пару обработчиков с console.log - один на ссылке, второй на document - и посмотрите, в каком порядке в консоль выведутся.

Ну и как бы можно в том же хроме брейкпойнт поставить во вкладке sources -> Event Listener Breakpoints: Mouse -> Click и посмотреть в каком порядке выполняются.

Joker-jar
На сайте с 26.08.2010
Offline
167
#4

Дело в том, что я ставлю в DevTools Хрома брейкпоинт на строку e.stopImmediatePropagation(); и вижу, что мой метод отрабатывается первым, однако потом "шагаю" дальше и почему-то выполняется далее метод из watch.js. Я не пойму, почему так.

---------- Добавлено 14.10.2016 в 19:00 ----------

Хотя нет, вру. Код Метрики выполняется раньше, если ставить BP как вы написали. Я ставил непосредственно в коде js (видимо, после моего кода снова отрабатывает какой-то код Метрики). Тоже странность, почему метод document'а выполняется раньше конкретного элемента? При событии click.

Qinghua
На сайте с 01.09.2009
Offline
103
#5

При наведении курсора на ссылку - она превращается в стилизованный под ссылку текст, при клике на нём происходит редирект.

С тачскрином, понятно, так не получится.

Ну или просто вместо ссылки текст с редиректом, если её наличие не критично для других целей.

---------- Добавлено 14.10.2016 в 13:02 ----------

Ещё вариант - ссылка ведёт на внешне бизобидную внутреннюю страницу, а уже от туда происходит редирект

ДП
На сайте с 23.11.2009
Offline
203
#6
Qinghua:
При наведении курсора на ссылку - она превращается в стилизованный под ссылку текст, при клике на нём происходит редирект.
С тачскрином, понятно, так не получится.

Ну или просто вместо ссылки текст с редиректом, если её наличие не критично для других целей.

---------- Добавлено 14.10.2016 в 13:02 ----------

Ещё вариант - ссылка ведёт на внешне бизобидную внутреннюю страницу, а уже от туда происходит редирект

Насколько я понимаю, ТС не получтся менять код ссылки, пляшем оттуда.

Joker-jar, попробуйте просто stopPropagation() - судя по доке методы отличаются всё-таки.

https://developer.mozilla.org/ru/docs/Web/API/Event/stopImmediatePropagation

Останавливает цепочку вызова событий для последующих слушателей DOM элемента.

А так как событие висит на document - возможно это за другой элемент считается.

Joker-jar
На сайте с 26.08.2010
Offline
167
#7

Я ничего не понимаю в этой жизни. Уже ставлю банальный код (без jQuery) ВЫШЕ кода Метрики:

<script type="text/javascript">

document.onclick = function(event) {
event = event || window.event;
console.log(event);
}
</script>

Ставлю брейкпоинт на клик, делаю клик... Срабатывает первым событие в watch.js. Код еще запакован, сложно дебажить.

P.S. Чуток сдвинулся с точки. Оказывается, нужно использовать параметр useCapture https://developer.mozilla.org/en/DOM/element.addEventListener

document.addEventListener('click', function(event) {

event = event || window.event;
console.log(event);
}, true);

Эта конструкция срабатывает раньше Метриковской. Буду пробовать заглушить наглеца.

Joker-jar
На сайте с 26.08.2010
Offline
167
#8

В общем, окончательное решение:

document.addEventListener('click', function(event) {

event = event || window.event;
if ( event.target.className == 'класс-наших-ссылок' ) event.stopImmediatePropagation();
}, true);

Спасибо всем участвующим в беседе. И что самое любопытное, помимо решения непосредственной задачи, также резко увеличилось число кликов по этим ссылкам. Возможно, совпадение, но что-то я сомневаюсь. Есть поганое подозрение, что у посетителей какие-то еще другие левые штуки перехватывали клики по ссылкам и вели куда-то в своих интересах. На сайте тщательно настроен CSP, но возможно этим занимаются какие-то зараженные модули браузеров, которые могут обходить CSP? Судите сами. Итогом я очень доволен.

png Screenshot_20161016_205005.png

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий