2009-10-26 8 views
7

La página que intento inspeccionar tiene un elemento <input type="hidden" name="Foo" value="123 /> oculto en una página, donde Javascript/AJAX modifica el valor. Estoy tratando de encontrar dónde en la tierra en Javascript es el código que modifica este valor de vez en cuando.¿Cómo encontrar el fragmento de JavaScript que modifica un elemento?

¿Existe alguna herramienta que pueda ayudarme a encontrar los lugares en javascript que usan/modifican ese elemento? Firebug lo proporciona, de ser así, ¿cómo?

Nota: Si ha intentado buscar "Foo" en el código, pero no he encontrado ningún título que coincida. Hay JSON y Mootools cargados, + código específico de la aplicación, que da como resultado varias miles de líneas de código. El elemento es probablemente accedido indirectamente.

Respuesta

1

¿Cómo sabes que el javascript está modificando este valor? Como parece que ya sabes cuándo se llama (dado que sabes que cambia), sugeriría un punto de interrupción en Firebug en el primer evento que inicie el cambio (probablemente un atributo onclick en otro elemento).

Es un poco difícil decirles una forma "genérica" ​​de saber en qué lugar de JavaScript está cambiando el valor de Foo, ya que hay muchos enfoques diferentes, bibliotecas diferentes, cada una con su sintaxis.

Por ejemplo, si intentó buscar "Foo" y no lo encontró, la secuencia de comandos puede estar atravesando el DOM y cambiando el valor de la entrada como "primer hijo de algo". Intentaría buscar nombres o identificadores de los elementos principales de entrada y entender el código desde allí.

Normalmente trato de entender la lógica de JavaScript de cada script que uso con las técnicas de depuración de Firebug, pero solo en el script que usa las bibliotecas.

+0

+1 para la forma genérica de 'grep' la fuente para los candidatos que realizan el cambio. Con suerte, debería haber mejores formas de establecer un punto de ruptura que este, como se describe en otras respuestas. – GuruM

0

Si Firebug no le permite definir puntos de interrupción en el establecimiento de un cierto valor, podría insertar algo como esto en la página (Firefox solamente):

$("textarea")[0].__defineSetter__("value", function(val) { 
    alert("called"); 
}) 

Y, o bien punto de interrupción en la función o uso de Firebug console.log o lo que sea para volcar la pila a la consola Firebug.

Recuerdo haber visto en alguna parte una presentación sobre planes de Firebug, que incluía una sección sobre varios tipos de puntos de interrupción para ser admitidos, pero no puedo encontrar un enlace a ella ahora mismo.


[editar] Lo anterior es para el caso de que el valor se establece mediante la asignación a la propiedad value: .value = .... Si necesita detectar el momento en que se cambia un atributo (), puede usar detectores de mutación DOM.

+0

+1 para la información. ¿Puedes compartir información sobre __how__ para usar escuchas de mutación DOM? Un enlace o dos tal vez? Gracias. – GuruM

+1

@GuruM: use addEventListener con el nombre del evento DOMAttrModified, consulte https://developer.mozilla.org/en-US/docs/DOM/Mutation_events. Tenga en cuenta que los oyentes de mutación se están eliminando gradualmente a favor de un mecanismo diferente, los observadores de mutación (también se mencionan en esa página MDN) – Nickolay

+0

+1 @Nickolay. Gracias por el enlace. – GuruM

8

Firebug 1.5 tendrá "Break-on-Modify" en el panel HTML. Ver http://getfirebug.com/doc/breakpoints/demo.html#html - Romper los eventos de mutación DOM (HTML).

+0

+1 por la información. Existe una característica break-on-modify de establecer puntos de corte.Sin embargo, cuando intenté establecer un punto de interrupción así, no funcionó, es decir, no se rompió en el código que realizaba los cambios para decir que se cambiaba el título/estado de un botón. Así que no estoy seguro de lo que debe hacerse aparte de establecer el punto de interrupción. – GuruM

Cuestiones relacionadas