window.close 및 self.close는 Chrome에서 창을 닫지 않습니다.


174

문제는 내가 호출 window.close()하거나self.close() 창을 닫지 않을 입니다. 이제 Chrome에서는 스크립트로 작성되지 않은 창을 스크립트로 닫을 수 없다고 생각합니다. 그것은 특허 적으로 거짓이지만 확인을 위해 경고를 팝업해야하더라도 여전히 그렇게해야합니다. 이런 일은 일어나지 않습니다.

그렇다면 누구나 Chrome 기반이 아닌 모든 브라우저에서 예상되는 것과 실제로 잘되는 것을 사용 javascript:window.close()하거나 javascript:self.close()실제로 사용하는 창을 닫는 실질적이고 기능적이며 입증 된 방법이 있습니까? 어떤 제안이라도 대단히 감사하겠습니다 .JavaQuery 전용 솔루션을 찾고 있습니다 .JQuery 또는 타사 구현은 없습니다.

업데이트 : 제안 된 많은 부분에는 심각한 한계와 사용성 문제 // @grant window.close가 있지만 스크립트 헤더에서 사용하는 최신 제안 (TamperMonkey에만 해당) 은 일반적으로 close 메서드를 처리 할 수없는 탭에서도 트릭을 수행합니다. 전적으로 이상적인 것은 아니며 모든 경우에 일반화되지는 않지만 제 경우에는 좋은 해결책입니다.


window.close()크롬에서 나를 위해 일합니다.
매쉬

3
@ GµårÐïåñ : 음, 아뇨. 언어와 관련이 없습니다. 브라우저로 구현 된 기능입니다. window.close제대로 작동하지 않는 방법을 보여주는 최소한의 예제를 작성할 수 있다면 "작동하지 않습니다"라고 말하는 것보다 도움이 될 것입니다.
Blender

3
두 가지 예를 들었습니다. 당신을 위해 철자,<a href="javascript:window.close">CLOSE</a>
GµårÐïåñ

3
부적절한 자바 스크립트 인 보호자 window.close () 시도하고 작동합니다. window.close는 변수 이름 일 뿐이며 함수를 호출하지 않습니다 (적어도 크롬 37에서 테스트 할 때는 그렇지 않습니다). 예제를 window.close ()로 변경하면 크롬 37에서 작동합니다.
George

3
GµårÐïåñ @George가 말한 것은 바보가 아닙니다. 그는 예제의 자바 스크립트에 구문 오류가 있음을 말한 것이 맞으며 응용 프로그램 코드에 동일한 오류가 있으면 문제의 원인 일 가능성이 큽니다. 그러나 예제에서 오타 일 경우 더 나은 답변을 얻으려면 오타를 수정해야합니다.
Superole

답변:


187

일반적인 자바 스크립트는 창을 닫을 수 없습니다. 이것은 여러 악의적 인 악용과 성가심을 막기 위해 얼마 전에 소개 된 보안 기능입니다.

대한 최신 작업 사양에서window.close() :

close()Window 객체 의 메소드는 다음 조건이 모두 충족되면 브라우징 컨텍스트 A를 닫아야합니다 .

  • 해당 브라우징 컨텍스트 A스크립트로 닫을 수 있습니다.
  • 기존 스크립트의 브라우징 컨텍스트는 브라우징 컨텍스트 A에 익숙합니다 .
  • 기존 스크립트의 브라우징 컨텍스트는 브라우징 컨텍스트 A 를 탐색 할 수 있습니다.

브라우징 컨텍스트는 스크립트에 의해 생성 된 보조 브라우징 컨텍스트 이거나 (사용자의 작업과 반대되는) 브라우징 컨텍스트가 세션 기록에 하나의 문서 만 포함 된 브라우징 컨텍스트 인 경우 스크립트로 닫을 수 있습니다.

이것은 하나의 작은 예외를 제외하고는 자바 스크립트가 동일한 자바 스크립트에 의해 열리지 않은 창을 닫을 수 없어야 함을 의미 합니다.

Chrome에서는 사용자 스크립트에는 적용되지 않는 예외를 허용하지만 Firefox는 그렇지 않습니다. Firefox 구현 플랫 아웃 상태 :

이 메소드는 스크립트를 사용하여 열린 창에 대해서만 호출 할 수 있습니다 window.open.


window.closeGreasemonkey / Tampermonkey / userscript에서 사용하려고하면 다음 과 같은 결과가 나타납니다.
Firefox : 오류 메시지 " Scripts may not close windows that were not opened by script."
Chrome : 자동으로 실패합니다.



