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

StackOverflow https://stackoverflow.com/questions/174891

Вопрос

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

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

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

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

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

К вашему сведению, я бы с удовольствием установил контрольные точки, но между Omnitures с треском обфусцированный код и повторил браузер сбои, Я хотел бы исследовать более тщательно как я могу подойти к этому.

Это было полезно?

Решение

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

Я уговорил клопа поставить часы как

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;
}

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

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

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

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

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

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

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

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

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

У меня есть некоторый опыт работы с 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).

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

По дороге домой я пришел к решению, которое позволяет самоанализировать обработчики событий для элемента, добавленного с помощью 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);
  }
})();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top