Sha*_*ank 5 javascript iframe sanitization typescript angular
我有一个Angular应用程序.以下是要遵循的步骤:
客户通过流程并登陆其中一个部分页面.
从部分页面之一,我单击一个按钮从跨域获取ID(通过服务调用完成,因此没有CORS问题).
使用此ID,我追加跨域url - 类似于http://externalpahe.com?responseId=ID
此URL在Iframe内执行子组件.
在这个Iframe跨域的页面中,有两个按钮 - " 保存 "和" 取消 "
单击任何这些按钮,应用程序将导航回来.
问题:成功返回导航后,点击Chrome浏览器的后退按钮,应用程序将重新加载.
因此,应用程序的流程再次重新启动,并且客户需要再次完成流程.虽然数据得到更新,但在返回到部分页面时,之前已执行过操作,但这不是一个易于使用的好方案.
我正在利用以下代码在iframe中执行跨域的url.我怀疑DomSanitizer是否会导致Chrome的奇怪问题.对于其他浏览器,它工作正常.
角度成分:
constructor(private sanitizer: DomSanitizer) { }
ngOnInit() {
this.targetUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.sourceUrl);
}
Run Code Online (Sandbox Code Playgroud)
角度模板:
<iframe #crossDomainIframe [src]="targetUrl" (load)="onPageLoad()">
</iframe>
Run Code Online (Sandbox Code Playgroud)
在onPageLoad()我做发光响应返回给父组件的简单的商业逻辑.
onPageLoad () {
this.callbackResponse.emit(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)
有办法处理这个问题吗?
或者可以以不同的方式在Iframe上执行跨域?
小智 6
长话短说,在这种情况下的后退按钮是一般的网络问题.不过,有几个想法.想法一:在窗口中使用onbeforeunload事件:
window.addEventListener('beforeunload', function(e){
e.preventDefault();
e.returnValue = 'Hitting the back button will make you start over!';
return e.returnValue;
});
Run Code Online (Sandbox Code Playgroud)
并非所有浏览器都会显示正确的对话框文本,但设置returnValue将导致所有浏览器在实际强制重新加载所有内容之前提示用户,这总比没有好.不幸的是,它也会在关闭/刷新窗口中执行此操作,但您可以在完成后删除侦听器.
想法二:设置哈希.
var ignoreNextHashChange;
window.onhashchange = function(){
if (ignoreNextHashChange)
ignoreNextHashChange = false;
else
alert('Whoa there--using the back button will break the process!');
}
Run Code Online (Sandbox Code Playgroud)
然后在代码的每个阶段执行以下操作:
ignoreNextHashChange = true;
window.location.hash = '#hashForThisStage';
Run Code Online (Sandbox Code Playgroud)
同样,不是100%完美,但它会使后退按钮回滚哈希并发射一个可检测的事件,而不是打破你的整个流程.
干杯!
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |