Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как получить список пользовательских функций объекта window? (https://javascript.ru/forum/events/10397-kak-poluchit-spisok-polzovatelskikh-funkcijj-obekta-window.html)

Маэстро 02.07.2010 14:00

Как получить список пользовательских функций объекта 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
но это даёт доступ к ТЕКСТАМ функций, но не к самим функциям.
прошу помощи ;)

Kolyaj 02.07.2010 14:14

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

С переменными всё сложнее, хотя бы потому, что могут быть переменные, которые являются свойствами window, а могут быть свойства window, которые не являются переменными. Переменные, например, невозможно удалить оператором delete.

subzey 02.07.2010 15:15

Если это нужно для дебага, то можно открыть новое, пустое окно, пробежаться по объектам окон нового и старого окон, составить список свойств, а затем и убрать из списка те свойства, которые есть в новом окне.

Gvozd 02.07.2010 15:49

Цитата:

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

ага
а там просто строка с таким-вот значением)))

Kolyaj 02.07.2010 15:55

Gvozd,
не наличие смотреть, а чтобы тело функции только из этой строки состояло. Проблемы могут быть только в Опере 10, она для некоторых функций показывает что-то вроде
function addEventListener() { /* source code not available */ }
что уже является синтаксически верным кодом.

Маэстро 02.07.2010 16:16

Спасибо за подсказку. По ходу пришлось сделать несколько уточняющих проверок. Так, например, 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 вышеописанный код не работает... :(

exec 02.07.2010 16:27

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 );

Маэстро 02.07.2010 16:39

to exec:
Ваш код не работает в Mozilla Firefox (3.6.4)

Маэстро 02.07.2010 17:15

Цитата:

Сообщение от subzey (Сообщение 61975)
Если это нужно для дебага, то можно открыть новое, пустое окно, пробежаться по объектам окон нового и старого окон, составить список свойств, а затем и убрать из списка те свойства, которые есть в новом окне.

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

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

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

Kolyaj 02.07.2010 17:31

Цитата:

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

Не надо его загружать.
_http://javascript.ru/forum/55219-post20.html

Маэстро 02.07.2010 20:05

а что же делать с IE ?
вот такой скрипт выводит список всех функций (в том числе и пользовательских), содержащихся в javascript-объекте window:
for (var key in window) document.write(typeof(window[key]) + ' - ' + key + '<br>');

но в Internet Explorer функции не выводятся! отображается список только объектов и некоторых переменных броузерного окна.
Что делать? Как получить список функций?

x-yuri 03.07.2010 07:59

имеет смысл осветить цель всех этих танцев с бубном, я считаю

Маэстро 03.07.2010 12:16

Цитата:

Сообщение от x-yuri (Сообщение 62048)
имеет смысл осветить цель всех этих танцев с бубном, я считаю

OK.
Есть большой проект (сайт - веб-приложение). Моя задача - это небольшая часть проекта.
В приложении есть небольшое ядро javascript-функций. Все остальные функции догружаются к сайту в процессе вызова тех или иных прикладных функций. При этом на сайт могут "приехать" как уже загруженные ранее javascript-функции, так и новые. Уже имеющиеся функции надо "пропустить мимо", а новые добавить к ядру. Ситуация ещё усложняется тем, что новые скрипты могут добавлять сторонние разработчики (доверенные лица). При этом они могут в своих скриптах использовать js-функции как ядра, так и функции других разработчиков. Короче, полная свобода действий :)
Сейчас для объявления новых функций разработчик обязан передать их в спецмассиве, т.е. просто перечислить их имена приблизительно так:

var ScriptFunctions = ['getpicture', 'settext', 'functionmama', 'functionpapa', ...,];
Ядро приложения, получив список этих функций, подключает их к себе.
Это мне не нравится. Нужно постоянно не забыть вставить в этот список мои функции и, возможно, не забыть исправить названия.
Сами функции уже есть в принятом файле (htm, php, ...) и перечислять их имена - это избыточность. Можно было бы просто прошерстить объект window и взять перечень функций. Но IE их не показывает (остальные броузеры - OK).
Не сильно я вас запутал? :)

subzey 03.07.2010 13:20

Что-то Вы не так делаете, мне кажется.
Почему нельзя подключать нужные функции, динамически создавая элемент script и вставляя их сразу в нужное место?


Часовой пояс GMT +3, время: 11:32.