장기적인 해결책 :

이를 처리하는 가장 좋은 방법 은 Chrome 확장 프로그램 및 / 또는 Firefox 애드온을 대신 만드는 것입니다. 현재 창을 안정적으로 닫을 수 있습니다.

그러나 window.closeGreasemonkey / Tampermonkey 스크립트의 경우 보안 위험 이 훨씬 적기 때문에; Greasemonkey와 Tampermonkey는 API에서이 기능을 합리적으로 제공 할 수 있습니다 (확장 기능을 패키지화합니다).
기능 요청을 고려하십시오.



해키 해결 방법 :

Chrome 은 현재 "자체 리디렉션"공격에 취약했습니다. 따라서 다음과 같은 코드는 일반적으로 작동했습니다.

open(location, '_self').close();

이것은 버그가 많은 행동, IMO이며, 현재 (대략 2015 년 4 월 기준) 대부분 차단되었습니다. 탭이 새로 열리고 검색 기록에 페이지가없는 경우 에만 삽입 된 코드 에서 작동 합니다. 따라서 매우 작은 환경에서만 유용합니다.

그러나 Chrome (v43 및 v44)과 Tampermonkey (v3.11 이상)에서는 변형이 계속 작동합니다 . 명백 @grant하고 평범한 것을 사용하십시오 window.close(). EG :

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

업데이트를위한 zanetu 에게 감사합니다 . 탭이 하나만 열려 있으면 작동하지 않습니다. 추가 탭만 닫습니다.


Firefox 는 이러한 악용으로부터 안전합니다. 따라서 유일한 자바 스크립트 방법은 한 번에 하나의 브라우저로 보안 설정을 손상시키는 것입니다.

당신은 열 수 about:config와 설정
allow_scripts_to_close_windowstrue.

스크립트가 개인적인 용도라면 계속 진행하십시오. 다른 사람에게 해당 설정을 사용하도록 요청하면 편견을 가지고 거절하는 것이 현명하고 정당합니다.

현재 Chrome에 동등한 설정이 없습니다.


3
내 친구 야 마지막으로 당신의 의견을 듣게되어 기쁘다 그냥 메모, FX는 당신이를 뒤집기에 의한 제한을 무시할 수 dom.allow_scripts_to_close_windows;falsetrue소스를 해킹하지 않고 내가 크롬에서 아무것도 생각하지 않습니다하지만 / 나는 지금 그것의 주위에 있었는지 인 재건. TM 개발자를 알고 있으며 최근 알파 / 베타에서는 중간자 스타일로 작동하는 호환성 옵션 (스크립트 설정)으로 사용했습니다. 나는 우리에게 깨끗한 해결책이 없다는 해킹이 부족하다고 생각합니다. 동정.
GµårÐïåñ

3
누구나 window.close 또는 브라우저 간의 특정 동작 차이에 문제가있는 경우이 답변을주의 깊게 읽으십시오. 정말 올바른 정보가 있습니다.
브론 데이비스

스크립트가 창을 열 었는지 여부를 확인하는 방법이 있습니까? (뒤로 단추를 표시하거나 숨길 필요가 있습니다. 해킹을 사용하고 싶지 않습니다.) 감사합니다. 편집 : window.opener === null
Cétia

Chrome 36.0.1985.125 2014 년 7 월 16 일 수요일부터 해키 해결 방법 이 작동하지 않을 수 있습니다.
swcool

2
window.close()@grant이외의 값으로 설정하면 Tampermonkey에서 작동 none합니다. 이 스레드를 참조하십시오 .
zanetu

32

Chrome 버전 36.0.1985.125의 보안 문제를 해결했습니다.

Chrome 36.0.1985.125 2014 년 7 월 16 일 수요일 릴리스 노트

내 관찰에 따르면이 업데이트 window.close()는 팝업 창을 닫는 데 사용하는 문제를 해결했습니다 . 콘솔에서 실패하면 "스크립트가 열린 창만 닫을 수 있습니다"라는 메시지가 콘솔에 표시됩니다. 즉 , 해키 해결 방법 (Brock Adams의 답변) 최신 릴리스에서 작동하지 않을 수 있습니다 .

따라서 이전 Chrome 출시 빌드에서 아래 코드 블록은 작동하지만이 업데이트에서는 작동하지 않을 수 있습니다.

window.open('', '_self', '');
window.close();

