2008-10-06 8 views
7

La semana pasada lanzamos el código de análisis de Omniture en un gran volumen de sitios web después de retocar y probar durante la última semana más o menos.Obtenga información sobre la escucha de eventos en JavaScript

En casi todas nuestras plantillas de sitio, funciona muy bien. En algunas situaciones dispersas e impredecibles, existe una experiencia agobiante , que bloquea el navegador que puede rechazar algunos usuarios.

que no somos capaces de ver una relación entre las plantillas de estrellarse en este momento, y si bien no son muchas maneras de solucionar, el que está confuddling nos está relacionada con los detectores de eventos.

Los sitios se bloquean cuando se hace clic en cualquier delimitador de estas plantillas. No hay ningún JS en línea, y mientras nos abrimos paso a través de los atributos del HTML, no pudimos encontrar un bucle discernible o problema que pudiera causar esto. (Mientras que a solucionar, puede experimentar esto por sí mismo here [advertencia! Clic en cualquier enlace en la página hará que el navegador se cuelgue!])

¿Cómo se determina si un objeto tiene un oyente o no? ¿Cómo se determina qué se disparará cuando se desencadene el evento?

FYI, me gustaría establecer puntos de interrupción, pero entre Omnitures código ofuscado miserablemente y el navegador repetida accidentes, me gustaría investigar más a fondo cómo puedo abordar este.

Respuesta

4

Hice un "elemento de inspección" en un enlace en esa página con Firebug, y en la pestaña DOM dice que hay una función onclick (anónima), y también alguna otra función llamada "s_onclick_0".

I engatusado quemador, colocando un reloj como

alert(document.links[0].onclick) 

me alertar a la función onclick que Omniture (supongo) se une a los enlaces:

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

Tal vez de la misma forma que pueda ver lo realmente se está ejecutando después de toda esa ofuscación.

+1

también: OMG! ¡Mis ojos! Ofuscación de código es sux – Victor

+0

Pensé que agregaría - Omniture * está * agregando una función anónima a CADA enlace en una página - como J5 señaló (indirectamente) que la función anónima está basada en tu s_code (estoy deduciendo esto , ya que estoy teniendo el mismo problema, usando Dojo y Omniture). – keif

1

DOM no proporciona ningún medio para introspección a través de las colecciones de escuchas de eventos asociadas a un nodo.

La única situación en la que se puede identificar al oyente es cuando se agregó mediante la configuración de una propiedad o un atributo en el elemento - verificar onxxx property o attribute.

Recientemente se ha hablado en el grupo WebAPI en W3 sobre si añadir esta funcionalidad. Los especialistas parecen estar en contra de eso. Yo comparto sus argumentos.

0

una serie de recomendaciones a los ejecutores de análisis on-page:

  • Uso de eventos de nivel de documento de captura única, esto es, en casi todos los casos (aparte/cambio de enviar eventos) suficiente

  • no ejecutar código de computación intensiva (así como cualquier operación IO) en los manipuladores, en lugar posponer la ejecución con un tiempo de espera

Si esto t Se tienen en cuenta dos reglas simples, apuesto a que su navegador sobrevivirá

0

Mientras viajaba a casa llegué a una solución que permite la introspección de los controladores de eventos en el elemento agregado con AddEventListener. Ejecute el código antes de la inclusión de su código de análisis. El código no fue verificado si funciona, pero la idea, creo que es clara. No funcionará en IE, sin embargo, puede aplicar una técnica similar (de reescribir el miembro de la API) allí también.

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

tengo algo de experiencia con Omniture y mirando a sus s_code.js, tiene varias cosas que suceden en la zona de "seguimiento de vínculos", por ejemplo:


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

Me gustaría consultar con el personas en Omniture y verifican que la configuración de seguimiento de enlaces esté configurada correctamente.

En concreto, esta plantilla y los enlaces en su interior parecen pertenecer a morningsun.net y, sin embargo, morningsun.net no se encuentra en la configuración s.linkInternalFilters. Si está utilizando el mismo archivo s_code.js para múltiples dominios, puede usar javascript para establecer los valores de configuración para cosas como esta (basándose en el documento.location.hostname por ejemplo).

Yo personalmente no tienen experiencia con la configuración de seguimiento de vínculos o yo le daría más detalles sobre cómo configurarlo :)

Cuestiones relacionadas