- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的 Angular2 应用使用 ng-bootstrap modal详细显示一些结果图表。出于这个原因,我将模态调整为几乎全屏(只剩下 margin: 20px
)。这会导致一些用户使用浏览器后退按钮而不是页面右上角或底部的关闭按钮。
我现在正在尝试的是取消默认的浏览器后退事件并在事件被调用时关闭模式。
我正在使用 here 中的一些代码作为代码库来监听浏览器事件并用一些东西扩展它:
import { PlatformLocation } from '@angular/common'
(...)
modalRef: NgbModalRef;
constructor(location: PlatformLocation) {
location.onPopState(() => {
console.log('pressed back!');
// example for a simple check if modal is opened
if(this.modalRef !== undefined)
{
console.log('modal is opened - cancel default browser event and close modal');
// TODO: cancel the default event
// close modal
this.modalRef.close();
}
else
{
console.log('modal is not opened - default browser event');
}
});
}
(...)
// some code to open the modal and store the reference to this.modalRef
问题是我不知道如何以及是否可以取消默认的返回事件。
location.onPopState((event) => {
event.preventDefault();
});
这实际上行不通。同样适用于 this solution .也许我可以在打开模式时插入一些“假”历史堆栈?!
对于 AngularJS 1.x,它似乎确实有效:https://stackoverflow.com/a/33454993/3623608
最佳答案
我实际上通过在打开模式时插入一些“假”历史状态来解决我的问题。模式打开和模式关闭的函数如下所示:
modalRef: NgbModalRef;
open(content: NgbModal) {
this.modalRef = this.modalService.open(content);
// push new state to history
history.pushState(null, null, 'modalOpened');
this.modalRef.result.then((result) => {
this.closeResult = `Closed with: ${result}`;
}, (reason) => {
this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
}
private getDismissReason(reason: any): string {
// go back in history if the modal is closed normal (ESC, backdrop click, cross click, close click)
history.back();
if (reason === ModalDismissReasons.ESC) {
return 'by pressing ESC';
} else if (reason === ModalDismissReasons.BACKDROP_CLICK) {
return 'by clicking on a backdrop';
} else {
return `with: ${reason}`;
}
}
open() 和 getDismissReason() 函数复制自 https://ng-bootstrap.github.io/#/components/modal “带有默认选项的模态”。我添加的重要部分是在模式打开时插入新的历史状态,并在“正常”模式关闭时返回历史。当我们使用浏览器后退按钮返回时,不会调用此函数,我们会自动返回历史记录。
为了确保模式在历史回溯事件中关闭,您需要以下几行:
constructor(private location: PlatformLocation, private modalService: NgbModal)
{
location.onPopState((event) => {
// ensure that modal is opened
if(this.modalRef !== undefined) {
this.modalRef.close();
}
});
结论:当模式打开时,我们推送一个新的历史状态(例如当前页面)。如果模态正常关闭(使用 ESC、关闭按钮……),则手动触发历史返回事件(我们不想堆叠历史状态)。如果历史回溯事件是由浏览器触发的,我们只需要在模式打开时关闭它。推送的历史堆栈确保我们保持在同一页面上。
局限性:添加新的历史堆栈并返回历史记录也提供了在历史记录中前进的机会(在关闭模式后)。这不是期望的行为。
关于 Angular 2 : Close ng-bootstrap modal with browser back event,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655467/
在 Firefox 扩展的 Javascript 中,您可以调用 gBrowser.getBrowserForTab但是没有gBrowser.getTabForBrowser .所以我写了自己的并且它
在问这个可能含糊不清的问题之前,我搜索了 SO,发现许多对“现代浏览器”的引用,但没有定义。由于这是一个被广泛使用和引用的术语,令我惊讶的是我在 Internet 上找不到定义甚至描述。 那么,在 2
更新:老问题仅适用于 IE11 预览版;浏览器模式在 IE11 最终版本中回归。但有一个问题:它几乎没有用,因为它不模拟条件注释。例如,如果您使用它们在旧版 IE 中启用 HTML5 支持,您将无法再
我的移动页面和短信有问题:链接。该页面主要由基于 Android 和 iOS 的智能手机通过 QR 扫描应用程序访问。 特别是在 iPhone 上,有一些带有集成浏览器的 QR 应用程序(webkit
我想使用 CustomTabsIntent。但是我没有找到androidx的customTabs路径和版本。 最后我得到了这个:androidx.browser:browser:1.0.0 我想知道正
我想将来自不同域(支付提供商)的 ssl 安全页面加载到 iframe 中。据我所知,一些(或全部?)浏览器会在页面的某些部分受到保护而其他部分不安全时警告用户。 这是真的吗? 如果是这样,如果主站点
在 Protractor 中,有 browser.pause() function : Beta (unstable) pause function for debugging webdriver t
我可以使用以下方法检索浏览器日志 browser.manage().logs().get('browser').then(function(browserLog) { logger.info('
当使用 protractor 时,全局变量 browser 似乎具有 browser.driver 的所有功能。 我特地问这个是因为我不确定是使用 browser.wait 还是 browser.dr
面对 Protractor 的计时问题。有时我的 Protractor 测试用例会因网络或性能问题而失败。我已经解决了 browser.sleep() 的现有问题。后来知道了browser.wait(
我仍然无法找到解决此问题的方法。我们有一个启动浏览器窗口的应用程序,但我们使用的底层第三方插件尚不支持 IE9。我知道我可以通过点击 F12 并选择它来切换到 IE8 的浏览器模式。 有没有办法在命令
在 Protractor 脚本中,我总是遇到超时问题,即使我设置了很大的 time out jasmine interval、allscripttimeout...在某些地方,我不得不等到元素出现,比
我正在运行一个 Angular 应用程序,并且在 Protractor 上测试时尝试获取当前 URL。使用哪一个? browser.driver.getCurrentUrl() 或 browser.g
“所有浏览器兼容”和“跨浏览器兼容”有什么区别? “交叉”是什么意思,是指不同的操作系统吗? 如果任何网站在 IE 7、8 FF 3+、Safari 3+ 的桌面版本上运行良好,我们可以说它是跨浏
不明白浏览器同步中的错误阅读文档,其中 gulp 4 真的没有写任何关于它的内容。在 gulp 4 的文档中也没有理解(异步)。如何解决这个问题。谢谢。 bla bla bla bla bla bla
我正在尝试在 ASP.Net C# 代码隐藏中执行“如果浏览器是 IE 且版本低于 9”。 但是,在 chrome 中,以下行: if (Request.Browser.Browser == "IE"
我第一次玩 watir,使用 this site作为指导。我在一个简单的程序(如下)中遇到错误 - 它在第一个非要求行失败,如图所示。 如果我没有运行下面显示的内容,而是删除了该行,它会打开一个空的
下面的 if 条件我认为它是说 - 如果浏览器是 IE 并且 IE 浏览器版本高于 9,但我没有 IE 9 来测试它,所以很难知道正确的输出,这也是不是 100% 的我想要的 bcos 默认情况下该脚
我通过 Pingdom 测试了我的网站并得到了这个: 我进行了搜索,但找不到解决方案。有谁知道我怎样才能得到这个14到100? 最佳答案 不是一个完整的解决方案,但您可以通过将两个请求合并为一个来改善
是否可以禁用浏览器/窗口之间的 HTML5 拖放功能? 我正在使用具有 native HTML5 拖放功能的 Angular2 应用程序,并希望防止用户将其拖动到浏览器窗口之外并防止将可拖动对象拖放到
我是一名优秀的程序员,十分优秀!