Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.07.2010, 14:00
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Как получить список пользовательских функций объекта window?
Как известно, объект window сочетает два в одном: глобальный объект javascript и окно браузера http://javascript.ru/window
Необходимо получить список пользовательских функций, объявленных в скрипте, а также список всех глобальных переменных (они заранее не известны). Другими словами, получить список добавленных свойств объекта window.

Проблема: при переборе свойств window получаем свойства окна броузера, но не свойства javascript-объекта window!
Пример:
в скрипте объявлены две переменных и две функции
var a=1; b = 2;
function test1(){alert('123');}
function test2(){alert('456');}

можно сделать перебор свойств window таким образом:
for (var key in window) alert(key+':' + window[key]);
или
for(prop in window) if (window.hasOwnProperty(prop)) {alert(prop)} (их тут мноого)
-но это НЕ покажет a,b,test1 и test2.
есть вариант посмотреть тексты скриптов, в которых находятся сами функции: window.document.scripts
но это даёт доступ к ТЕКСТАМ функций, но не к самим функциям.
прошу помощи
Ответить с цитированием
  #2 (permalink)  
Старый 02.07.2010, 14:14
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

С функциями всё просто: перебираете все глобальные функции, берёте у них toString() и смотрите, нет ли там function() { [native code] }.

С переменными всё сложнее, хотя бы потому, что могут быть переменные, которые являются свойствами window, а могут быть свойства window, которые не являются переменными. Переменные, например, невозможно удалить оператором delete.
Ответить с цитированием
  #3 (permalink)  
Старый 02.07.2010, 15:15
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Если это нужно для дебага, то можно открыть новое, пустое окно, пробежаться по объектам окон нового и старого окон, составить список свойств, а затем и убрать из списка те свойства, которые есть в новом окне.
Ответить с цитированием
  #4 (permalink)  
Старый 02.07.2010, 15:49
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Kolyaj
С функциями всё просто: перебираете все глобальные функции, берёте у них toString() и смотрите, нет ли там function() { [native code] }.
ага
а там просто строка с таким-вот значением)))
Ответить с цитированием
  #5 (permalink)  
Старый 02.07.2010, 15:55
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Gvozd,
не наличие смотреть, а чтобы тело функции только из этой строки состояло. Проблемы могут быть только в Опере 10, она для некоторых функций показывает что-то вроде
function addEventListener() { /* source code not available */ }
что уже является синтаксически верным кодом.
Ответить с цитированием
  #6 (permalink)  
Старый 02.07.2010, 16:16
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Спасибо за подсказку. По ходу пришлось сделать несколько уточняющих проверок. Так, например, toString() в некоторых случаях вызывает exception. Также выяснился интересный момент с Google Chrome... в результате получилось следующее:

var a=1; b = 2;
function test1(){alert('123');}
function test2(){alert('456');}
//...

for (var key in window) 
{
//if ( (typeof(window[key]) == 'function') && (window[key].toString().search('native code') == -1) ) // в Google Chrome цепляет ещё и тип [object Function]

if ( (window[key] instanceof Function) && (window[key].toString().search('native code') == -1) ) // проверка instanceof Function вместо typeof() - для Google Chrome
alert(window[key].toString());
}


Теперь вопрос: по Опере 10. У меня 10.53 - работает нормально
Реально 10-я не имеет в строке текст 'native code' ? Можете проверить?
ну и конечно... в IE вышеописанный код не работает...
Ответить с цитированием
  #7 (permalink)  
Старый 02.07.2010, 16:27
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

function k() {}
function a() {}
var ready = [];
for (var i in window) {
	if (window[i] instanceof Function) {
		var _str = ( window[i] + '' );
		if (_str.indexOf( '[native code]' ) + _str.indexOf( 'source code not available' ) == -2) {
			ready.push( window[i] );
		}
	}
}
alert( ready );

Последний раз редактировалось exec, 02.07.2010 в 16:29.
Ответить с цитированием
  #8 (permalink)  
Старый 02.07.2010, 16:39
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

to exec:
Ваш код не работает в Mozilla Firefox (3.6.4)
Ответить с цитированием
  #9 (permalink)  
Старый 02.07.2010, 17:15
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от subzey Посмотреть сообщение
Если это нужно для дебага, то можно открыть новое, пустое окно, пробежаться по объектам окон нового и старого окон, составить список свойств, а затем и убрать из списка те свойства, которые есть в новом окне.
-А это интересная идея... только открывать новое ОКНО никто не будет. думаю, что можно сделать так: в открытом окне броузера создать скрытый фрейм (IFRAME) и после этого проверить и сравнить все функции, содержащиеся в объекте window фрейма с функциями, содержащимися в объекте window главного окна броузера. Таким образом, мы выявим все пользовательские функции фрейма и избавимся от стандартных функций броузерного окна.
также ведь можно выловить и все глобальные переменные во фрейме?!

т.е. должно получиться что-то вроде:
цикл по всем свойствам window фрейма (или наоборот главного окна)
if (myframe[key] != window[key] ) 
alert('new!');

P.S. только фрейм должен быть загружен из родственного домена, иначе система безопасности не позволит получить его содержимое

Последний раз редактировалось Маэстро, 02.07.2010 в 17:52.
Ответить с цитированием
  #10 (permalink)  
Старый 02.07.2010, 17:31
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Маэстро
P.S. только фрейм должен быть загружен из родственного домена, иначе система безопасности не позволит получить его содержимое
Не надо его загружать.
_http://javascript.ru/forum/55219-post20.html
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список элементов в localStorage? Бобр Общие вопросы Javascript 8 17.09.2013 14:32
Как прочитать список имён элементов в Cookie? Бобр Общие вопросы Javascript 6 09.02.2010 08:47
Как по событию вызвать метод определенного экземпляра объекта jvs jQuery 3 24.12.2009 16:04
Как получить список всех установленных плагинов VitAngel Internet Explorer 0 15.07.2009 09:13
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00