2008-10-06 10 views
7

Letzte Woche veröffentlichten wir Omnitures Analytics-Code auf einer großen Anzahl von Websites, nachdem sie in der letzten Woche herumgebastelt und getestet wurden.Erfahren Sie mehr über das Hören von Ereignissen in JavaScript

Auf fast allen unserer Website-Vorlagen funktioniert es gut. In einigen verstreuten, unvorhersehbaren Situationen gibt es eine lähmende, Browser-Absturzerfahrung, die kann einige Benutzer abwenden.

Wir können zu diesem Zeitpunkt keine Beziehung zwischen den abstürzenden Vorlagen sehen, und während viele Möglichkeiten zur Fehlersuche gibt, bezieht sich der, der uns verwirrt, auf Ereignis-Listener.

Die Websites stürzen ab, wenn auf diese Vorlagen geklickt wird. Es gibt keine Inline-JS, und während wir uns durch die HTML-Attribute kämpfen, konnten wir keine erkennbare Schleife oder ein Problem finden, das dies verursachen würde. (Während wir zu beheben, können Sie diese Erfahrung für sich selbst here [ Warnung! Beliebigen Link auf der Seite klicken, wird Ihr Browser zum Absturz zu bringen!])

Wie bestimmen Sie, ob ein Objekt einen Listener hat oder nicht? Wie bestimmen Sie, was ausgelöst wird, wenn ein Ereignis ausgelöst wird?

FYI, ich würde gerne Breakpoints setzen, aber zwischen Omnitures kläglich verschleierten Code und wiederholt Browser Abstürzen, würde Ich mag mehr erforschen gründlich, wie ich das erreichen kann.

Antwort

4

Ich habe ein "inspect-Element" auf einen Link auf dieser Seite mit Firebug, und in der Registerkarte DOM sagt es gibt es eine onclick-Funktion (anonym), und auch eine andere Funktion namens "s_onclick_0".

ich schmeichelte firebug eine Uhr wie

Platzierung
alert(document.links[0].onclick) 

mir die Onclick-Funktion zu warnen, dass (i guess) legt auf Links 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; 
} 

auf die gleiche Art und Weise Vielleicht können Sie sehen, was es läuft wirklich nach all dieser Verschleierung.

+1

auch: OMG! Meine Augen! Code-Verschleierung ist der sux – Victor

+0

Ich dachte, ich würde hinzufügen - Omniture * ist * Hinzufügen einer anonymen Funktion zu jedem Link auf einer Seite - wie J5 wies darauf hin, (indirekt) die anonyme Funktion basiert auf Ihrem s_code (ich folge daraus , da ich das gleiche Problem habe, mit Dojo und Omniture). – keif

1

DOM bietet keine Möglichkeit, über die Auflistungen der Ereignislistener, die mit einem Knoten verknüpft sind, nachzusehen.

Die einzige Situation, in der der Listener identifiziert werden kann, ist, wenn er durch Festlegen einer Eigenschaft oder eines Attributs für das Element hinzugefügt wurde - prüfen Sie die Eigenschaft oder das Attribut onxxx.

Es wurde kürzlich in der WebAPI-Gruppe bei W3 darüber gesprochen, ob diese Funktionalität hinzugefügt werden soll. Spezialisten scheinen dagegen zu sein. Ich teile ihre Argumente.

0

Eine Reihe von Empfehlungen an die Implementierer von On-Page-Analyse:

  • Verwenden Dokumentebene Veranstaltung nur die Erfassung, das ist in fast allen Fällen (außer Änderung/einreichen Ereignisse) ausreichend

  • Sie rechenintensive Code (sowie alle IO-Operationen) in den Handler nicht ausgeführt, sondern die Ausführung mit einem

Timeout verschieben Wenn dies t Wo einfache Regeln berücksichtigt werden, wette ich, Ihr Browser wird überleben

0

Während ich nach Hause kam, kam ich zu einer Lösung, die es erlaubt, Event-Handler auf dem mit AddEventListener hinzugefügten Element zu inspizieren. Führen Sie den Code vor der Aufnahme Ihres Analytics-Codes aus. Der Code wurde nicht verifiziert, wenn funktioniert, aber die Idee, denke ich, ist klar. Es funktioniert nicht in IE, aber Sie können auch eine ähnliche Technik anwenden (um das API-Mitglied neu zu schreiben).

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

Ich habe einige Erfahrung mit Omniture und in Ihrem s_code.js suchen, haben Sie mehrere Dinge, die sich in der „Link-Tracking“ Bereich, zum Beispiel:


/* 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" 

ich mit der konsultieren Personen bei Omniture und vergewissern Sie sich, dass Ihre Link-Tracking-Konfiguration korrekt eingerichtet ist.

Insbesondere scheinen diese Vorlage und die Links im Inneren zu morningsun.net gehören und doch morningsun.net ist nicht in der s.linkInternalFilters Einstellung. Wenn Sie dieselbe s_code.js-Datei für mehrere Domänen verwenden, können Sie mit javascript die Konfigurationswerte für solche Dinge festlegen (z. B. basierend auf document.location.hostname).

Ich habe nicht persönlich Erfahrung mit der Konfiguration Link-Tracking oder ich würde Ihnen mehr Details geben, wie sie konfigurieren :)

Verwandte Themen