Показать сообщение отдельно
  #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.
Ответить с цитированием