2010-11-23 4 views
2

Прежде чем задать вопрос, позвольте мне предисловие к этому факту, что я работаю над очень нетипичным проектом. Меня не интересуют проблемы безопасности или кросс-браузер. Я использую пользовательскую сборку проекта Chromium.Определите, какой кадр (имя) называется функцией в JavaScript.

Мой вопрос: если я вызываю функцию из другого пространства имен, как определить исходное пространство имен?

Например, предположим, что у меня есть три кадра:

1. window 
    -> 2. frame1 //is a child of window 
    -> 3. frame2 //is a child of window 

Теперь, позволяет сказать, что некоторые JavaScript в window имеет функцию под названием doStuff(), что я даю frame1 и frame2 доступ к перейдя:

var localDoStuff = top.doStuff; 

Внутри функции doStuff, есть ли способ определить, какой из frame1 и frame2 назвал его? i.e: Если я вызываю localDoStuff в рамках frame1, могу ли я получить объект окна DOM frame1 в рамках doStuff?

Если я использую arguments.callee.caller, он дает строковое представление функции, которая его вызывала. Тем не менее, я хочу получить область , в которой эта функция была определена.

I У есть доступ к источнику браузера, если у кого есть хорошая, направленная идея о том, как изменить браузер, чтобы это разрешить.

Pasted от комментариев: я в основном эмулирует операционную систему, которая работает несколько приложений. Каждое из этих приложений представляет собой iframe, который имеет доступ к API, определенному в родительском фрейме приложений. Предположим, что у этого API была функция requestFocus() - без аргументов, как определено в спецификации API, которую я реализую. Чтобы дать правильный фокус iframe, я должен был бы знать, какой iframe называется функцией requestFocus. Я знаю, что это не идеальная ситуация - я не писал спецификации API, к сожалению ...

Спасибо за вашу помощь. Я знаю, что это действительно странный вопрос.

+0

Есть много хаков, о которых я могу думать, но это, похоже, не имеет смысла ... Зачем вам нужно знать, какой кадр назвал его? Если вам нужен объект окна, вы должны пройти его с помощью своих вызовов. – 2010-11-23 01:07:59

ответ

3

Поскольку разные кадры имеют различные Function конструкторов, вы можете обнаружить его так:

function doStuff() { 
    if (doStuff.caller instanceof Function) { 
     // called from top 
    } else if (doStuff.caller instanceof frame1.contentWindow.Function) { 
     // called from frame1 
    } ... 
} 

Однако это не работает, если функция вызывается из кода верхнего уровня, и в этом случае doStuff.caller === null.

Мне действительно интересно узнать, есть ли у кого-нибудь решение для этого.

1

Возможный ответ, передайте объект окна в своих аргументах, и ваша функция будет действовать на основе того, какое окно было передано. Если они называются фреймами, окна должны иметь свойство name.

EDIT: Альтернативное решение

Вот техника, которую вы можете использовать, если вы создаете плавающие фреймы, и вы хотите, чтобы скрыть окно параметров requestFocus от вызывающего абонента в пределах фрейма:

После того, как вы создаете iframe, вы подключаете оболочку requestFocus в окно iframe, которое передает свое собственное окно.

Таким образом, при создании контента для фрейма, вы можете создать функцию, как следующее в каждом IFRAME:

function requestFocus() { 
    parent.requestFocus(window); 
} 

Как я уже сказал, я не думаю, что вы можете уйти от прохождения окна объект, но вы можете хотя бы скрыть это от вызывающего. Кроме того, только потому, что вы не писали API, это не значит, что у вас не должно быть никакого ввода. То, что вы просите (автомагический определить, какой кадр называют меня) просто не поддерживает JS и звучит как плохой дизайн в первую очередь

+0

Хм, это отличная идея. Я должен был упомянуть, что я реализую API, а это значит, что я не могу отклоняться от спецификации API. К сожалению, я должен придерживаться довольно ограниченного набора аргументов. – 2010-11-23 01:12:07

+0

Объясните, почему вы хотите этого поведения, люди могут помочь вам с альтернативами – 2010-11-23 01:16:39

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