Как определить окно, которое вызывает функцию в другом окне в JavaScript

#javascript #dom

Вопрос:

Я борюсь со сложной проблемой в JavaScript: есть ли способ определить, в каком окне вызывалась функция в другом окне? Рассмотрим веб-сайт a.com/foo , который встраивает iframe, загруженный с a.com/bar . Оба фрейма имеют одинаковое происхождение, поэтому имеют доступ к глобальному объекту окна друг друга.

Теперь iframe, запущенный при a.com/bar вызове функции foo , имеет глобальную область действия в родительском окне. Есть ли какой-либо способ определить внутри foo функции, что она была вызвана iframe? В частности, мне нужна ссылка на окно iframe внутри foo функции.

Есть два ограничения:

  1. Мы не можем изменить вызов функции window.parent.foo() , так как мы не можем вносить изменения в исходный код a.com/bar .
  2. Мы не можем просто запустить 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, которое я пишу в тестовых целях. Я знаю, что при нормальных обстоятельствах не существует законного случая использования, когда это необходимо. Вот почему я не могу изменить вызывающих абонентов, но я могу изменить вызываемого абонента, перезаписав / обернув его функцию.