이 업데이트의 경우 팝업 창을 닫으려면 코드를 적절히 업데이트해야합니다. 해결책 중 하나는 팝업 창 ID를 잡고 사용하는 것입니다.

chrome.windows.remove(integer windowId, function callback)

그것을 제거하는 방법. Chrome 확장 프로그램 Windows API는 chrome.windows 에서 찾을 수 있습니다 .

실제로 내 크롬 확장 프로그램 MarkView 가이 문제에 직면하고 있으며이 Chrome 업데이트에서 작동하도록 코드를 업데이트해야했습니다. 그건 그렇고, MarkView는 Awesome Markdown Files를 읽고 쓰는 도구이며 줄 번호가있는 내용 개요, 정렬 가능한 테이블 및 코드 블록 구문 강조를 포함한 기능을 제공합니다.

나는 또한 이 게시물 을 만들었 습니다 , 모든 의견을 환영합니다.


2
올바른 해킹은 open(location, '_self').close();-의 반환 값 사용에 유의하십시오 open(). 이것은 여전히 ​​Chrome에서 작동합니다.36.0.1985.125 m
Brock Adams

내 경우에는으로 다시 테스트하면 open(location, '_self').close();"승인되지 않음"오류가 발생합니다. 이 오류는 'window.close () (warning on this"Scripts may close only the windows that were opened by it."). It looked like open (location,' _ self '). close ();`와 조금 다르지만 내 경우에는 완료 할 수 없습니다. 의견을 보내 주셔서 감사합니다.
swcool

나는 타이프 스크립트를 가지고 있고 chrome.windows.remove그것을 넣을 때 기호 크롬을 찾을 수 없다고 말합니다. 이 문제를 어떻게 해결할 수 있습니까? 어떤 종류의 참조를 추가해야합니까?
DevT

@devt chrome.windows.remove는 Chrome 확장 프로그램 API이므로 Chrome 확장 프로그램에서 자바 스크립트를 인식해야합니다. 크롬 확장명 manifest.json에서 background.js 안에서 시도해 볼 수 있습니다 : "background": { "scripts": [ "background.js"], ...},
swcool

사용자가 자유롭게 액세스 할 수 있도록 MarkView 로그인 기능을 제거 했습니다 . 따라서 위에서 언급 한 예는 현재 사용할 수 없습니다.
swcool

21

tampermonkey에서 이제 사용할 수 있습니다

// @grant        window.close

그런 다음 간단히 전화하십시오.

window.close();

나는 이것이 많은 경우에 효과가 있지만 가끔 고집스러운 것들이지만 아무것도 아닌 것보다 낫다는 것을 확인했습니다. 감사합니다. 게시물에 추가하겠습니다.
GµårÐïåñ

2
참고로 : Greasemonkey 3.10에서 작동하지 않습니다
mt025

17

Brock Adams가 게시 한 방법을 사용하고 있으며 사용자가 시작하면 Firefox에서도 작동합니다.

open(location, '_self').close();

버튼을 눌러 호출하여 사용자가 시작 했으며 Chrome 35-40, Internet Explorer 11, Safari 7-8 및 ALSO Firefox 29-35를 사용하여 여전히 잘 작동합니다. 다른 버전의 Windows 8.1 및 Mac OS X 10.6, 10.9 & 10.10 버전을 사용하여 테스트했습니다.


자체 결산 창 코드 (자체를 닫는 페이지)

스스로 열 수있는 사용자가 연 창에서 사용할 전체 코드 :

window_to_close.htm

자바 스크립트 :

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

HTML :

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

이 테스트 페이지를 사용해보십시오 (이제 Chrome 40 및 Firefox 35에서 테스트되었습니다)

http://browserstrangeness.bitbucket.io/window_close_tester.htm


창 오프너 코드 (위 페이지를 여는 페이지)

이 작업을 수행하려면 보안이 적용된 크로스 브라우저 호환성을 위해서는 사용자가 동일한 사이트 도메인 내에서 단추를 클릭하여 닫을 창을 이미 열어야합니다.

예를 들어, 위의 방법을 사용하여 자체를 닫는 창은이 코드 (위의 링크 된 예제 페이지에서 제공 한 코드)를 사용하여 페이지에서 열 수 있습니다.

window_close_tester.htm

자바 스크립트 :

function open_a_window() 
{
    window.open("window_to_close.htm"); 

    return false;
}

HTML :

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

