Как получить список пользовательских функций объекта 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 |
а что же делать с IE ?
вот такой скрипт выводит список всех функций (в том числе и пользовательских), содержащихся в javascript-объекте window: for (var key in window) document.write(typeof(window[key]) + ' - ' + key + '<br>'); но в Internet Explorer функции не выводятся! отображается список только объектов и некоторых переменных броузерного окна. Что делать? Как получить список функций? |
имеет смысл осветить цель всех этих танцев с бубном, я считаю
|
Цитата:
Есть большой проект (сайт - веб-приложение). Моя задача - это небольшая часть проекта. В приложении есть небольшое ядро javascript-функций. Все остальные функции догружаются к сайту в процессе вызова тех или иных прикладных функций. При этом на сайт могут "приехать" как уже загруженные ранее javascript-функции, так и новые. Уже имеющиеся функции надо "пропустить мимо", а новые добавить к ядру. Ситуация ещё усложняется тем, что новые скрипты могут добавлять сторонние разработчики (доверенные лица). При этом они могут в своих скриптах использовать js-функции как ядра, так и функции других разработчиков. Короче, полная свобода действий :) Сейчас для объявления новых функций разработчик обязан передать их в спецмассиве, т.е. просто перечислить их имена приблизительно так: var ScriptFunctions = ['getpicture', 'settext', 'functionmama', 'functionpapa', ...,]; Ядро приложения, получив список этих функций, подключает их к себе. Это мне не нравится. Нужно постоянно не забыть вставить в этот список мои функции и, возможно, не забыть исправить названия. Сами функции уже есть в принятом файле (htm, php, ...) и перечислять их имена - это избыточность. Можно было бы просто прошерстить объект window и взять перечень функций. Но IE их не показывает (остальные броузеры - OK). Не сильно я вас запутал? :) |
Что-то Вы не так делаете, мне кажется.
Почему нельзя подключать нужные функции, динамически создавая элемент script и вставляя их сразу в нужное место? |
Часовой пояс GMT +3, время: 20:26. |