web-dev-qa-db-de.com

So deaktivieren Sie die Browser-Zurück-Schaltfläche in Angular 2

Ich entwickle eine Website mit Angular 2 . Gibt es eine Möglichkeit, die Browser-Zurück-Schaltfläche mit Angular 2 zu deaktivieren oder auszulösen? 

Vielen Dank

7
DAN

Sie sind sich nicht sicher, ob dies bereits sortiert ist, aber die Antwort trotzdem für zukünftige Referenzen bereitstellt. Um dies zu bewältigen, müssen Sie im Grunde einen Listener in Ihrer App-Komponente hinzufügen und ein canDeactivate guard auf Ihrem angle- Router.

// in app.component.ts
import { LocationStrategy } from '@angular/common';

@Component({
  selector: 'app-root'
})
export class AppComponent {
  constructor(
    private location: LocationStrategy
  ) {
    // check if back or forward button is pressed.
    this.location.onPopState(() => {
      // set isBackButtonClicked to true.
      this.someNavigationService.setBackClicked(true);
      return false;
    });
  }
}

// in navigation guard
@Injectable()
export class NavigationGuard implements CanDeactivate<any> {
  constructor(private someNavigationService: SomeNavigationService) {}
  canDeactivate(component: any) {
    // will prevent user from going back
    if (this.someNavigationService.getBackClicked()) {
      this.someNavigationService.setBackClicked(false);
      // Push current state again to prevent further attempts.
      history.pushState(null, null, location.href);
      return false;
    }
    return true;
  }
}

8
Jithin Nair

Verwenden Sie dazu ganz einfach den folgenden Code. Dieser Beispielcode stammt aus einfachem Javascript. Ich habe diesen in angular und in meinen 2-3 Projekten verwendet

// Inject LocationStrategy Service into your component
    constructor(
        private locationStrategy: LocationStrategy
      ) { }


// Define a function to handle back button and use anywhere
    preventBackButton() {
        history.pushState(null, null, location.href);
        this.locationStrategy.onPopState(() => {
          history.pushState(null, null, location.href);
        })
      }

Sie können preventBackButton auch in jedem Dienst definieren und von dort aus aufrufen

3
Nishant Singh
import { LocationStrategy } from '@angular/common';
constructor( private location: LocationStrategy){  
// preventing back button in browser implemented by "Samba Siva"  
 history.pushState(null, null, window.location.href);  
this.location.onPopState(() => {
  history.pushState(null, null, window.location.href);
});  
}

es funktioniert gut für mich 100% in Angular2/4/5

1

Dies ist kein Angular2-Problem. Sie können den Benutzer im Verlauf zurückschicken. Siehe Browserverlauf ändern , history.go() -Methode insbesondere:

window.history.go(-1);

Ich glaube jedoch nicht, dass es eine Möglichkeit gibt, die Standard-Browseraktion beim Drücken der Zurück-Taste im Browserfenster zu deaktivieren oder zu deaktivieren, da dies sehr leicht missbraucht werden kann.

Als Alternative können Sie ein Dialogfenster anzeigen, wenn der Benutzer versucht, die Seite zu verlassen: Javascript vor dem Verlassen der Seite

1
martin

Ein bisschen spät, aber vielleicht kann es jemand verwenden ... Dies ist eine Lösung, die ich für eine Seite mit Registerkarten (Bootstrap 4-Stil) verwende, bei der jede Registerkarte eine Komponente ist. 

    @Injectable()
    export class CanNavigateService {

      private static _isPermissionGranted = true
      public navigationAttempt = new Subject<boolean>()

      //-------------------------------------------------------------//

      /**Will the next navigation attempt be permitted? */
      updatePermission(isPermissionGranted: boolean) {   
        CanNavigateService._isPermissionGranted = isPermissionGranted
      }//updatePermission

      //-------------------------------------------------------------//

      /**Broadcast the last attempt and whether it was permitted */
      updateNavigationAttempt(wasPermissionGranted: boolean) {    
        this.navigationAttempt.next(wasPermissionGranted)
      }//updatePermission

      //-------------------------------------------------------------//

      /**Can we navigate? */
      public isPermissionGranted(): boolean {
        return CanNavigateService._isPermissionGranted
      }//isPermissionGranted

    }//Cls

