aspredirect.aspx가 브라우저 기록에 있는지 방지하는 방법
-
29-09-2020 - |
문제
Page 레이아웃에 공급자 호스팅 웹 파트가 있습니다.사용자가 어떤 페이지를 방문하면 뒤로 버튼을 사용할 수 없을 때 현재 페이지로 다시 돌아 가기를 시도 할 때
웹 파트는 사용자가 히트를 히는 경우 실제로 사용자가 히트를 히는 것으로 인정받는 사람이 invipeirect.aspx의 SRC가있는 iframe에서 호스팅됩니다.
누구 든지이 주위를 알고 있습니까?우리는 SharePoint 온라인에서 호스팅하고 있으므로 기본 파일을 편집 할 수 없습니다.
해결책
공급자 호스팅 된 앱의 첫 번째 페이지에서 JavaScript를로드합니다.
동일한 문서의 두 기록 항목간에 활성 히스토리 항목이 변경 될 때마다 PopState 이벤트가 창에 전달됩니다.
-> 동일한 페이지에 대한 기록 기록 추가 (제공자 호스트 시작 URL)
-> 뒤로 버튼을 누르면 POPSTATE 이벤트가 트리거되고 올바른 내역 페이지가로드됩니다.
PushState를 사용하여 동일한 문서 URL로 페이지를 다시로드하지 않고도 기록 항목을 추가합니다.
물론, 역사 기록은 Firefox & Chrome에서 동일하게 ... IE를 제외하고는 ... 어떤 것들은 내가 이해하지 못하는 어떤 것들을합니까? 그러나 한 번 더 뒤로 되돌아 가면 작동합니다. -> 브라우저 확인을 추가하고 Internet Explorer의 기록에서 한 번 더 페이지를 되돌립니다.
조금 불쾌했지만 그것은 아주 잘 작동합니다. IFrame 내부의 페이지를 탐색 한 다음 뒤로 가면 작동합니다.
iframe에서 몇 가지 링크를 클릭하고 첫 번째 페이지에서 끝나면 이상한 동작을 할 수 있습니다. 해당 상황에서 뒤 / 앞으로 버튼을 누르면 이벤트도 트리거됩니다.
window.onpopstate = function (event) {
if (navigator.sayswho.indexOf("IE") != -1) {
history.go(-3);
}
else {
history.go(-2);
}
};
if (document.referrer.indexOf("_layouts/15/appredirect.aspx?") != -1) {
// Add history so when you click on the back button, the onpopstate event is
// triggered since the previous page is on the same document.
history.pushState({}, "reload", document.location.href);
}
// Just to test if internet explorer is used, change with your own if you want :-)
navigator.sayswho = (function () {
var ua = navigator.userAgent, tem,
M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return 'IE ' + (tem[1] || '');
}
if (M[1] === 'Chrome') {
tem = ua.match(/\bOPR\/(\d+)/)
if (tem != null) return 'Opera ' + tem[1];
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]);
return M.join(' ');
})();
.
나는 그것을 테스트했고, 그것은 적절하게 작동하는 것으로 보인다.
IE11, Firefox 31.0 & Chrome 36에서 작동합니다.
HTML5 History API가 필요합니다.