2013-05-24 9 views
5

Załóżmy, że chcę uzyskać listę wszystkich zmiennych w window zdefiniowanych przez użytkownika. Innymi słowy, nie są to właściwości ani obiekty utworzone lub zdefiniowane przez przeglądarkę w ECMAScript.JavaScript: Wyliczanie obiektów nienatywnych w podanym zakresie

Na przykład, powiedzmy, że jest to skrypt na stronie:

<script> 
    window.__$DEBUG = true; 
    var Analytics = function() {}; 
</script> 

Chciałbym móc pętli window i uzyskać listę zawierającą __$DEBUG i jego wartość oraz Analytics i jego wartości:

var nonNatives = (function nonNative(scope) { 
    var result = {}; 
    for (var child in scope) { 
     if (!isNative(child)) { 
      result[child] = scope[child]; 
     } 
    } 
    return result; 
})(window); 

Czy to można zrobić?

+0

bok utrzymania ogromną listę zmiennych zdefiniowanych przez przeglądarkę? –

+0

Tak, proszę bardzo. :) – core

+0

możliwy duplikat: http://stackoverflow.com/questions/85992/how-do-i-enumerate-the-properties-of-a-javascript-object – BentOnCoding

Odpowiedz

6

Wcześniej to robiłem, tworząc jedną funkcję (ładowaną przed każdym innym JS), która zapamiętuje bieżące klucze window (tj. Właściwości wbudowane) i która po wywołaniu ponownie wyświetla różnice.

Jeśli celem jest tylko przypadkowe wykrycie zmiennych globalnych, wyżej wymienioną funkcją może być anonimowy IIFE (taki, że sam nie zanieczyszcza zasięgu globalnego), który zawiera aktualną listę w zakresie, który następnie okresowo wywołuje inny załącznik funkcja (z setTimeout) porównać listę i zaktualizować go do następnego razu, np:

(function(scope) { 

    var keys = Object.keys(scope); 
    var map = {}; 
    for (var i = 0, n = keys.length; i < n; ++i) { 
     map[keys[i]] = 1; 
    } 

    (function update() { 
     var current = Object.keys(scope); 

     // compare lists and print the differences 
     for (i = 0, n = current.length; i < n; ++i) { 
      var name = current[i]; 
      if (!(name in map)) { 
       console.log(name + ' = ' + scope[name]); 
       map[name] = 1; 
      } 
     } 

     // loop 
     setTimeout(update, 1000); 
    })(); 

})(window); 
+0

Czy można to uczynić w formie usercriptu? Czy może to zrobić ktoś, kto w żaden sposób nie może zmienić odpowiedzi serwera? –

+0

@JanDvorak wydaje się, że to wykonalne, ale tylko wtedy, gdy użytkownik może upewnić się, że usercript jest zawsze ładowany jako pierwszy, a użytkownik może uzyskać dostęp do obiektu 'window' strony głównej. ISTR istnieją ograniczenia dotyczące usercriptów, które mogą temu zapobiec. – Alnitak

+0

Tampermonkey pozwala ci skonfigurować uruchamianie skryptu na początku dokumentu/dokumencie-treści/końcu dokumentu, a także porządkowanie różnych usercriptów. Tak więc jest to wykonalne. IIRC, Greasemonkey pozwala zrobić to samo. –

Powiązane problemy