2016-10-22 4 views
2

내가 사용하는 일부 페이지의 콘텐츠와 (새로운 프로세스에서) 새 탭을 엽니 다어떻게 열려있는 창을 사용하지 않고 탭을 닫습니다

var p = document.getElementById("myElement"); 
var a = document.createElement('a'); 
a.setAttribute('href',".../mypage.html"); 
a.setAttribute('rel',"noreferrer"); 
a.setAttribute('target',"_blank"); 
p.appendChild(a); 
a.click(); 

http://news.softpedia.com/news/Force-Google-Chrome-to-Open-Links-in-New-Processes-128962.shtml

이 코드를 사용할 때 새로운 항상 열려 탭, 이 코드를 호출하면 새 탭에서 이전 호출 이었는지 확인한 다음 닫고 새 탭에서 새 호출이 열리길 원합니다. 또는 닫지 않고 이전 탭에서 새 페이지를 실행할 수 있습니다.

나는 당신이 포함 된 모든 페이지를 제어 할 경우 일반 window.open API의 ...

+0

이렇게하면 새로 열린 탭에 전혀 액세스 할 수 없으므로 일반적으로 'window.open'이 일반적으로 선호됩니다. – adeneo

+0

서비스 작업자는 두 페이지가 동일한 도메인 내에서 제공되는 경우 옵션이 될 수 있습니다. 서버에 백엔드 기술이있는 경우 컨텐츠를 서버로 보내고 새 탭에서 3 초마다 변경을 요청하거나 websocket 연결을 사용할 수 있습니다. – Andrews

+0

@Andrews - 감사합니다.하지만 서버 측은 없습니다. 순수한 js 클라이언트 측, 나는 그 때 서비스 노동자를 사용할 수 있습니까? 그렇다면 몇 가지 예를 들어 줄 수 있습니까? –

답변

1

내 대답 here과 동일한 기술을 사용하십시오. 그러나 주 창에서 dom을 변경하는 대신 window.close()를 호출하십시오. Example

+0

감사합니다.하지만 부모 (예 : index.html)가 하위 페이지를 닫을 필요가 있습니다. 시뮬레이션 할 방법에 대한 힌트를 줄 수 있습니까? –

+0

하위에 함수를 등록하고 상위에서 원격 함수를 호출하십시오. – Astasian

1

Service workers은 가능성이다 사용할 수 없습니다.

How to Send Messages Between Service Workers and Clients은 각 페이지에 들어가는 서비스 작업자를 구현하는 방법을 설명하고 해당 페이지간에 메시지를 브로드 캐스팅하는 수단을 제공합니다.

서비스 근로자는 DOM에 액세스 할 수 없습니다. 대신 메시지가 특정 클라이언트 (페이지)로 전달되도록 조정 한 다음 해당 클라이언트가 해당 메시지를 기반으로 고유 한 DOM 조작을 수행 할 수 있습니다.

솔루션에 관계없이 페이지는 보안을 위해 샌드 박싱되어 있으므로 상호 작용하기 위해 일종의 자발적인 동의가 필요합니다. 그렇지 않은 경우 다른 페이지/탭에 비밀번호를 입력 할 때 한 페이지/탭을 도용하는 것이 특히 쉽습니다.

+0

대단히 감사합니다. 1+! 단락의 내용이나 다른 것을 바꾸는 것과 같이 두 페이지 (어떻게 간단한 페이지 레퍼런스를 넣을 것인가)와 어떻게 상호 작용할 수 있는지 예제를 제공해 주시겠습니까? –

+0

@JohnJerrby 이것은 흥미로운 프로젝트처럼 보이지만, 슬프게도 더 많은 개발과 디버깅이 필요합니다. 내가 현재 사용할 수있는 시간보다 위에 링크 된 기사에서는 서비스 작업자 인스턴스간에 통신하는 예제를 제공합니다. [이 기사] (https://googlechrome.github.io/samples/service-worker/post-message/)는 서비스 작업자 인스턴스와 연결되는 페이지 간의 통신에 대한 예제를 제공합니다. 저는 두 사람 사이에서 이것이 발전을 계속하기에 충분하다고 믿습니다. 문제가 발생하면 다른 질문을 게시 할 수 있습니다. – Ouroborus

+0

어쨌든 고마워요 –

1

SharedWorker (서비스 종사자가 아닌 다른 항목)이 필요합니다. 이전에 링크 된 MDN 페이지에 완전한 예제가 있습니다.

그럼에도 불구하고 caniuse.com에 따르면 localStorage은 이와 같은 작은 작업을 조정할 수있는 호환성에 관한 더 나은 옵션입니다. example.html 내부 지금

<a href="example.html" rel="noreferrer" target="_blank">Open in another process</a> 
<button>Close</button> 
<script> 
document.querySelector('button').onclick =() => { 
    // Change the value if you want the storage event to be triggered. 
    localStorage.setItem('close', Date.now()); 
}; 
</script> 

: 그리고, index.html 내부의 특정 사례를 들어

<p>This page is in another process.</p> 
<script> 
window.addEventListener('storage', event => { 
    if (event.key === 'close') { window.close(); } 
}); 
</script> 

는 희망이 도움이!

+0

감사합니다 슬라바, 내가 샤드 작업자를 사용해야한다고 가정합니다. (이것은 내가이 태그를 넣은 이유이며 또한 ouroborus가 내 컨텍스트에서 사용하는 방법을 잘 모르겠다 고 말했습니다 ... 예제는 매우 도움이 될 것입니다! –

관련 문제