2013-04-04 15 views
69

Czy można wykryć, że użytkownik wszedł na stronę za pomocą przycisku wstecz w swojej przeglądarce? Najlepiej chcę wykryć tę akcję przy użyciu pliku angular.js.Jak wykrywać zdarzenie click click w przeglądarce za pomocą kątowego?

Nie chcę używać trasowania kątowego. Powinno to również działać, jeśli użytkownik przesyła formularz, a po pomyślnym przesłaniu go na serwer i ponownym przekierowaniu, powinno to być również możliwe, jeśli użytkownik powróci do formularza za pomocą przycisku Wstecz w przeglądarce.

Odpowiedz

108

Oto rozwiązanie z Angular.

myApp.run(function($rootScope, $route, $location){ 
    //Bind the `$locationChangeSuccess` event on the rootScope, so that we dont need to 
    //bind in induvidual controllers. 

    $rootScope.$on('$locationChangeSuccess', function() { 
     $rootScope.actualLocation = $location.path(); 
    });   

    $rootScope.$watch(function() {return $location.path()}, function (newLocation, oldLocation) { 
     if($rootScope.actualLocation === newLocation) { 
      alert('Why did you use history back?'); 
     } 
    }); 
}); 

Używam bloków do uruchomienia tego. Najpierw przechowuję rzeczywistą lokalizację w $ rootScope.actualLocation, a następnie słucham $ locationChangeSuccess, a kiedy to się dzieje, aktualizuję actualLocation z nową wartością.

W $ rootScope obserwuję zmiany w ścieżce lokalizacji i jeśli nowa lokalizacja jest równa priorLocation, ponieważ $ locationChangeSuccess nie została uruchomiona, co oznacza, że ​​użytkownik ponownie użył historii.

+1

Dzięki! Wygląda świetnie. Muszę to szczegółowo sprawdzić jutro. W szczególności muszę sprawdzić, czy lokalizacja $ rootScope.actualLocation jest również aktualizowana, jeśli lokalizacja zostanie zmieniona bez użycia tras kątowych, ale "normalnych" hiperłączy. Czy myślisz, że będzie działać również przy użyciu normalnych hiperłączy? –

+1

Co masz na myśli przez "" normalne "hiperlinki? – Bema

+4

ah tak. nigdy wcześniej nie używał tras kątowych, więc patrząc na twój przykład wydaje się, że nie ma normalnych i nie normalnych (kątowych) typów hiperłączy. więc po prostu zapomnij o moim komentarzu .. –

0

JavaScript ma obiekt historii natywnej.

window.history 

Sprawdź MDN, aby uzyskać więcej informacji; https://developer.mozilla.org/en-US/docs/DOM/window.history?redirectlocale=en-US&redirectslug=window.history

Nie jestem pewien, czy dobrze działa na wielu przeglądarkach.

Aktualizacja

Wydaje co ja o nazwie powyżej jest tylko dla przeglądarek Gecko typu.

W przypadku innych przeglądarek spróbuj użyć history.js; https://github.com/browserstate/history.js

+0

Dzięki za komentarz. Jako że wolę sposób, żeby to zrobić w kanciastym, dam Bertrandowi odpowiedź. –

-7

po naciśnięciu przycisku wstecz, kątowe pożary tylko $ routeChangeStart wydarzenie, $ locationChangeStart nie wypalił.

9

Jeśli chcesz bardziej precyzyjne rozwiązanie (z wykryciem tyłu i do przodu) I rozszerzony rozwiązania dostarczane przez Bertrand:

$rootScope.$on('$locationChangeSuccess', function() { 
    $rootScope.actualLocation = $location.path(); 
}); 


$rootScope.$watch(function() {return $location.path()}, function (newLocation, oldLocation) { 

    //true only for onPopState 
    if($rootScope.actualLocation === newLocation) { 

     var back, 
      historyState = $window.history.state; 

     back = !!(historyState && historyState.position <= $rootScope.stackPosition); 

     if (back) { 
      //back button 
      $rootScope.stackPosition--; 
     } else { 
      //forward button 
      $rootScope.stackPosition++; 
     } 

    } else { 
     //normal-way change of page (via link click) 

     if ($route.current) { 

      $window.history.replaceState({ 
       position: $rootScope.stackPosition 
      }); 

      $rootScope.stackPosition++; 

     } 

    } 

}); 
0

wiem, że to jest stary pytanie. Anyways :)

Odpowiedź Bema wygląda świetnie. Jednakże, jeśli chcesz, aby pracować z „normalnych” adresów URL (bez hash chyba), można porównać ścieżki bezwzględnej, zamiast jednej zwróconej przez $location.path():

myApp.run(function($rootScope, $route, $location){ 
//Bind the `$locationChangeSuccess` event on the rootScope, so that we dont need to 
//bind in induvidual controllers. 

    $rootScope.$on('$locationChangeSuccess', function() { 
     $rootScope.actualLocation = $location.absUrl(); 
    });  

    $rootScope.$watch(function() {return $location.absUrl()}, function (newLocation, oldLocation) { 
     if($rootScope.actualLocation === newLocation) { 
      alert('Why did you use history back?'); 
     } 
    }); 
}); 
-2

My solutio tego problemu jest

app.run(function($rootScope, $location) { 
    $rootScope.$on('$locationChangeSuccess', function() { 
     if($rootScope.previousLocation == $location.path()) { 
      console.log("Back Button Pressed"); 
     } 
     $rootScope.previousLocation = $rootScope.actualLocation; 
     $rootScope.actualLocation = $location.path(); 
    }); 
}); 
5

Do rutowania ui używam poniższego kodu.

Wewnątrz App.run() użyć

$rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) 
{ 

    if (toState.name === $rootScope.previousState) 
     { 
      // u can any 1 or all of below 3 statements 
     event.preventDefault(); // to Disable the event 
     $state.go('someDefaultState'); //As some popular banking sites are using 
     alert("Back button Clicked"); 

     } 
else 
     $rootScope.previousState= fromState.name; 
    }); 

można uzyskać wartość „” w przypadku previousState „$” stateChangeSuccess jak również następująco `jeśli chcesz.

$rootScope.$on("$stateChangeSuccess", function (event, toState, toParams, fromState, fromParams) 
    { 

     $rootScope.previousStatus = fromState.name; 
    }); 
+0

Dokładnie tego, czego szukałem.Dzięki bardzo, –

+0

To nie wykrywa kliknięć przycisku wstecznego - to po prostu wykrywa, czy użytkownik jest przełączanie między dwoma nazwami stanów - ei za pomocą przycisku Wstecz lub klikając między dwiema stronami. Również to nie patrzy na paramy stanu. –

Powiązane problemy