Узнайте, открыта ли консоль Chrome

Я использую этот небольшой скрипт, чтобы узнать, открыт ли Firebug:

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

И он работает хорошо. Теперь я искал полчаса, чтобы найти способ определить, открыта ли встроенная консоль веб-разработчика Google Chrome, но я не смог найти подсказки.

Это:

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

не работает.

РЕДАКТИРОВАТЬ:

Таким образом, кажется, что невозможно определить, открыта ли консоль Chrome. Но есть « hack », который работает, с некоторыми недостатками:

  • не будет работать, когда консоль отстыкована
  • не будет работать, когда консоль открыта загрузка страницы

Итак, я сейчас выберу ответ Unsigned, но если кто-то придумает блестящую идею, он все равно сможет ответить, и я изменю выбранный ответ! Спасибо!

119
задан 24.05.2017, 01:34

5 ответов

Некоторые ответы здесь перестанут работать в Chrome 65. Вот альтернатива временной атаки , которая довольно надежно работает в Chrome, и ее гораздо труднее смягчить, чем метод toString(). К сожалению, в Firefox это не так надежно.

addEventListener("load", () => {

var baseline_measurements = [];
var measurements = 20;
var warmup_runs = 3;

const status = document.documentElement.appendChild(document.createTextNode("DevTools are closed"));
const junk = document.documentElement.insertBefore(document.createElement("div"), document.body);
junk.style.display = "none";
const junk_filler = new Array(1000).join("junk");
const fill_junk = () => {
  var i = 10000;
  while (i--) {
    junk.appendChild(document.createTextNode(junk_filler));
  }
};
const measure = () => {
    if (measurements) {
    const baseline_start = performance.now();
    fill_junk();
    baseline_measurements.push(performance.now() - baseline_start);
    junk.textContent = "";
    measurements--;
    setTimeout(measure, 0);
  } else {
    baseline_measurements = baseline_measurements.slice(warmup_runs); // exclude unoptimized runs
    const baseline = baseline_measurements.reduce((sum, el) => sum + el, 0) / baseline_measurements.length;

    setInterval(() => {
      const start = performance.now();
      fill_junk();
      const time = performance.now() - start;
      // in actual usage you would also check document.hasFocus()
      // as background tabs are throttled and get false positives
      status.data = "DevTools are " + (time > 1.77 * baseline ? "open" : "closed");
      junk.textContent = "";
    }, 1000);
  }
};

setTimeout(measure, 300);

});
0
ответ дан 21.09.2019, 17:27
  • 1
    Деталь: std::tuple_size_v C++ 17, таким образом, для C++ 14 решений, которые должны были бы быть заменены typename std::tuple_size<foo>::value – basteln 23.02.2018, 19:50

Также вы можете попробовать это: https://github.com/sindresorhus/devtools-detect

// check if it's open
console.log('is DevTools open?', window.devtools.open);
// check it's orientation, null if not open
console.log('and DevTools orientation?', window.devtools.orientation);

// get notified when it's opened/closed or orientation changes
window.addEventListener('devtoolschange', function (e) {
    console.log('is DevTools open?', e.detail.open);
    console.log('and DevTools orientation?', e.detail.orientation);
});
1
ответ дан 21.09.2019, 17:27

Существует хитрый способ проверить его на наличие расширений с разрешением «вкладки»:

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){ ... })
3
ответ дан 21.09.2019, 17:27
  • 1
    @Xeverous: 1. doesn' t работают от подписей: Ваш std::make_unique ожидает кортеж, и кортеж может быть создан из распакованного кортежа только через другой вызов к std::make_tuple. Это что I' ve сделан в лямбде (хотя it' s очень избыточный, поскольку можно также просто скопировать кортеж в уникальный указатель без любого использования для call). – davidhigh 08.09.2017, 07:09

Я нашел новый метод:

var b=new Blob()
Object.defineProperty(b,'size',{get(){
    alert('The devtool was opened!')
}})
setTimeout(function(){console.log(b)},3000)

тест онлайн

4
ответ дан 21.09.2019, 17:27

Я нашел способ узнать, открыта ли консоль Chrome или нет. Это все еще хак, но он более точен и будет работать, когда консоль отстыкована или нет.

В основном выполнение этого кода с закрытой консолью занимает около ~ 100 микросекунд, а когда консоль открыта, она занимает примерно вдвое больше ~ 200 микросекунд.

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

(1 миллисекунда = 1000 микросекунд)

Я написал больше об этом здесь .

Демо-версия здесь .


Обновление:

@zswang нашел наилучшее на данный момент решение - посмотрите его ответ

14
ответ дан 21.09.2019, 17:27

Теги

Похожие вопросы