Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   тэг script, загружающий iframe (https://javascript.ru/forum/events/38479-tehg-script-zagruzhayushhijj-iframe.html)

keen 03.06.2013 17:53

тэг script, загружающий iframe
 
день добрый.

имеется некая html-страница, в содержимое которой добавляется код вида
<script src="/js/loader.js?container='#div'" type="text/javascript"></script>


каким образом осуществить загрузку фрейма этим скриптом?
какое содержимое должно быть у этого js-файла?
я вот набросал примерно такое, но не уверен насколько оно работоспособно:
var idFrame = 'frameDownload';
var frame = document.getElementById(idFrame);
if (!frame) {
frame = document.createElement('iframe');
frame.id = idFrame;
frame.style.display = 'none';
document.body.appendChild(frame);
}
frame.src = './1.html';

плюс тут же возникает как минимум пара вопросов:
могу ли я таким образом загружать страницы с других доменов?
как вытащить параметр из подключаемого скрипта (?container='#div'), чтобы можно было загружать фрейм в элемент по этому селектору?
jsonp, очевидно, но как именно - слабо себе представляю.

с одной стороны задача несложная, и изобретать велосипед не хочется; с другой - что-то толковых реализаций нагуглить не получилось)

что скажете?

спасибо заранее

Deff 03.06.2013 19:12

<script id="frameScript" src="/js/loader.js?container=#div" type="text/javascript"></script>

Параметр вытащить по ID скрипта, хотя можно парсить все скрипты с src и анализировать атрибут
собственно по ID
var param=document.getElementById('frameScript').src.split('?container=')[1]

Цитата:

Сообщение от keen
могу ли я таким образом загружать страницы с других доменов?

можете - но последующего доступа скриптом со страницы создания к документам с других доменов во фрейме, - не будет

Aetae 03.06.2013 20:19

Все скрипты парсить не надо. Если не используется отложенная загрузка то последний на момент вызова скрипт в dom и есть наш скрипт.

keen 03.06.2013 20:22

мне кажется, это меньшая из проблем.
парсить как jsonp, у которого есть параметр callback. только параметр будет ещё один - container.

Deff 03.06.2013 20:24

Ну как вариант еще:
вызвать функцию из подгруженного cкрипта по onload
<script type="text/javascript" src="/js/loader.js?container=#div" onload="getParametr(this)"></script>

Aetae 03.06.2013 20:27

Цитата:

Сообщение от keen (Сообщение 254317)
мне кажется, это меньшая из проблем.
парсить как jsonp, у которого есть параметр callback. только параметр будет ещё один - container.

Это понятно, мы обсуждаем варианты без привлечения сервера.(мы же javascript-извращенцы)

Deff, некрасивые ты варианты предлагаешь, даром что рабочие.)

keen,

Если с сервером не вижу проблем:
<script src="/js/loader.php?container=div" type="text/javascript"></script>
<?php хэдер файла - javascript ?>
var idFrame = "<?php гет[container] ?>";
var frame = document.getElementById(idFrame);
if (!frame) {
frame = document.createElement('iframe');
frame.id = idFrame;
frame.style.display = 'none';
document.body.appendChild(frame);
}
frame.src = './1.html';


Страницы в таком фрейме могут быть точно такие же какие могут быть в любом другом фрейме.

Deff 03.06.2013 20:36

Ну типично у фрейма еще и namе - особенно если с ним работать скриптами
И проще имхо не задавать атрибуты фрейма, а вклеивать тег <iframe> целиком в div, через innerHTML, ибо по большому счету у фрейма достаточно много праметров, а так как загрузка долгая, лишняя обертка в div незначительна

А затем div => document.body.appendChild(div);

danik.js 04.06.2013 05:39

Если параметр container разбирать на клиенте, то удобней выделить его в data-аттрибут. Ведь ачем создавать себе лишние сложности?

keen 04.06.2013 12:10

Aetae,
сервера не будет.

а какие-то более-менее целостные и логически завершённые куски кода вообще будут? :)

danik.js 04.06.2013 16:01

<div id="div" style="border:1px solid"></div>
<script data-target="#div">
(function(){
	var script = document.scripts[document.scripts.length - 1];
	var target = document.querySelector(script.getAttribute('data-target'));

	var frameId = 'frameDownload';
	var frame = document.getElementById(frameId);
	if (!frame) {
		frame = document.createElement('iframe');
		frame.id = frameId;
		//frame.style.display = 'none';
		target.appendChild(frame);
	}
	frame.src = '//javascript.ru';
})()
</script>

keen 07.06.2013 10:09

да, мерси, почти то что нужно.

остальную часть задачи - обмен данными между основной страницей и фреймом решил с помощью postMessage.

спасибо всем откликнувшимся :victory:


Часовой пояс GMT +3, время: 20:35.