Получить справку о прослушивании событий в JavaScript - PullRequest
7 голосов
/ 06 октября 2008

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 06 октября 2008

Я сделал «элемент проверки» для ссылки на этой странице с помощью 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;
}

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

1 голос
/ 06 октября 2008

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

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

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

0 голосов
/ 07 октября 2008

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

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

0 голосов
/ 06 октября 2008

Путешествуя домой, я пришел к решению, которое позволяет самоанализировать обработчики событий для элемента, добавленного с помощью 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);
  }
})();
0 голосов
/ 06 октября 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...