Как получить список пользовательских функций объекта 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 но это даёт доступ к ТЕКСТАМ функций, но не к самим функциям. прошу помощи ;) |
С функциями всё просто: перебираете все глобальные функции, берёте у них toString() и смотрите, нет ли там function() { [native code] }.
С переменными всё сложнее, хотя бы потому, что могут быть переменные, которые являются свойствами window, а могут быть свойства window, которые не являются переменными. Переменные, например, невозможно удалить оператором delete. |
Если это нужно для дебага, то можно открыть новое, пустое окно, пробежаться по объектам окон нового и старого окон, составить список свойств, а затем и убрать из списка те свойства, которые есть в новом окне.
|
Цитата:
а там просто строка с таким-вот значением))) |
Gvozd,
не наличие смотреть, а чтобы тело функции только из этой строки состояло. Проблемы могут быть только в Опере 10, она для некоторых функций показывает что-то вроде function addEventListener() { /* source code not available */ }что уже является синтаксически верным кодом. |
Спасибо за подсказку. По ходу пришлось сделать несколько уточняющих проверок. Так, например, 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 вышеописанный код не работает... :( |
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 ); |
to exec:
Ваш код не работает в Mozilla Firefox (3.6.4) |
Цитата:
также ведь можно выловить и все глобальные переменные во фрейме?! т.е. должно получиться что-то вроде: цикл по всем свойствам window фрейма (или наоборот главного окна) if (myframe[key] != window[key] ) alert('new!'); P.S. только фрейм должен быть загружен из родственного домена, иначе система безопасности не позволит получить его содержимое |
Цитата:
_http://javascript.ru/forum/55219-post20.html |
Часовой пояс GMT +3, время: 15:17. |