На прошлой неделе мы выпустили код аналитики 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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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;
}
Может быть, таким же образом вы сможете увидеть, что он на самом деле запускает после всей этой обфускации.
Я думал, что добавлю - Omniture является, добавляющий анонимную функцию к КАЖДОЙ ссылке на странице - как J5 указал (косвенно), анонимная функция основана на вашем s_code (я выводю это, так как у меня то же самое выпуск, используя Dojo и Omniture).
По дороге домой я пришел к решению, которое позволяет самоанализе обработчиков событий на элементе, добавленном с помощью 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).
У меня лично нет опыта работы с настройкой отслеживания ссылок, иначе я бы дал вам более подробную информацию о том, как ее настроить :)
Также: OMG! Мои глаза! Обфускация кода - это шесть