[javascript] Chrome 콘솔이 열려 있는지 확인

Firebug가 열려 있는지 확인하기 위해이 작은 스크립트를 사용하고 있습니다.

if (window.console && window.console.firebug) {
    //is open
};

그리고 잘 작동합니다. 이제 Chrome의 내장 웹 개발자 콘솔이 열려 있는지 감지하는 방법을 찾기 위해 30 분 동안 검색했지만 힌트를 찾을 수 없었습니다.

이:

if (window.console && window.console.chrome) {
    //is open
};

작동하지 않습니다.

편집하다:

Chrome 콘솔이 열려 있는지 감지 할 수없는 것 같습니다. 그러나 몇 가지 단점과 함께 작동 하는 ” 해킹 “이 있습니다.

  • 콘솔을 도킹 해제하면 작동하지 않습니다
  • 페이지로드시 콘솔이 열려 있으면 작동하지 않습니다

그래서 지금은 Unsigned의 답변을 선택할 것입니다. 그러나 some1이 훌륭한 아이디어를 제시한다면, 그는 여전히 대답 할 수 있으며 선택한 답변을 변경합니다! 감사!



답변

requestAnimationFrame (2019 년 하반기)

역사적 맥락에서이 이전 답변을 여기에 남겨 두십시오. 현재 Muhammad Umer의 접근 방식은 Chrome 78에서 작동하며 닫기 및 열린 이벤트를 모두 감지하는 이점이 있습니다.

함수 toString (2019)

에 신용 Overcl9ck 이 답변에의 코멘트. 정규식 /./을 빈 함수 객체로 바꾸면 여전히 작동합니다.

var devtools = function() {};
devtools.toString = function() {
  if (!this.opened) {
    alert("Opened");
  }
  this.opened = true;
}

console.log('%c', devtools);
// devtools.opened will become true if/when the console is opened

정규식 toString (2017-2018)

원래의 asker는 더 이상 존재하지 않는 것으로 보이며 이것이 여전히 받아 들여지는 대답이므로 가시성을 위해이 솔루션을 추가합니다. 신용은 zswang답변에 대한 Antonin Hildebrand의견 으로 갑니다 . 이 솔루션은 콘솔이 열려 있지 않으면 로깅 된 개체에서 호출되지 않는 사실을 이용합니다 .toString()

var devtools = /./;
devtools.toString = function() {
  if (!this.opened) {
    alert("Opened");
  }
  this.opened = true;
}

console.log('%c', devtools);
// devtools.opened will become true if/when the console is opened

console.profiles (2013)

업데이트 : console.profiles Chrome에서 제거되었습니다. 이 솔루션은 더 이상 작동하지 않습니다.

프로파일 러를 사용하여 Discover DevTools 의이 솔루션을 지적한 Paul Irish 에게 감사합니다 .

function isInspectOpen() {
  console.profile();
  console.profileEnd();
  if (console.clear) {
    console.clear();
  }
  return console.profiles.length > 0;
}
function showIfInspectIsOpen() {
  alert(isInspectOpen());
}
<button onClick="showIfInspectIsOpen()">Is it open?</button>

window.innerHeight (2011)

이 다른 옵션은 페이지가로드 된 도킹 된 관리자가 열리는 것을 감지 할 수 있지만 도킹 해제 된 관리자를 감지 할 수 없거나 관리자가 페이지로드시 이미 열려있는 경우에는 감지 할 수 없습니다. 오 탐지 가능성도 있습니다.

window.onresize = function() {
  if ((window.outerHeight - window.innerHeight) > 100) {
    alert('Docked inspector was opened');
  }
}


답변

Chrome 65 이상 (2018)

r = /./
r.toString = function () {
    document.title = '1'
}
console.log('%c', r);

데모 : https://jsbin.com/cecuzeb/edit?output (2018-03-16에 업데이트)

패키지 : https://github.com/zswang/jdetects