사용자가 시작한 예외를 잊었습니다. 잘 잡는다. 대부분의 사용자 스크립트 작성자는 완전 자동 작업을 원한다고 생각합니다. 그들은 이미 편리하고 사용자가 시작한 닫기 메커니즘을 가지고 있습니다-오른쪽 상단에 작은 X. (^_^)
Brock Adams

1
어쨌든, 이것은 나를 위해 작동하지 않습니다. firefox 30이나 Chrome 37에는 없습니다. 페이지가 비게됩니다 (정말 이상한 동작). 내 코드는 <button onclick="open(location,'_self').close()" >Close Window</button>입니다. 분명히 뭔가 잘못하고 있습니까? 이것은 또한 사용자가 시작한 것으로 보입니다. a <button>또는 a를 사용하면 동일한 결과가 나타납니다 <input type="button">.
LordOfThePigs

위의 답변에 테스트 페이지를 추가했습니다.
Jeff Clayton

@YumYumYum 게시물 주셔서 감사합니다, bitbucket.org는 최근 답변에서 수정 된 bitbucket.io로 링크를 변경했습니다
Jeff Clayton

그것은 나를 위해 일합니다 (창을 닫으려면 페이지에 버튼이 있음). 작동하지 않는 것은 : window.open('', '_self', ''); window.close(); 그러나 작동했습니다 open(location, '_self').close();
krystonen

10

많은 사람들이 여전히 자바 스크립트를 사용하여 Chrome 브라우저를 닫는 방법을 찾고 있습니다. 다음 방법은 Chrome을 APP 실행기로 사용하는 경우에만 작동합니다 (예 : 키오스크).

나는 다음을 테스트했다.

다음 확장 프로그램을 사용하고 있습니다 : 키오스크 닫기

사용법 지침을 따르고 있으며 제대로 작동하는 것 같습니다 (테스트를 수행하는 동안 캐시를 지우십시오). 내가 사용하는 자바 스크립트는 (클릭 이벤트에 첨부) :

window.location.href = '/closekiosk';

내가 찾은 유일한 작동 솔루션이므로 누군가에게 도움이되기를 바랍니다.

참고 : 확장 프로그램이 백그라운드에서 실행되고 Chrome 트레이 아이콘이 추가 된 것 같습니다. "Chrome을 백그라운드에서 실행"(또는 유사한 텍스트) 옵션이 선택되어 있습니다. 효과가있을 때까지 게임을해야 할 수도 있습니다. 나는 그것을 체크하지 않고 이제는 잘 작동합니다!


9

그것이 "특허 적으로 거짓"이라고 생각 함에도 불구하고, 당신이 "믿는 것 같다"고 말하는 것은 실제로 정확합니다. window.close에 대한 Mozilla 문서는 말합니다

이 메소드는 window.open 메소드를 사용하여 스크립트에 의해 열린 윈도우에 대해서만 호출 할 수 있습니다. 스크립트로 창을 열지 않은 경우 JavaScript 콘솔에 다음 오류가 나타납니다. 스크립트에서 열지 않은 창을 스크립트에서 닫지 못할 수 있습니다.

당신은 그것이 "아직도 그렇게하기로되어있다"고 말하지만, 당신이 그것을지지하는 어떤 언급도 찾을 수 없다고 생각합니다.


9

저에게 꼭 맞는 새로운 방법을 찾았습니다

var win = window.open("about:blank", "_self");
win.close();

1
이것은 2017이며 여전히 "스크립트에서 열지 않은 창을 닫지 못할 수 있습니다"라는 오류가 계속 발생합니다.
Rotimi

IE 11의 확인 버튼에 대한 좋은 해킹
Gopal00005

Chrome 및 Firefox에서 작동
Vineeth Pradhan

1
이 구멍은 채워진 것 같습니다. 나는 언제 알지 못하지만 최신 개발자 빌드 84.x를 사용하고 있습니다. 빈 페이지가로드되지만 닫기는 실행되지 않습니다.
Scott Christensen

4

아래 코드는 저에게 효과적이었습니다.

window.open('location', '_self', '');
window.close();

Chrome 43.0.2357.81에서 테스트되었습니다.


Chrome 버전을 추가 할 수 있습니까?
Stephan

내 크롬 버전은 43.0.2357.81입니다.
DfrDkn

7
나를 위해 현재 창을 / location의 창으로 바꿉니다.
alianos-

@ alianos- 나도.
RicardoGonzales

1
최신 크롬에서 작동하지 않음-버전 61.0.3163.100 (공식 빌드) (64 비트)
Subhajit

