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

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

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

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



답변

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

대한 최신 작업 사양에서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에 동등한 설정이 없습니다.


답변

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를 읽고 쓰는 도구이며 줄 번호가있는 내용 개요, 정렬 가능한 테이블 및 코드 블록 구문 강조를 포함한 기능을 제공합니다.

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


답변

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

// @grant        window.close

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

window.close();


답변

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" />


답변

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

나는 다음을 테스트했다.

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

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

window.location.href = '/closekiosk';

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

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


답변

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

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

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


답변

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

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