2013-05-24 4 views
5

Предположим, что я хочу получить список всех переменных в window, которые определены пользователем. Другими словами, они не являются свойствами или объектами, которые браузер создал или определен в ECMAScript.JavaScript: Перечислить неместные объекты в заданной области

Например, скажем, есть скрипт на странице:

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

Я хотел бы иметь возможность перебрать window и получить список, содержащий __$DEBUG и его значение, и Analytics и его значение:

Это можно сделать?

+0

в сторону поддержания огромный список браузерных определенных переменных? –

+0

Да, пожалуйста. :) – core

+0

Возможный дубликат: http://stackoverflow.com/questions/85992/how-do-i-enumerate-the-properties-of-a-javascript-object – BentOnCoding

ответ

6

Я уже делал это, создав одну функцию (загруженную перед любым другим JS), которая запоминает текущие клавиши window (т. Е. Встроенные свойства) и которая при вызове снова отображает различия.

Если целью является только обнаружение случайных глобальных переменных, вышеупомянутая функция может быть анонимным IIFE (таким образом, что она сама не загрязняет глобальную область), которая содержит текущий список в области, который затем периодически вызывает другую закрытую функция (с setTimeout), чтобы сравнить список, и обновлять его в следующий раз, например:

(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

Можно ли это сделать в форме пользовательского слова? То есть, может ли это быть сделано кем-то, кто никак не может изменить ответ сервера? –

+0

@JanDvorak это возможно. Я думаю, но только если вы можете убедиться, что usercript всегда загружается первым, и если пользовательский скрипт может фактически получить доступ к объекту 'window' главной страницы. В ISTR существуют ограничения на пользовательские скрипты, которые могут помешать этому. – Alnitak

+0

Tampermonkey позволяет настроить запуск сценария на начало документа/документ-тело/документ-конец, а также порядок разных пользовательских скриптов. Таким образом, это возможно. IIRC, Greasemonkey позволяет вам делать то же самое. –

Смежные вопросы