javascript - Angular 4初始页面加载可以停用路由保护不起作用
问题描述
使用 canDeactivate 保护我试图阻止浏览器返回操作。所以,现在在我的浏览器新选项卡上加载网站 url 成功地让我进入初始页面。现在,无需在页面上进行任何用户交互,按下浏览器后退按钮即可将我带回到新的选项卡/空白页面状态,而根本无需进入保护代码。但是,如果我在按下后退按钮之前单击应用程序中的任意位置/滚动,则可以很好地触发防护。如何使防护在初始页面上没有用户交互或通过代码触发用户交互的情况下运行?
在登陆组件中,我尝试创建一个隐藏元素并尝试将注意力集中在 onInit 内部,但没有成功。
我正在延迟加载 app-routing.module.ts 中的模块
const routes: Routes = [
{
path: '',
children: [
{ path: '', redirectTo: '', pathMatch: 'full' },
{ path: 'dashboards',
loadChildren: './dashboards/dashboards.module#DashboardsModule',
canLoad: [GoBackGuard],
canDeactivate: [GoBackGuard]
}]}];
还尝试了 javascript 代码来防止浏览器返回导航,但也没有帮助。
<script>
$(window).load(function(e){
window.history.pushState(null, "", window.location.href);
window.onpopstate = function() {
window.history.pushState(null, "", window.location.href);
}
});
</script>
解决方案
将以下内容添加到您的app.component.ts
构造函数中:
history.pushState(null, null, document.URL);
window.addEventListener('popstate', function () {
history.pushState(null, null, document.URL);
});
这将阻止浏览器的后退按钮。如果您单击返回,它不会带您回到新标签或上一个标签。
推荐阅读
- spring - @ContextConfiguration 和安全链过滤器
- c# - 无法加载类型“BaseClass.aspx.cs”
- terraform - 如何在 terraform 资源中创建循环?
- angular - angular 6 service worker dataGroups 不工作
- sql - SQL - 根据列值使用不同的选择语句
- node.js - 无限循环卡夫卡消费者
- java - 如何使用 Java 获得 Ubuntu 版本?
- php - S3创建空白透明webp图像
- excel - InsertBefore方法:对象不支持此方法或excel vba中的属性错误
- c++ - DesktopDuplication API 在某些应用程序处于全屏模式时产生黑框