Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > iframe


Автор: YahоО 9.11.2023, 16:19
iframe бесконечен?


Пример - файл называется am.html :
Код

<!DOCTYPE html><html><head></head><body>
<iframe src="am.html" id="iframe" style="height:0;width:0"></iframe><br>
<script>

var d = 0;
if (window.top != window.self  && window.top == window.parent) {
  window.parent.postMessage(" my d= "+d++, "*");
}else if (window.top == window.self){
  window.addEventListener("message", function(event) {   
   document.body.innerHTML+= "top received: " + event.data+"<br>"
  });
}

</script></body></html>

По идее приведенный код должен выполниться один раз.
Но получается что проверка window.self  не срабатывает как задумано, и передачи не останавливаются, как его переделать? 
(вариант с одним и тем же файлом, не с двумя файлами)

Автор: Oldshelf 11.11.2023, 05:48
IMHO, тут что-то не так с модификацией document'а. Из-за этого iframe постоянно пересоздаётся и получается этот эффект. Потому что если заменить нотификацию на alert:

Код

<!DOCTYPE html><html><head></head><body>
<iframe src="am.html" id="iframe" style="height:0;width:0"></iframe><br>
<script>
var d = 0;
if (window.top != window.self  && window.top == window.parent) {
  window.parent.postMessage(" my d= "+d++, "*");
}else if (window.top == window.self){
  window.addEventListener("message", function(event) {   
//   document.body.innerHTML+= "top received: " + event.data+"<br>"
   alert("top received: " + event.data+"<br>");
  });
}
</script></body></html>


- то всё заработает нормально.

Автор: YahоО 12.11.2023, 12:10
Если просто добавить alert не удаляя в комментарий innerHTML, то цикличность продолжается с замедлением на время нажатий "ОК" :
Код

<!DOCTYPE html><html><head></head><body>
<iframe src="am.html" id="iframe" style="height:0;width:0"></iframe><br>
<script>
var d = 0;
if (window.top != window.self  && window.top == window.parent) {
  window.parent.postMessage(" my d= "+d++, "*");
}else if (window.top == window.self){
  window.addEventListener("message", function(event) {   
   document.body.innerHTML+= "top received: " + event.data+"<br>";
   alert("top received: " + event.data);  
  });
}
</script></body></html>

и по прежнему проверка window.top == window.self не срабатывает так как ожидается, т.е. именно эта точка проявляет несовершенство и недоработку, и похоже это зависит не браузера, но от js.
Задачу конечно можно решить, но только прибегнув к помощи другого файла считающего количество загружаемых iframe, и тогда это будет называться костылем.

Добавлено через 4 минуты и 58 секунд
И можно решить проблему даже в одном файле:
Код

<!DOCTYPE html><html><head></head><body>
<iframe src="am.html" id="iframe" style="height:0;width:0"></iframe><br>
<div id="dd"></div>
<script>
var d = 0;
if (window.top != window.self  && window.top == window.parent) {
  window.parent.postMessage(" my d= "+d++, "*");
}else if (window.top == window.self){
  window.addEventListener("message", function(event) {
   dd.innerHTML+= "top received: " + event.data+"<br>"     
  });
}
</script></body></html>

без костыля.

Добавлено через 7 минут и 9 секунд
Oldshelf спасибо за подсказку, именно благодаря ей удалось найти решение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)