Получить значение переменной из ‹iframe› или ‹object›

В моем глобальном HTML-шаблоне я встроил iframe, который может выполнять предварительный просмотр {{src}} (например, src может быть public/tmp/bDCZ5rynnpLaYNEuAAAj/index.html).

<iframe id="myiframe" ng-src="{{src}}"></iframe>

index.html — это файл, написанный моим сервером; У меня есть контроль над кодом, и я могу его модифицировать. index.html содержит код JavaScript, он разработан таким образом, что всегда имеет внутреннюю переменную $output.

Мой вопрос в том, как получить значение $output из iframe и сообщить значение глобальной html-странице.

Кто-нибудь знает, как это сделать?

Редактировать 1: я также открыт для решений, в которых index.html может отправить значение на сервер или создать файл со значением, если глобальный шаблон сможет получить его позже. Кроме того, как я упоминаю в комментариях, целью iframe является предварительный просмотр папки с файлами в реальном времени, есть другие способы сделать это (например, используя <object>), кто-нибудь знает, какой способ может позволить мне получить внутреннее значение?

Изменить 2: я создал плункер с iframe и плункер с объектом. $output определяется <script>var $output="Default"</script> в indexOutput.html. Моя цель - получить это значение.

Редактировать 3: я только что понял, что window.parent._resetter, предложенный @Roy в его ответе, работает. Но одно, функция _resetter должна быть определена в скрипте html страницы. Кто-нибудь знает, как передать это значение моему контроллеру? Вот плункер и плункер с $window.


person SoftTimur    schedule 10.03.2017    source источник
comment
На данный момент я выбираю iframe, потому что это просто. Существуют также другие варианты предварительного просмотра файлов.   -  person SoftTimur    schedule 10.03.2017
comment
Ни в чем не обижайтесь, SoftTimur, фреймы просты до тех пор, пока вы не столкнетесь с их ограничениями.   -  person lin    schedule 10.03.2017
comment
того же происхождения? @plnkr нет!   -  person lin    schedule 10.03.2017
comment
Я только что добавил версию с ui-view, это частичный вид, о котором вы говорили? сейчас такое же происхождение?   -  person SoftTimur    schedule 10.03.2017
comment
Нет, это не так. Я не буду помогать здесь. Моя роль — мальчик-комментатор. =) Я в порядке, пока держусь подальше от вопросов по iframe.   -  person lin    schedule 10.03.2017


Ответы (1)


Вы можете общаться между root и iframe с помощью window.parent.someFunction, вызываемого из iframe. Вы должны создать функцию в корне, которая получает параметр и устанавливает значение для себя.

function _resetter(param){
  var paramRoot = param;
}


И вызовите эту функцию из iframe, передав параметр ouput

window.parent._resetter(param);

См. https://stackoverflow.com/a/2161402/7349445.

person Roy Bogado    schedule 10.03.2017
comment
Примечание. Это работает только в том случае, если iframe имеет такое же происхождение, что и его родитель. - person lin; 10.03.2017
comment
Да, @SoftTimur сказал, что index.html — это файл, написанный моим сервером; - person Roy Bogado; 10.03.2017
comment
Да, это на том же сервере. Я немного изменил ОП. Я попытался определить $scope._resetter в контроллере. Вроде не называется. Может быть, window.parent плохо относится к $scope? - person SoftTimur; 10.03.2017
comment
@SoftTimur и теперь вы наткнулись на ограничение =) - person lin; 10.03.2017
comment
Ограничение касается вызова iFrame с локальным файлом или взаимодействия iFrame и angular? - person SoftTimur; 10.03.2017
comment
Взаимодействие с приложением JavaScript необычным способом. Здесь начинаются проблемы. знак равно - person lin; 10.03.2017
comment
Если я не буду использовать iframe для предварительного просмотра папки с файлами, какой путь здесь, по вашему мнению, позволит мне получить внутреннее значение вне? - person SoftTimur; 10.03.2017
comment
Используйте частичное представление AngularJS, и качество AngularJS будет вашим. - person lin; 10.03.2017
comment
Этот подход перестает работать, когда файлы представляют собой полноценные HTML-документы со ссылками и сценариями. - person Matt; 10.03.2017
comment
Можете ли вы сделать jsFiddle, показывающий проблему. Должно быть относительно легко решить ваши проблемы с областью видимости. - person Matt; 10.03.2017
comment
@ Йода, ему нужна твоя помощь. - person lin; 10.03.2017
comment
@Roy, на самом деле, window.parent работает, см. мою Редактировать 3. - person SoftTimur; 11.03.2017
comment
Я наконец нашел его. Нам нужно добавить $scope.$digest() для обновления представления. Вот рабочий plunker. - person SoftTimur; 15.03.2017