NavigationGuard wie @Jithin Nair oben, sendet aber auch, wann ein Navigationsversuch gemacht wurde und ob dies erlaubt ist. Abonnenten von CanNavigateService können damit entscheiden, was statt der Rückwärtsnavigation zu tun ist.

@Injectable()
export class NavigationGuard implements CanDeactivate<any> {

constructor(private canNavigateService: CanNavigateService) { }

//--------------------------------------------------------------------//

// will prevent user from going back if permission has not been granted
canDeactivate(component: any) {

    let permitted = this.canNavigateService.isPermissionGranted()
    this.canNavigateService.updateNavigationAttempt(permitted)        

    if (!permitted) {
        // Push current state again to prevent further attempts.
        history.pushState(null, null, location.href)
        return false
    }

    return true

}//canDeactivate

}//Cls

Verwendungszweck: 

constructor(private _navigateService: CanNavigateService) {
    super()

    _navigateService.navigationAttempt.subscribe(wasPermitted => {
        //If navigation was prevented then just go to first tab
        if (!wasPermitted)
           this.onTabSelected( this._firstTab)            
    })
}//ctor

//----------------------------------------------------------------------------//

onTabSelected(tab) {

    this._selectedTab = tab
    //If it's not the first tab you can't back navigate
    this._navigateService.updatePermission(this._selectedTab == this._firstTab)
}//onTabSelected
0
Shanie

Dieses Problem tritt im Browser IE auf. Verwenden Sie den unten angegebenen Code, um das Problem zu beheben.


        @HostListener('document:keydown', ['$event'])
          onKeyDown(evt: KeyboardEvent) {
            if (
                evt.keyCode === 8 || evt.which === 8
            ) {
              let doPrevent = true;
              const types =['text','password','file','search','email','number','date','color','datetime','datetime-local','month','range','search','tel','time','url','week'];
              const target = (<HTMLInputElement>evt.target);

          const disabled = target.disabled || (<HTMLInputElement>event.target).readOnly;
          if (!disabled) {
            if (target.isContentEditable) {
              doPrevent = false;
            } else if (target.nodeName === 'INPUT') {
              let type = target.type;
              if (type) {
                type = type.toLowerCase();
              }
              if (types.indexOf(type) > -1) {
                doPrevent = false;
              }
            } else if (target.nodeName === 'TEXTAREA') {
              doPrevent = false;
            }
          }


        if (doPrevent) {
            evt.preventDefault();
            return false;
          }

        }
    }

0
Vijay Gawade

Wenn Sie verhindern möchten, dass eine Route erreicht wird, können Sie den @CanActivate () decorator Ihrer Routingkomponente hinzufügen

@Component({selector: 'control-panel-cmp', template: `<div>Settings: ...</div>`})
@CanActivate(checkIfWeHavePermission)
class ControlPanelCmp {
}

Siehe auch
- Angular 2: Injizieren Sie eine Abhängigkeit in @CanActivate? für den Zugang zu globalen Diensten.
- Angular2 Router - Jeder kann canActivate in app.ts verwenden, damit ich zur Startseite umleiten kann, wenn er nicht angemeldet ist

0

Versuche dies

<script type = "text/javascript" >
history.pushState(null, null, 'pagename');
window.addEventListener('popstate', function(event) {
history.pushState(null, null, 'pagename');
});
</script>

dort ändern Sie "Seitenname" in Ihren Seitennamen und geben diesen in den Kopfbereich der Seite ein.

0
Vishal Rajole