Получите указатель на прослушивание событий в JavaScript

На прошлой неделе мы выпустили код аналитики Omniture для большого количества веб-сайтов после того, как на прошлой неделе или около того поработали и протестировали.

Почти на всех наших шаблонах сайтов он отлично работает. В нескольких случайных непредсказуемых ситуациях есть утомительный, сбой в работе браузера, что май отворачивает некоторых пользователей.

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

Сайты вылетают при нажатии любой привязки в этих шаблонах. Здесь нет встроенного JS, и пока мы пробирались через атрибуты HTML, мы не смогли найти заметного цикла или проблемы, которые могли бы вызвать это. (пока мы устраняем неполадки, вы можете сами убедиться в этом здесь [предупреждение! щелчок по любой ссылке на странице приведет к сбою вашего браузера!])

Как определить, есть у объекта слушатель или нет? Как определить, что сработает при срабатывании события?

FYI, I'd love to set breakpoints, but between Omnitures miserably obfuscated code and repeated browser crashes, I'd like to research more thoroughly how I can approach this.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
0
3 747
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Единственная ситуация, в которой можно идентифицировать слушателя, - это когда он был добавлен путем установки свойства или атрибута в элементе - проверьте свойство или атрибут onxxx.

Недавно в группе WebAPI на W3 был разговор о том, следует ли добавлять эту функциональность. Специалисты вроде как против. Разделяю их аргументы.

Набор рекомендаций разработчикам страничной аналитики:

  • Используйте только захват событий на уровне документа, этого достаточно почти в каждом случае (кроме событий изменения / отправки).

  • Не выполняйте код с интенсивными вычислениями (а также любые операции ввода-вывода) в обработчиках, лучше отложите выполнение с таймаутом

Если принять во внимание эти два простых правила, я уверен, что ваш браузер выживет.

Ответ принят как подходящий

Я сделал «проверить элемент» по ссылке на этой странице с помощью firebug, и на вкладке DOM говорится, что есть функция onclick (анонимная), а также другая функция, называемая «s_onclick_0».

Я уговорил firebug поставить часы вроде

alert(document.links[0].onclick)

чтобы предупредить меня о функции onclick, которую omniture (я полагаю) прикрепляет к ссылкам:

function anonymous(e) {
  var s = s_c_il[0], b = s.eh(this, "onclick");
  s.lnk = s.co(this);
  s.t();
  s.lnk = 0;
  if (b) {
     return this[b](e);
  }
  return true;
}

Может быть, таким же образом вы сможете увидеть, что он на самом деле запускает после всей этой обфускации.

Также: OMG! Мои глаза! Обфускация кода - это шесть

Victor 06.10.2008 20:57

Я думал, что добавлю - Omniture является, добавляющий анонимную функцию к КАЖДОЙ ссылке на странице - как J5 указал (косвенно), анонимная функция основана на вашем s_code (я выводю это, так как у меня то же самое выпуск, используя Dojo и Omniture).

keif 08.07.2009 19:17

По дороге домой я пришел к решению, которое позволяет самоанализе обработчиков событий на элементе, добавленном с помощью AddEventListener. Запустите код перед включением кода аналитики. Код не проверял, работает ли, но идея, я думаю, понятна. Это не будет работать в IE, однако вы можете применить аналогичный прием (переписать член API) и там.

(function(){
  var fAddEventListener = HTMLElement.prototype.addEventListener;
  HTMLElement.prototype.addEventListener = function() {
   if (!this._listeners)
      this._listeners = [];
   this._listeners.push(arguments);
   fAddEventListener.apply(this, arguments);
  }
})();

У меня есть некоторый опыт работы с Omniture, и, глядя на ваш s_code.js, у вас есть несколько вещей, которые происходят в области «Отслеживание ссылок», например:


/* Link Tracking Config */
s.trackDownloadLinks=true
s.trackExternalLinks=true
s.trackInlineStats=true
s.linkDownloadFileTypes = "exe,zip,wav,mp3,mov,mpg,avi,wmv,pdf,doc,docx,xls,xlsx,ppt,pptx"
s.linkInternalFilters = "javascript:,gatehousemedia.com"
s.linkLeaveQueryString=false
s.linkTrackVars = "None"
s.linkTrackEvents = "None"

Я бы посоветовался с людьми в Omniture и проверил, правильно ли настроена ваша конфигурация отслеживания ссылок.

В частности, этот шаблон и ссылки внутри, по-видимому, принадлежат morningsun.net, и все же morningsun.net не находится в настройке s.linkInternalFilters. Если вы используете один и тот же файл s_code.js для нескольких доменов, вы можете использовать javascript для установки значений конфигурации для таких вещей (например, на основе document.location.hostname).

У меня лично нет опыта работы с настройкой отслеживания ссылок, иначе я бы дал вам более подробную информацию о том, как ее настроить :)

Другие вопросы по теме