66 votes

Arrêter lorsque window.location change?

J'ai une page de redirection quand il ne devrait pas être, et je suis à essayer de comprendre qui fait ça. J'ai d'abord essayé le détournement de la fenêtre.emplacement:

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

Qui ne travaillent pas du tout dans le navigateur Chrome. Vous ne pouvez pas faire les setters et getters sur la fenêtre.emplacement pour des raisons de sécurité. OK. La prochaine chose que j'ai essayé était l'observation onunload et onbeforeunload:

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

Je savais que la valeur de la fenêtre.emplacement de rester le même jusqu'à ce que, après l'événement onunload, encore une fois pour des raisons de sécurité, mais je m'attendais à quelque autre indice, pas de chance. Ensuite, j'ai essayé de mettre des points d'arrêt à chaque point de je peux trouver dans mes propres scripts où la fenêtre.l'emplacement pourrait être affecté. Aucun d'entre eux sont touchés selon le Chrome débogueur. Argh. Cette redirection ne se fait pas dans FF, par le chemin, et j'ai déjà essayé de redémarrer Chrome. Je sens que j'ai vraiment tout essayé et obtenu de nulle part, qui nous l'espérons signifie que je suis sur le point de monter de niveau en tant que développeur? S'il vous plaît?

Est-il de toute façon dans n'importe quel navigateur pour moi, l'humain d'exploitation le débogueur, à la pause sur la ligne de rediriger l'emplacement de la page? Je comprends qu'il ya des implications en matière de sécurité pour permettre un accès automatique à l'information, mais il n'y a rien qui privilégie le développeur et permet à un moyen de le faire? Si non, quelle est la façon normale de faire face à une situation de ce genre? Il semble assez répandue, et je ne pense pas que quiconque aime est bloqué pendant des heures ou des jours sur un concept simple problème. TIA

35voto

Martijn Points 148

L'onglet Réseau vous aide, cochez la case Conserver le journal, la colonne de l'initiateur contient l'emplacement javascript qui a provoqué la redirection.

0voto

Vlad Minaev Points 389

Vous pouvez utiliser l'événement onBeforeUnload. Prenons l'exemple suivant (le gestionnaire d'événements est lié à l'aide de 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>
 

Placez le point d'arrêt à la ligne 19 et appuyez sur le bouton

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X