JavaScript에서 순전히 OAuth 인증 흐름을 개발 중이며 팝업에서 사용자에게 "grant access"창을 보여주고 싶지만 차단됩니다.
어떻게에 의해 하나 생성 창 팝업 방지 할 수 있습니다 window.open
또는 window.showModalDialog
다른 브라우저 '팝업 차단에 의해 차단되는가?
JavaScript에서 순전히 OAuth 인증 흐름을 개발 중이며 팝업에서 사용자에게 "grant access"창을 보여주고 싶지만 차단됩니다.
어떻게에 의해 하나 생성 창 팝업 방지 할 수 있습니다 window.open
또는 window.showModalDialog
다른 브라우저 '팝업 차단에 의해 차단되는가?
답변:
일반적인 규칙은 팝업 사용자window.open
가 직접 사용자 조치에 의해 호출되지 않는 자바 스크립트에서 또는 이와 유사한 호출이 발생 하는 경우 팝업 차단기가 참여하는 것 입니다. 즉, window.open
팝업 차단기에 치지 않고 버튼 클릭에 대한 응답으로 호출 할 수 있지만 타이머 이벤트에 동일한 코드를 넣으면 차단됩니다. 콜 체인의 깊이 또한 중요한 요소입니다. 일부 구형 브라우저는 즉시 발신자를보고, 최신 브라우저는 발신자의 발신자가 마우스 클릭인지 등을 조금 뒤로 추적 할 수 있습니다. 팝업 차단기를 피하려면 최대한 얕게 유지하십시오.
를 기반으로 제이슨 세브링 의 매우 유용한 팁을 하고, 물건에 덮여 여기 와 거기 , 내 경우에 대한 완벽한 솔루션을 발견 :
자바 스크립트 스 니펫이 포함 된 의사 코드 :
사용자 작업에 즉시 빈 팝업을 만듭니다.
var importantStuff = window.open('', '_blank');
선택 사항 : "대기 중"정보 메시지를 추가하십시오. 예 :
a) 외부 HTML 페이지 : 위의 줄을
var importantStuff = window.open('http://example.com/waiting.html', '_blank');
b) 텍스트 : 위의 줄 아래에 다음 줄을 추가하십시오.
importantStuff.document.write('Loading preview...');
준비가되면 내용으로 채 웁니다 (예 : AJAX 호출이 반환 될 때)
importantStuff.location.href = 'http://shrib.com';
window.open
필요한 추가 옵션으로 전화를 풍부하게하십시오 .
실제로이 솔루션을 mailto 리디렉션에 사용하며 모든 브라우저 (Windows 7, Android)에서 작동합니다. 이 _blank
비트는 mailto 리디렉션이 모바일에서 작동하는 데 도움이됩니다.
당신의 경험은? 이것을 향상시킬 수있는 방법이 있습니까?
Whatever it is you intend to do, there is a better way than a popup window
롤? 홀수 일반화. 고객은 인증 된 페이지가 열린 상태로 유지되고 인증 후 새 사이트 / 방문 페이지가 새 탭에서 열리기를 원합니다. 예, 뛰어난 사용자 경험에 대한 아이디어는 아니지만 합리적으로 보입니다.
importantStuff.close
를 걸어 새 탭을 닫고 원래 페이지에서 제공하고 경고하십시오.
또한 스위스 미스터 게시물, 내 경우에는 window.open 이 약속 내에서 시작되어 팝업 차단기가 켜지고 내 솔루션은 다음과 같습니다.
$scope.gotClick = function(){
var myNewTab = browserService.openNewTab();
someService.getUrl().then(
function(res){
browserService.updateTabLocation(res.url, myNewTab);
}
);
};
browserService :
this.openNewTab = function(){
var newTabWindow = $window.open();
return newTabWindow;
}
this.updateTabLocation = function(tabLocation, tab) {
if(!tabLocation){
tab.close();
}
tab.location.href = tabLocation;
}
이것은 약속 응답을 사용하고 팝업 차단기를 호출하지 않고 새 탭을 여는 방법입니다.
const tab = window.open(); observable.subscribe(dataUrl => tab.location.href = dataUrl);
.then
그때 그때 대답 을 보지 못했고 그것이 내가 너무 혼란스러워하는 이유입니다 : / SRY ...
좋은 습관 으로 팝업이 차단되었는지 테스트하고 경우에 따라 조치를 취하는 것이 좋습니다 . window.open에 반환 값이 있으며 작업이 실패하면 해당 값이 null 일 수 있음을 알아야합니다. 예를 들어 다음 코드에서
function pop(url,w,h) {
n=window.open(url,'_blank','toolbar=0,location=0,directories=0,status=1,menubar=0,titlebar=0,scrollbars=1,resizable=1,width='+w+',height='+h);
if(n==null) {
return true;
}
return false;
}
팝업이 차단되면 window.open은 null을 반환합니다. 따라서 함수는 false를 반환합니다.
예를 들어,
target="_blank"
팝업이 성공적으로 열리면 리턴false
하면 링크 동작이 차단되고 그렇지 않으면 팝업이 차단되면true
기본 동작 (새 _blank 창 열기)으로 돌아가서 계속됩니다. .
<a href="http://whatever.com" target="_blank" onclick='return pop("http://whatever.com",300,200);' >
이렇게하면 작동하면 팝업이 표시되고 그렇지 않으면 _blank 창이 나타납니다.
팝업이 열리지 않으면 다음을 수행 할 수 있습니다.
http://code.google.com/p/google-api-javascript-client/wiki/Authentication
읽는 영역을 참조하십시오.
인증 설정
클라이언트의 OAuth 2.0 구현은 팝업 창을 사용하여 사용자에게 응용 프로그램에 로그인하고 승인하라는 메시지를 표시합니다. gapi.auth.authorize에 대한 첫 번째 호출은 팝업 창을 간접적으로 열 때 팝업 차단기를 트리거 할 수 있습니다. 인증 차단시 팝업 차단기가 트리거되지 않도록하려면 클라이언트가로드 될 때 gapi.auth.init (callback)을 호출하십시오. 라이브러리가 인증 전화를 걸 준비가되면 제공된 콜백이 실행됩니다.
즉각적인 응답이 있는지 설명하는 방법에서 위의 실제 답변과 관련이 있다고 생각하면 팝업 경보가 작동하지 않습니다. "gapi.auth.init"는 API가 즉시 발생하도록합니다.
실용적인 응용 프로그램
npm의 노드 패스포트와 각 공급자에 대한 다양한 패스포트 패키지를 사용하여 오픈 소스 인증 마이크로 서비스를 만들었습니다. 나는 다시 리디렉션 URL을 제공하는 타사에 대한 표준 리디렉션 접근 방식을 사용했습니다. 이것은 프로그래밍 방식이므로 로그인 / 가입 및 특정 페이지에서 다른 곳으로 리디렉션 할 수 있습니다.
여러 솔루션을 시도했지만 실제로는 모든 브라우저에서 나를 위해 일한 유일한 솔루션입니다.
let newTab = window.open();
newTab.location.href = url;
url
입니까? 할당되지 않았습니다.
http://example.com
window.open()
프로그래밍 방식으로 새 창을 열 수 없으며 필요한 경우 그 대답이 옵션 중 하나라는 것입니다. newTab
변수를 사용하면 window.open()
나중에 참조 할 수 있으며 url
필요에 따라 삽입 할 수 있습니다 . 필자의 경우 url의 URL을 입력하면 입력 한 URL에서 새 탭이 열립니다.
콜백이 성공적으로 반환되지 않으면 새 페이지를 만들고 싶지 않았으므로 사용자 클릭 을 시뮬레이트 하기 위해이 작업을 수행했습니다 .
function submitAndRedirect {
apiCall.then(({ redirect }) => {
const a = document.createElement('a');
a.href = redirect;
a.target = '_blank';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
});
}
이것을 제거하는 가장 쉬운 방법은 다음과 같습니다.
예 :
<script>
function loadUrl(location)
{
this.document.location.href = location;
}</script>
<div onclick="loadUrl('company_page.jsp')">Abc</div>
이것은 나를 위해 아주 잘 작동했습니다. 건배