2010-02-09 1 views
9

Я пытаюсь закрыть FancyBox из iframe, но parent.$ всегда undefined. Это мой IFrame JavaScript:

<script type='text/javascript' 
    src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'> 
</script> 
<script type="text/javascript"> 
jQuery(document).ready(function($){ 
    (function($) { 
     $.fn.closeFancyBox = function() { 
      $(this).click(function() { 
       parent.$.fancybox.close(); 
      }); 
     }; 
     })(jQuery); 
     $('#cancel').closeFancyBox(); 
     }); 
}); 
</script> 

Замена parent.$.fancybox.close(); с alert('clicked'); работает просто отлично. Я не понимаю, почему parent.$ является undefined, когда iframe находится в том же домене.

Я использую WordPress 2.9.1, с плагином FancyBox для Wordpress.

  • главная страница: //server.local/web/test/index.php
  • IFrame страница: //server.local/web/test/wp-content/plugins/wp-test/test.htm

Первый из этих URL', главная страница, вторая страница IFrame; server.local - мой домашний тестовый сервер.

Любые идеи? Я могу использовать весь исходный код, если это будет полезно.

ответ

0

Провел немало часов, пытаясь отладить это и не получил нигде. Итак, я отключил плагин «FancyBox для WordPress» с последней версией FancyBox, и он был исправлен. Действительно, следовало бы попробовать это раньше.

Проведя некоторое время с помощью WordPress и его различных плагинов, я бы рекомендовал вызывать вещи вручную, полагаясь только на плагины. Это просто добавляет еще один уровень сложности, который, если вы знаете, что делаете, не обязательно должен быть там.

Благодаря Doug для указания соответствующего синтаксиса iframe на родительское окно jQuery в WordPress.

7

Не определено, потому что WordPress запускает jQuery в noConflict режиме. Используйте вместо этого:

parent.jQuery.fancybox.close(); 

noConflict режим означает $ не равен JQuery. Вы должны явно использовать jQuery для доступа к тому, что вы обычно можете получить с помощью $.

+0

К сожалению, должен сказать, что я знаю об этом; js, который я включил, был фрагментом. Я отредактировал свой вопрос, чтобы отразить это - передача $ означает, что мне не нужно использовать «jQuery». – Aleksandr

+0

@Aleksandr Передача '$' в 'iframe' вообще не влияет на родительскую страницу. Фактически, вы включаете полностью отдельный экземпляр jQuery в 'iframe'. Если вы заметили, что вы написали, вы передаете '$', но ссылаетесь на 'parent. $'. Это как будто у вас есть var var = 1; alert (obj.a); 'Вы не ожидали, что два элемента будут ссылаться на одно и то же значение, если в коде не было присвоения. –

+0

Вы правы, это имеет смысл. Однако, используя следующий код: 'jQuery ('# cancel'). Click (function() {parent.jQuery.fancybox.close();});' Я все еще получаю ошибки 'undefined' в Firebug:' parent. jQuery.fancybox undefined'. У вас есть идеи, почему это может быть? Спасибо за вашу помощь! Я все еще очень новичок в JavaScript и кодировании в целом. – Aleksandr

2

Это работает для меня;)

<a href="javascript:parent.jQuery.fn.fancybox.close();" > 

Спасибо за этот пост, он на самом деле вел меня немного ... Я чувствую себя плохо, потому что у меня ушло всего несколько минут, и я знаю, как разочарование FancyBox для Wordpress!

0

HI, Тот, кто испытывает проблемы закрывающую Fancy Box IFrame используя инструкцию по установке из Fancy Box в Wordpress 3.0:

Используйте эту ссылку в IFRAME:

<a href="#" onClick="parent.jQuery.fancybox.close();" title="Close window">close fancybox</a> 

Он работает :)

1

Ни один из предложений не работал для меня. Мне пришлось обходить его, используя следующий код. В последней версии может поддерживаться parent.jQuery.fancybox.close(); но старые версии не работают с этим.

Для существующих сайтов с более старыми версиями плагинов/Jquery, попробуйте это

function close_window() 
{ 
$("#fancy_outer",window.parent.document).hide(); 
$("#fancy_overlay",window.parent.document).hide(); 
//window.top.window.$.fancybox.close(); this also does not work :(
} 

можно объявить и использовать функцию close_window внутри содержимого Iframe. ..

2

Я должен был сделать это:

window.top.window $ fancybox.close();

Got type error before.

3

Любые варианты parent.fancybox.close() не сработали для меня, должен быть некоторый конфликт lib.

вот мое рабочее обходное решение для последнего fancybox, вы должны использовать свойство css display вместо метода .hide(), так как в этом случае fancybox не будет открываться снова.

parent.jQuery('#fancybox-overlay').css('display', 'none'); 
parent.jQuery('#fancybox-wrap').css('display', 'none'); 
+0

Лучший хак когда-либо. Спасибо! – AimanB

3

Мой ответ не связан с wordpress, но один для fancybox в целом.

в IFRAME, если вы включили главный JQuery скрипт (JQuery-1.5.2.min.js), то он будет конфликтовать с одной на главной странице, и родителя. $. FancyBox не будет работа в этом случае.

другие связанные с jquery вещи (например, например, вкладки) будут работать внутри iframe. отсюда, обычно, программисту-новичку не приходит в голову, что второй скрипт jquery внутри iframe является злодеем.

+0

Это чрезвычайно полезная информация. – dangermark

1

У меня была такая же проблема и заметил, что я не использую в

type:'iframe' 

При вызове FancyBox, это решить мою проблему