‘요소’를 인쇄 할 때 Chrome 개발자 도구는 ID를 얻습니다.

var checkStatus;

var element = document.createElement('any');
element.__defineGetter__('id', function() {
    checkStatus = 'on';
});

setInterval(function() {
    checkStatus = 'off';
    console.log(element);
    console.clear();
}, 1000);

주석에서 다른 버전

var element = new Image();
Object.defineProperty(element, 'id', {
  get: function () {
    /* TODO */
    alert('囧');
  }
});
console.log('%cHello', element);

정규 변수 인쇄

var r = /./;
r.toString = function() {
  document.title = 'on';
};
console.log(r);


답변

매우 안정적인 핵

기본적으로 getter on 속성을 설정하고 콘솔에 기록하십시오. 분명히 콘솔이 열려있을 때만 액세스됩니다.

https://jsfiddle.net/gcdfs3oo/44/

var checkStatus;

var element = new Image();
Object.defineProperty(element, 'id', {
  get: function() {
    checkStatus='on';
    throw new Error("Dev tools checker");
  }
});

requestAnimationFrame(function check() {
  checkStatus = 'off';
  console.dir(element);
  document.querySelector('#devtool-status').className  = checkStatus;
  requestAnimationFrame(check);
});
.on{
  color:limegreen;
}

.off{
  color:red;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.7.1/css/all.css" integrity="sha256-DVK12s61Wqwmj3XI0zZ9MFFmnNH8puF/eRHTB4ftKwk=" crossorigin="anonymous" />

<p>
  <ul>
    <li>
      dev toolbar open: icon is <span class="on">green</span>
    </li>
    <li>
      dev toolbar closed: icon is <span class="off">red</span>
    </li>
  </ul>
</p>
<div id="devtool-status"><i class="fas fa-7x fa-power-off"></i></div>
<br/>
<p><b>Now press F12 to see if this works for your browser!</b></p>


답변

DevTools가 열려있을 때 감지 하는 devtools-detect 를 만들었습니다 .

console.log('is DevTools open?', window.devtools.open);

이벤트를들을 수도 있습니다.

window.addEventListener('devtoolschange', function (e) {
    console.log('is DevTools open?', e.detail.open);
});

DevTools가 도킹 해제되어 있으면 작동하지 않습니다. 그러나 Chrome / Safari / Firefox DevTools 및 Firebug와 작동합니다.


답변

Chrome 콘솔이 열려 있는지 확인하는 방법을 찾았습니다. 여전히 해킹이지만 더 정확하고 콘솔이 도킹되지 않은 날씨에 작동합니다.

기본적으로 콘솔을 닫은 상태에서이 코드를 실행하는 데 약 100 마이크로 초가 걸리며 콘솔을 여는 동안 약 200 마이크로 초가 걸립니다.

console.log(1);
console.clear();

(1 밀리 초 = 1000 마이크로 초)

나는 그것에 대해 자세한 내용을 서면으로 작성했습니다 여기에 .

데모가 여기 있습니다 .


최신 정보:

@zswang은 현재 최상의 솔루션을 찾았습니다-그의 답변을 확인하십시오


답변

개발자 도구를 방해하는 것이 목표라면 이것을 시도해보십시오 (JS 코드가 난독 화 된 곳에서 더 복잡한 버전을 찾았습니다. 매우 성가시다).

setTimeout(function() {while (true) {eval("debugger");}}, 0);


답변

‘탭’권한이있는 확장 프로그램을 확인하는 까다로운 방법이 있습니다.

chrome.tabs.query({url:'chrome-devtools://*/*'}, function(tabs){
    if (tabs.length > 0){
        //devtools is open
    }
});

또한 페이지에 열려 있는지 확인할 수 있습니다.

chrome.tabs.query({
    url: 'chrome-devtools://*/*',
    title: '*example.com/your/page*'
}, function(tabs){ ... })