Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Fancybox - передать значение в iframe (https://javascript.ru/forum/jquery/54229-fancybox-peredat-znachenie-v-iframe.html)

spo 09.03.2015 20:34

Fancybox - передать значение в iframe
 
На странице есть две ссылки с rel="a" и rel="b".
При клике на любую из них всплывает окно(fancybox iframe), внутри которого есть два абзаца p с классами class="a" и class="b" соотвественно.
Задача заключается в том чтобы при клике по ссылкам, устанавливать для одного из абзацев класс "show".

Возможно ли передать значение в iframe?

Код приведенный ниже конечно же не работает, если попытаться вывести значение rel из iframe.

var rel;

$('a.fancybox').fancybox({
	beforeLoad : function() {         
		if ($(this.element).attr('rel') == 'a') {
			rel = 'a';
		} else if ($(this.element).attr('rel') == 'b') {
			rel = 'b';
		}
	}
});

dd_smol 09.03.2015 22:45

<a rel="a" href="#">Первая ссылка</a>
<a rel="b" href="#">Вторая ссылка</a>

<iframe id="iframe" src="test.html">
	<!DOCTYPE html>
	<html>
	<head>
		<title>&nbsp;</title>
		<meta charset="utf-8" />
		<style>
			.show{color:red;}
		</style>
	</head>
	<body>
		<p class="a">Первый параграф</p>
		<p class="b">Второй параграф</p>
	</body>
	</html>
</iframe>

jQuery(function($) {
	$('a[rel]').each(function() {
		$(this).on('click', function() {
			$( $('#iframe')[0].contentWindow.document )
				.find('.' + $(this).attr('rel')).addClass('show');
			return false;
		});
	});
});

рони 09.03.2015 22:49

Цитата:

Сообщение от dd_smol
each

зачем?

dd_smol 09.03.2015 22:53

Привычка :)

spo 09.03.2015 23:00

dd_smol, ссылки имеют вид
<a rel="a" class="fancybox.iframe" href="test.html">a</a>
и никакого тега iframe на странице нет. Содержимое test.html и есть всплывающее окно.

dd_smol 09.03.2015 23:09

Цитата:

Сообщение от spo (Сообщение 360412)
dd_smol, ссылки имеют вид
<a rel="a" class="fancybox.iframe" href="test.html">a</a>
и никакого тега iframe на странице нет. Содержимое test.html и есть всплывающее окно.

Возьмите объект документа всплывающего окна и замените им объект документа фрейма и получится тоже самое.

Извиняюсь возможно что-то не то говорю просто не работал с данным плагином и внутреннего устройства его не знаю.

рони 09.03.2015 23:38

Цитата:

Сообщение от spo
test.html

эта страница ваша?

рони 09.03.2015 23:44

spo,
в afterLoad fancybox можно поставить код который вам показал dd_smol, вот тут понадобится each, чтобы обработать каждую ссылку индивидуально

spo 09.03.2015 23:56

Цитата:

Сообщение от dd_smol (Сообщение 360413)
...Возьмите объект документа всплывающего окна и замените им объект документа фрейма...

Логика понятна, но как именно это сделать я не знаю.

рони 10.03.2015 00:17

spo,
вариант предложенный dd_smol, работает -- смотреть тут

http://learn.javascript.ru/play/TDwbEb

spo 10.03.2015 07:18

Спасибо, настроил и как обычно есть одно маленькое НО.

У меня сразу после загрузки DOM окна, запускается функция которая работает с этим классом "show". И получается что она срабатывает перед назначением класса.

Я пробовал вместо afterLoad поставить beforeLoad, но тогда конечно приведенный вами пример не будет работать.

В общем получается что клик по ссылке находится в index.html а функция обрабатывающая класс show в test.html

dd_smol 10.03.2015 07:46

Все то же что описано выше плюс можно немного уточнить какой именно фрейм брать если он на страницы не один.
$('iframe[src$=' + el.href + ']')

spo 10.03.2015 07:50

dd_smol, фрейм то один test.html

dd_smol 10.03.2015 08:02

Цитата:

Сообщение от spo (Сообщение 360447)
dd_smol, фрейм то один test.html

Сегодня один, а завтра появится другой это всего на всего мера предосторожности.
Можно пример функции, которая раньше времени отрабатывает.

spo 10.03.2015 10:36

dd_smol, вот примерно так:
function init() {...}	
google.maps.event.addDomListener(window, 'load', init);

dd_smol 10.03.2015 13:06

События load не подходит для запуска функции так как класс еще не добавлен к параграфу.
Может попробовать запустить функцию после добавления класса?

jQuery(function($) {
	$('a[rel]').each(function(i, el) {
		$(this).fancybox( {
			href : el.href,
			type: "iframe",
			afterLoad: function() {
				var winFrame = $('iframe[src$="' + el.href + '"]')[0].contentWindow;

                $( winFrame.document ).find('.' + $(el).attr('rel')).addClass('show');

				// Запустить функцию после добавления класса
				winFrame.init();
            }
		});
		
	});
});


http://learn.javascript.ru/play/sOxOx

spo 10.03.2015 21:51

dd_smol, событие load взято из примера google maps api.
В том то и дело что во фрейме код google map, который в зависимости от того какому элементу назначен класс curr, устанавливает на карте метки из одного или другого массивов.

На главной странице (index.html) две ссылки "карта компании" и "диллеры", при клике на которые всплывает окно (map.html).
В файле map.html находятся две ссылки аналогичные тем что в файле index.html и код добавляющий карту.
В данном коде есть проверка какая из двух ссылок имеет класс curr.

Таким образом в index.html
<a rel="a" class="fancybox.iframe" href="map.html">a</a>
<a rel="b" class="fancybox.iframe" href="map.html">b</a>

и js
$('a[rel]').each(function(i, elem) {
	$(this).fancybox({
		afterLoad: function() {$($('iframe')[0].contentWindow.document).find('.' + $(elem).attr('rel')).addClass('curr')}
	})
});

В map.html
<a class="a" href="#">a</a>
<a class="b" href="#">b</a>

и js
function init() {
	// google maps code
	coords();
}
function coords() {if($('.a').hasClass('curr')) {coords1()} else {coords2()}}
google.maps.event.addDomListener(window, 'load', init);

рони 10.03.2015 21:57

spo,
google.maps.event.addDomListener(window, 'load', window.setTimeout(init, 1000));

spo 10.03.2015 22:37

рони, такое решение не хотелось использовать

dd_smol 11.03.2015 07:35

А если обернуть вызов метода в промежуточную функцию и вызвать ее по тому принципу что я предложил выше?

function testFunc() {
	google.maps.event.addDomListener(window, 'load', init);
}


jQuery(function($) {
	$('a[rel]').each(function(i, el) {
		$(this).fancybox( {
			href : el.href,
			type: "iframe",
			afterLoad: function() {
				var winFrame = $('iframe[src$="' + el.href + '"]')[0].contentWindow;

                $( winFrame.document ).find('.' + $(el).attr('rel')).addClass('show');

				// Запустить функцию после добавления класса
				winFrame.testFunc();
            }
		});
		
	});
});

рони 11.03.2015 10:06

Цитата:

Сообщение от dd_smol
winFrame.init();

самый нормальный способ - только убрать строку

google.maps.event.addDomListener(window, 'load', init); -- это лишнее тогда

spo 11.03.2015 12:14

dd_smol, рони, огромное вам спасибо! Все работает просто чудесно.


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