1

이것은 오래되었지만 대답 해 봅시다.

top.close () 를 사용 하여 탭을 닫습니다. window.close () 또는 다른 open ... close가 작동하지 않았습니다.


11
이것은 또한 "Scripts may not close windows that were not opened by script."다른 답변에서 언급 된 문제로 고통받습니다 .
kad81

1
답변에 대한 해결책을 제시하십시오. 답에만 문제를 논의하지 마십시오.
Bimal Das

0

필자의 경우 페이지를 닫아야했지만 링크로 인해 페이지가 열렸을 수 있습니다. window.close .

내가 선택한 솔루션은을 발행 한 window.close다음 window.setTimeout다른 페이지로 리디렉션하는 것입니다.

이렇게 window.close하면 해당 페이지에서 실행이 중지되지만 실패하면 잠시 후에 다른 페이지로 리디렉션됩니다.

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);

0

Brock의 답변은 나를 위해 일했습니다. javascript가 동일한 javascript에 의해 열리지 않은 창을 닫을 수 없어야합니다.

부모 자바 스크립트에서 자식 창을 닫을 경우에만 자식 창을 닫을 수 있습니다. 그래서 부모님은 이런 식으로 할 수 있습니다.

var myChildWindow;

function openWindow(){
myChildWindow = window.open("","myChildWindow","width=400,height=400");
}

function closeWindow() {
myChildWindow.close();
}

-1

아래 코드를 사용해보십시오. 또한 부모 창을 리디렉션하는 데 도움이됩니다.

부모의:

<script language="javascript">

function open_a_window() 
{
    var w = 200;
        var h = 200;
        var left = Number((screen.width/2)-(w/2));
        var tops = Number((screen.height/2)-(h/2));

        window.open("window_to_close.html", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);

   return false;
}

// opener:
window.onmessage = function (e) {
  if (e.data === 'location') {
    window.location.replace('https://www.google.com');
  }
};

</script>

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

팝업 :

<!DOCTYPE html>
<html>
<body onload="quitBox('quit');">

<h1>The window closer:</h1>

<input type="button" onclick="return quitBox('quit');" value="Close This Window/Tab" /> 


<script language="javascript">

function quitBox(cmd) 
{      
    if (cmd=='quit')    
    {   
       window.opener.postMessage('location', '*');
       window.open(location, '_self').close();    
    }     
    return false;   
}

</script>

</body>
</html>


-2

window.open ()을 사용하여 새 창을 열 경우에만 위에서 언급 한 코드를 사용하여 새 창을 닫을 수 있습니다. 이것은 나를 위해 완벽하게 작동합니다 :) 참고 : 새 탭에서 페이지를 열 때 href를 사용하지 마십시오. Window.close ()는 "href"와 함께 작동하지 않습니다. 대신 window.open ()을 사용하십시오.


1
그것은 단지 curren 창을 대체하고 있습니다. 더 이상은 없어.
RicardoGonzales

-3

이 문제와 "솔루션"을 공유하고 싶었습니다. 대부분의 사용자가 표준 브라우저 세션에서 사용자가 일부 웹 사이트를 방문하거나 다른 웹 사이트를 방문한 후 더 방문하기 전에 브라우저 창을 닫으려고하는 것 같습니다.

그러나 내 상황은 본질적으로 장치가하는 유일한 장치 인 장치 용 웹 응용 프로그램을 작성하는 것입니다. 부팅하면 Chrome이 시작되고 앱으로 이동합니다. 인터넷에 연결되어 있지 않으며, 대화하는 서버는 로컬 Docker 컨테이너에 있습니다. 사용자는 시스템을 업데이트하기 위해 터미널에 액세스 할 수 있도록 앱을 닫는 방법 (일명 Chrome 닫기)이 필요합니다.

따라서 부팅되어 키오스크 모드에서 올바른 주소로 Chrome을 시작합니다. 이것은 사양의 두 번째 옵션을 쉽게 충족시킵니다.

브라우징 컨텍스트는 스크립트에 의해 생성 된 보조 브라우징 컨텍스트 이거나 ( 사용자의 작업과 반대되는) 브라우징 컨텍스트는 세션 히스토리가 하나의 문서 만 포함하는 최상위 브라우징 컨텍스트 인 경우 스크립트로 닫을 수 있습니다.

그래서 단순히 window.close()내 키오스크 앱에서 전화하면 작동합니다 !


-5

onclick = "return self.close ()"와 같은 것을 시도하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.