2014-11-07 5 views
6

Ich versuche, auf einige Werte in einer Remote-Webanwendung zuzugreifen, um eine Chrome-Erweiterung zu erstellen.Mit Chrome Devtools suchen, welche Variable einen Wert enthält

Dafür würde ich gerne herausfinden, welche JS-Variable einen bestimmten Wert enthält, und ich frage mich, ob man eine Art "globale Suche" nach den Werten aller Variablen im Speicher durchführen kann.

Ist dies mit jedem Werkzeug möglich? Inspektor, Profiler, etc ...?

Antwort

3

Sie könnten alle Elemente im globalen Bereich wie diese iterieren:

var test = 123, 
    someVar = 812; 

for(key in window){ 
    if(typeof window[key] === 'number' && window[key] == 123){ 
     console.log(key, window[key]); 
    } 
} 

dass Kombinieren mit einiger Rekursion, und Sie könnten theoretisch alle Objekte durchlaufen und ihre Kinder, in einem Objekt:

function searchObject(object, search){ 
    for(key in object){ 
     if(typeof object[key] === 'number' || typeof object[key] === 'string'){ 
      if(object[key] === search){ 
       console.log(key, window[key]); 
      } 
     }else if(typeof object[key] === 'object'){ 
      searchObject(object[key], search); 
     } 
    } 
} 

Dies ist nur ein schnell und schmutzig Beispiel. Es prüft nur auf strikte Gleichheit (also keine "Zeichenfolge enthält"), und es iteriert über Arrays mit for in, was böse ist. Aber es sollte Ihnen eine Vorstellung davon geben, wie es funktioniert.

Übergeben Sie diese Funktion jedoch nicht an window oder document. Das wird aufgrund von Zirkelverweisen nicht funktionieren.


Sie können jedoch auch eine breakpoint in your code in the chrome dev tools platzieren.
Sie können dann den aktuellen Wert Ihrer Variablen im Bereich "Scope Variables" auf der rechten Seite überprüfen.

+0

warum nicht 'Fenster [key] === 123' statt Typen manuell zu vergleichen und dann Nötigung Gleichheit mit? –

+0

@JanDvorak: Es war Fehler werfen für mich, wenn ich nicht: 'Uncaught TypeError: kann Objekt in primitiven Wert nicht konvertieren' (Chrome-Konsole) – Cerbrus

+1

Dies kann leicht scheitern: Sicherheitsausnahmen ausgelöst, wenn Cross-Origin-Frames, zyklische Strukturen (tatsächlich gibt es ein paar schon) ... –

3

Alle Gutschrift für this answer goes to tomwrong. In seiner Antwort finden Sie weitere Details zu den Problemen/Verbesserungen für dieses Snippet.

Der Code

function globalSearch(startObject, value) { 
    var stack = [[startObject,'']]; 
    var searched = []; 
    var found = false; 

    var isArray = function(test) { 
     return Object.prototype.toString.call(test) === '[object Array]'; 
    } 

    while(stack.length) { 
     var fromStack = stack.pop(); 
     var obj = fromStack[0]; 
     var address = fromStack[1]; 

     if(typeof obj == typeof value && obj == value) { 
      var found = address; 
      break; 
     }else if(typeof obj == "object" && searched.indexOf(obj) == -1){ 
      if (isArray(obj)) { 
       var prefix = '['; 
       var postfix = ']'; 
      }else { 
       var prefix = '.'; 
       var postfix = ''; 
      } 
      for(i in obj) { 
       stack.push([ obj[i], address + prefix + i + postfix ]); 
      } 
      searched.push(obj); 
     } 
    } 
    return found == '' ? true : found; 
} 
Verwandte Themen