#javascript #dom
Вопрос:
Я борюсь со сложной проблемой в JavaScript: есть ли способ определить, в каком окне вызывалась функция в другом окне? Рассмотрим веб-сайт a.com/foo
, который встраивает iframe, загруженный с a.com/bar
. Оба фрейма имеют одинаковое происхождение, поэтому имеют доступ к глобальному объекту окна друг друга.
Теперь iframe, запущенный при a.com/bar
вызове функции foo
, имеет глобальную область действия в родительском окне. Есть ли какой-либо способ определить внутри foo
функции, что она была вызвана iframe? В частности, мне нужна ссылка на окно iframe внутри foo
функции.
Есть два ограничения:
- Мы не можем изменить вызов функции
window.parent.foo()
, так как мы не можем вносить изменения в исходный кодa.com/bar
. - Мы не можем просто запустить
window.frames[0]
foo
функцию, чтобы получить ссылку, так как существует много iframe, и нам нужно знать, какой iframe вызвалfoo
функцию (в данном случае iframe включенa.com/bar
).
// a.com/foo embeds a.com/bar as iframe
// Running on a.com/foo
window.foo = function() {
// window.location.href = "a.com/foo"
// Q: How to get a reference to caller's window (the iframe on a.com/bar)?
}
// Running on a.com/bar
window.parent.foo(); // This call is fix, we cannot make changes in this iframe.
Любая помощь или идеи будут высоко оценены. Заранее спасибо!
Хорошего вам дня!
Комментарии:
1. Когда iframe вызывает родительскую функцию Windows? Задействовано ли взаимодействие с пользователем? Если это так,
document.activeElement
возможно, это поможет вам избежать петли.2. Нет, вы не можете, и нет, функция не должна заботиться о своем вызывающем объекте. Для чего вам это нужно? Используйте аргументы и возвращаемые значения для связи с вызывающим абонентом.
3. На самом деле, я не знаю, когда iframe вызывает функцию родительского окна, это просто делается случайным образом внутри iframe. Мне это нужно для какого-то расширения Chrome, которое я пишу в тестовых целях. Я знаю, что при нормальных обстоятельствах не существует законного случая использования, когда это необходимо. Вот почему я не могу изменить вызывающих абонентов, но я могу изменить вызываемого абонента, перезаписав / обернув его функцию.