Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 10.04.2018, 00:47
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

j0hnik, подвох в том, что при document.write - window как-то обнуляется, т.е. ссылка на него остаётся та же, но он рефрешится. А все глобальные переменные остаются на месте.

Решение:

(function() {

	var frame = document.createElement('iframe');
	frame.sandbox = 'allow-scripts';

	var write = function(content) {
		frame.contentWindow.postMessage(JSON.stringify({type: 'write', value: content}), '*');
	};

	var close = function() {
		frame.contentWindow.postMessage(JSON.stringify({type: 'close'}), '*');
	};

	frame.onload = function() {
		this.onload = null;
		write('<div>Line 1</div>');
		write('<div>Line 2</div>');
		write('<b>Bold text</b>');
		close();
		write('<div>Line 3</div>');
		write('<div>Line 4</div>');
		write('<b>Bold text</b>');
		close();
	};

	frame.src = 'data:text/html,' + encodeURIComponent(`
		<script>
			(function() {
				var documentWrite = document.write.bind(document);
				
				var onMessage = function(event) {
					var data = JSON.parse(event.data);
					
					if(data.type === 'write') {
						document.write(data.value);
					}
					else if(data.type === 'close') {
						document.close();
					}
				};
				
				document.write = function(content) {
					var refreshed = document.readyState !== 'loading';
					
					documentWrite(content);
					
					if(refreshed) {
						window.onmessage = onMessage;
					}
				};
				
				window.onmessage = onMessage;
			})();
		<\/script>	
	`);

	document.addEventListener('DOMContentLoaded', function() {
		document.body.appendChild(frame);
	});

})();

Последний раз редактировалось ruslan_mart, 10.04.2018 в 01:03.
Ответить с цитированием
  #12 (permalink)  
Старый 10.04.2018, 09:35
Аватар для brizing
Интересующийся
Отправить личное сообщение для brizing Посмотреть профиль Найти все сообщения от brizing
 
Регистрация: 08.02.2014
Сообщений: 23

Сообщение от ruslan_mart
подвох в том, что при document.write - window как-то обнуляется, т.е. ссылка на него остаётся та же, но он рефрешится. А все глобальные переменные остаются на месте.
Документ перезаписывается.
Обработчик события висит на документе, так что он пропадает.
Можно заново назначать обработчик.

(function() {

	var frame = document.createElement('iframe');

	var write = function(content) {
		frame.contentWindow.postMessage(content, '*');
	};

	frame.onload = function() {
		write('<div>Line 1</div>');
		write('<div>Line 2</div>');
	};

	frame.src = 'data:text/html,' + encodeURIComponent(`
		<script>
			var onMessage = function onMessageFn (event) {
				console.log(event.data);
				document.write(event.data);
				window.onmessage = onMessageFn;
			};
			window.onmessage = onMessage;
		<\/script>	
	`);

	document.addEventListener('DOMContentLoaded', function() {
		document.body.appendChild(frame);
	});

})();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная связь ПРИ ПОМОЩИ JavaScript qwertypop Элементы интерфейса 2 23.04.2009 18:30
установка позиции курсора или выделения в iframe mister_maxim Events/DOM/Window 5 18.04.2009 10:43
Завершение процесса воспроизведения видео при закрытии окна IE skif Общие вопросы Javascript 0 11.03.2009 08:11
Проблема в document.write при использовании setInterval() GOll Общие вопросы Javascript 21 06.10.2008 17:38
Теряется event при перемещении объекта (Drag&Drop) seagor Events/DOM/Window 16 25.07.2007 01:28