67 votos

¿Romper cuando cambia la ubicación de la ventana?

Tengo una página que se está redirigiendo cuando no debería, y estoy tratando de averiguar quién lo está haciendo. Primero intenté secuestrar window.location:

window.location = (function (location) {
    // location is now hidden inside a closure. We can override it
    var Location = Object.create(location);
    // Location is now our proxy. We can use it to catch changes
    window.__defineGetter__('location', function () { return Location });
    window.__defineSetter__('location', function (x) { debugger; location = x; return x; });
    // etc etc, considered assignments to location.href, location.search, location.host etc., as well as calls to location.replace and location.assign
}(window.location));

Eso no funcionó en absoluto en Chrome. No puedes hacer setters y getters en window.location por razones de seguridad. BIEN Lo siguiente que intenté fue observar en la descarga y antes de la descarga:

['unload', 'beforeunload'].forEach(function (evName) {
    window.addEventListener(evName, function () {
        debugger; // Chance to check everything right before the redirect occurs
    });
});

Sabía que el valor de window.location permanecería igual hasta después del evento de descarga, de nuevo por razones de seguridad, pero esperaba alguna otra pista; no hubo tal suerte. Luego intenté poner breakpoints en cada punto que puedo encontrar en mis propios breakpoints donde la ubicación de window.location podría ser asignada. Ninguno de ellos es alcanzado de acuerdo con el depurador de Chrome. Argh. Esta redirección no está sucediendo en FF, por cierto, y ya intenté reiniciar Chrome. Siento que realmente he probado todo y no he llegado a ninguna parte, lo que con suerte significa que estoy a punto de subir de nivel como desarrollador? Por favor

¿Hay alguna forma en algún navegador para que yo, el humano que opera el depurador, rompa la línea que está redirigiendo la ubicación de la página? Entiendo que hay implicaciones de seguridad al permitir el acceso automático a esa información, pero ¿no hay nada que privilegie al desarrollador y permita una forma de hacerlo? Si no, ¿cuál es la forma normal de tratar una situación como esta? Parece bastante común y no creo que a nadie le guste que le bloqueen durante horas o días un problema conceptualmente simple. TIA

38voto

Martijn Puntos 148

La pestaña de red te ayuda, activa la casilla de verificación de preservar el registro, la columna de inicio contendrá la ubicación de javascript que causó la redirección.

0voto

Vlad Minaev Puntos 389

Puedes usar el evento onBeforeUnload. Considere el siguiente ejemplo (el manejador de eventos se vincula usando jQuery):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Testpage</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  </head>
  <body>
    <button>Change location</button>
    <script type="text/javascript">
    $('button').click(function(){
        window.setTimeout(function(){
            document.body.appendChild(document.createElement('script'))
            .appendChild(document.createTextNode(decodeURIComponent('%77%69%6e%64%6f%77%2e%6c%6f%63%61%74%69%6f%6e%2e%61%73%73%69%67%6e%28%27%68%74%74%70%3a%2f%2f%77%77%77%2e%67%6f%6f%67%6c%65%2e%63%6f%6d%27%29')));
        }, 1000);
    });

    $(window).bind('beforeunload', function(event) {
        return 'Are you sure you want to leave?';
    });
    </script>
  </body>
</html>

Coloca breakpoint en la línea 19 y presiona el botón

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X