48 votes

Détecter quand "Inspect Element" est ouvert

Le site Web de Samy Kamkar, http://samy.pl , sait quand la console est ouverte et efface la source / console quand elle s'ouvre.

entrez la description de l'image ici

Comment cela marche-t-il?

61voto

kevingessner Points 7257

Cela a pris quelques recherches. samy.pl a plusieurs niveaux d'indirection et de dissimulation sur le dessus de ce code. Il utilise une version différente de la détection de code que le dépôt GitHub trouvé par JohanP. Le code de la samy.pl contrairement au dépôt GitHub, peut détecter les devtools quand ils ne sont pas à quai.

Il le fait en utilisant un petit script qui s'exécute de manière différente selon que devtools est ouvert ou fermé.

Exemple de script

Voici un exemple; l'ouvrir dans un navigateur et remarquez comment les changements de sortie comme les devtools sont ouverts et fermés (si il est connecté ou pas):

<!DOCTYPE html>
<html>
    <body>
        <pre id="output"></pre>
        <script type="text/javascript">
            var element = new Image;
            var devtoolsOpen = false;
            element.__defineGetter__("id", function() {
                devtoolsOpen = true; // This only executes when devtools is open.
            });
            setInterval(function() {
                devtoolsOpen = false;
                console.log(element);
                document.getElementById('output').innerHTML += (devtoolsOpen ? "dev tools is open\n" : "dev tools is closed\n");
            }, 1000);
        </script>
    </body>
</html>

Comment ça marche

La fonction setInterval est exécuté à chaque seconde. console.log s'exécute toujours, si les devtools sont ouverts ou fermés: L' console objet est toujours défini. Cependant, l' log méthode que les écritures de sortie de la console lors de la devtools sont ouverts. Si les devtools sont fermés, console.log est un no-op. C'est la clé qui vous permet de détecter si le devtools sont ouverts: détecter si l'opération de journal est un no-op.

Dans le processus de rédaction element à la console, il récupère l'id de l'élément. Qui appelle la fonction attachée avec de la __defineGetter__. Par conséquent, console.log(element) uniquement les appels de la fonction lorsque la devtools sont ouverts et console.log n'est pas un no-op. L'indicateur est défini dans cette fonction, nous donnant une vision à jour de la devtools état à chaque seconde.

samy.pl utilise quelques autres astuces pour masquer cette: la console est également effacé à chaque seconde, et ce code est brouillée avec un espace (!) l'encodage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X