2012-05-04 14 views
5

Estoy trabajando en un script de Greasemonkey para convertir texto en enlaces en una página a Rally. La secuencia de comandos funciona bien solo cuando recargo la página. Si navego a la página de cualquier manera (enlaces, navegador hacia adelante/atrás) el script no se ejecuta, a pesar de que el menú de Greasemonkey muestra mi script en la parte inferior, con una marca de verificación.El script de Greasemonkey solo se ejecuta cuando se carga la página

Aquí es un ejemplo de URL:

https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets 

Mi regla de coincidencia:

/^https://.*\.rallydev\.com/.*/changesets$/ 

no sé si el hash está causando un problema, pero todo está bien cuando vuelvo a cargar.

No estoy seguro de dónde ir desde aquí. Cualquier ayuda es apreciada.

+1

Si funciona en una recarga, dudo si la coincidencia sería importante ... –

+0

De acuerdo, estaba incluyendo esa información porque pensé que alguien podría preguntar. :) – neilw

Respuesta

7

Es imposible estar seguro de lo que está sucediendo, porque la (s) página (s) de destino están detrás de un muro de pagos y su supuesto mecanismo de "Prueba Gratuita" explota en pedazos.

Estas son algunas de las posibles causas de la conducta actual:

  1. La solicitud inicial sea precaria (http), pero vuelve a dirigir a una página segura (https).
  2. La carga de la primera página hace algún otro tipo de redirección a la página real.
  3. El contenido del objetivo está en un que no se carga de inmediato.
  4. El contenido del objetivo está AJAX insertado.
  5. Algo exótico que necesitaríamos para ver la página real.
  6. La URL inicial realmente no termina en changesets.

Además, entrar en el hábito de escapar de las / s en el medio de las expresiones regulares. No siempre es necesario, pero eventualmente morderá en [censurado] si no lo haces. Así que el guión debe utilizar:

// @include /^https:\/\/.*\.rallydev\.com\/.*\/changesets$/ 

para empezar, pero ver a continuación.


pasos para una solución:

  1. cambiar su @include para dar cuenta de http y la posibilidad de arrastre espacio o barra final en la URL. Uso:

    // @include /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/ 
    
  2. Examine la página con Firebug. ¿El contenido está AJAX insertado? ¿Está en un ? Si es así, ¿cuál es la URL iframe, si hay alguna?
  3. Para detectar también AJAX y/o redirecciones, use Firebug's Net panel y/o Wireshark.
  4. Si es posible, proporciónenos las credenciales de inicio de sesión para que podamos ver una página problemática.
  5. Captura una página problemática (guárdela en Firefox) y enlace a ese HTML y JS en Pastebin.com.
  6. Considere el uso de un código como:

    if (window.top != window.self) { 
        //--- Don't run on/in frames or iframes. 
        return; 
    } 
    

    Para que el script se ejecute sólo en (o no) iframes, según sea el caso.


Si el problema es causado por el retraso de AJAX (o carga de nuevos contenidos), moverse por que mediante el uso the waitForKeyElements() utility como se muestra en "Fire Greasemonkey script on AJAX request".

+1

Esto fue monumentalmente útil, muchas gracias. Era un problema de AJAX, aunque al principio me engañaron por la forma en que se configuraron los enlaces en la página. Intenté usar waitForKeyElements(), aplicando la regla a todo el dominio, y parece estar funcionando. Es un poco pesado (ojalá no tuviera que cargar jQuery), pero funciona y parece ser confiable. Gracias un paquete. – neilw

+1

De nada. Una vez pensé en crear un 'waitForKeyElements' que no requiera jQuery, pero todos menos el más simple de mis scripts usan jQuery de todos modos. No es tan pesado, especialmente porque GM lo ejecuta desde su máquina local cuando usa la directiva '@ require'. Y la increíble bondad de jQuery hace que las secuencias de comandos sean mucho más fáciles. –

+1

Muchas gracias a todos los involucrados. Estoy trabajando con el proceso de pago de Amazon y al principio no me di cuenta, pero están cargando cada "página" de AJAX y cambiando la URL a través de 'window.location.pathname'. Actualicé mi script para incluir @ cualquier página en el proceso y lo convertí fácilmente para usar 'waitForKeyElements'. Es una solución de 3 minutos a lo que hubiera sido una pesadilla de depuración masiva. –

Cuestiones relacionadas