views:

2599

answers:

5

I'm trying to close FancyBox from within the iframe, but parent.$ is always undefined. This is my iframe JavaScript:

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

Replacing parent.$.fancybox.close(); with alert('clicked'); works just fine. I don't understand why parent.$ is undefined when the iframe is in the same domain.

I'm using WordPress 2.9.1, with the FancyBox for Wordpress plugin.

  • main page: //server.local/web/test/index.php
  • iframe page: //server.local/web/test/wp-content/plugins/wp-test/test.htm

The first of these urls is the main page, the second is the iframe page; server.local is my home test server.

Any ideas? I can pastebin the entire source if it would be helpful.

A: 

It is undefined because WordPress runs jQuery in noConflict mode. Use this instead:

parent.jQuery.fancybox.close();

noConflict mode means $ does not equal jQuery. You have to explicitly use jQuery to access what you normally can access with $.

Doug Neiner
Sorry, should have said that I am aware of this; the js I included was a snippet. I've edited my question to reflect this--passing $ means I don't have to use 'jQuery'.
Aleksandr
@Aleksandr Passing `$` in an `iframe` won't affect the parent page at all. In fact, you are including a completely separate instance of jQuery in the `iframe`. If you notice what you wrote, you pass `$`, but reference `parent.$`. It is as if you have `var a = 1; alert(obj.a);` You wouldn't expect the two items to refer to the same value unless there was an assignment somewhere in the code.
Doug Neiner
@Doug You're right, that makes sense. However, using the following code: `jQuery('#cancel').click(function(){ parent.jQuery.fancybox.close(); });`I still get `undefined` errors in Firebug: `parent.jQuery.fancybox is undefined`. Do you have any idea why this might be?Thanks for your help so far! I'm still very much new to JavaScript and coding in general.
Aleksandr
@Aleksandr I am at work right now, but I will try a solution when I get a chance and update my answer with the results.
Doug Neiner
A: 

Spent quite a few hours trying to debug this and got nowhere. So I switched out the 'FancyBox for WordPress' plugin with the latest version of FancyBox, and it was fixed. Really should have tried that earlier.

After having spent some time with WordPress and its various plugins, I'd recommend calling things manually rather relying on plugins. It just adds another layer of complexity that, if you know what you're doing, doesn't need to be there.

Thanks to Doug for pointing out the appropriate syntax for iframe to parent window jQuery in WordPress.

Aleksandr
+1  A: 

This works for me ;)

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

Thanks for this post, it actually guided me a little... I feel bad because it took me a only a few minutes and I KNOW how frustrating Fancybox for Wordpress is!!

Michael
A: 

HI, Anyone who is having trouble closing a Fancy Box iFrame using a manual install of Fancy Box in Wordpress 3.0:

Use this link in your iframe:

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

It works :)

dave
A: 

Hi, None of the suggestions worked for me. I had to work around it using the following code. The latest version may be supporting the parent.jQuery.fancybox.close(); approach, but the older versions do not work with that.

For existing sites with older versions of the plugins/Jquery, try this

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 :(
}

you could declare and use the function close_window within the Iframe content.

Anand P