FancyBox iframe 返回 parent.$ 为未定义(使用 WordPress)

Posted

技术标签:

【中文标题】FancyBox iframe 返回 parent.$ 为未定义(使用 WordPress)【英文标题】:FancyBox iframe returns parent.$ as undefined (using WordPress) 【发布时间】:2011-01-14 16:29:57 【问题描述】:

我正在尝试从 iframe 中关闭 FancyBox,但 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>

alert('clicked'); 替换parent.$.fancybox.close(); 效果很好。当 iframe 在同一个域中时,我不明白为什么 parent.$undefined

我使用的是 WordPress 2.9.1,带有 FancyBox for Wordpress 插件。

主页://server.local/web/test/index.php iframe 页面://server.local/web/test/wp-content/plugins/wp-test/test.htm

这些url中的第一个是主页,第二个是iframe页面; server.local 是我家的测试服务器。

有什么想法吗?如果有帮助,我可以粘贴整个源代码。

【问题讨论】:

【参考方案1】:

它是未定义的,因为 WordPress 在noConflict 模式下运行 jQuery。改用这个:

parent.jQuery.fancybox.close();

noConflict 模式意味着$ 不等于 jQuery。您必须明确使用 jQuery 才能访问您通常可以使用 $ 访问的内容。

【讨论】:

对不起,应该说我知道这一点;我包含的 js 是一个 sn-p。我已经编辑了我的问题以反映这一点——传递 $ 意味着我不必使用“jQuery”。 @Aleksandr 在iframe 中传递$ 根本不会影响父页面。实际上,您在 iframe 中包含了一个完全独立的 jQuery 实例。如果你注意到你写的内容,你通过$,但引用parent.$。就好像你有 var a = 1; alert(obj.a); 你不会期望这两个项目引用相同的值,除非代码中的某处有赋值。 你是对的,这是有道理的。但是,使用以下代码:jQuery('#cancel').click(function() parent.jQuery.fancybox.close(); ); 我仍然在 Firebug 中收到 undefined 错误:parent.jQuery.fancybox is undefined。你知道为什么会这样吗?感谢您一直以来的帮助!总的来说,我对 JavaScript 和编码还是很陌生。 @Aleksandr 我现在正在工作,但我会在有机会时尝试解决方案并用结果更新我的答案。【参考方案2】:

我的回答与 wordpress 无关,但一般来说是针对 fancybox 的。

在iframe中,如果你已经包含了主jquery脚本(jquery-1.5.2.min.js),那么它会和主页面的那个和parent.$.fancybox冲突strong> 在这种情况下不起作用。

其他与 jquery 相关的东西(例如:选项卡)将在 iframe 内工作。 因此,新手程序员不会想到 iframe 中的第二个 jquery 脚本是恶棍。

【讨论】:

【参考方案3】:

我必须这样做:

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

之前遇到过类型错误。

【讨论】:

【参考方案4】:

parent.fancybox.close() 的任何变体都对我不起作用,一定是一些 lib 冲突。

这是我最新的fancybox的工作解决方法,你应该使用css显示属性而不是.hide()方法,因为在这种情况下fancybox将不会再次打开。

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

【讨论】:

有史以来最好的黑客。谢谢!【参考方案5】:

这对我有用;)

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

感谢这篇文章,它实际上给了我一些指导……我感觉很糟糕,因为我只花了几分钟,而且我知道 Fancybox for Wordpress 是多么令人沮丧!

【讨论】:

【参考方案6】:

没有任何建议对我有用。我不得不使用以下代码解决它。 最新版本可能支持 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 :(

您可以在 Iframe 内容中声明和使用函数 close_window。

【讨论】:

【参考方案7】:

我遇到了同样的问题,发现我没有使用

type:'iframe'

调用fancybox时, 它解决了我的问题

【讨论】:

【参考方案8】:

花了好几个小时试图调试它,但一无所获。 所以我用最新版本的 FancyBox 换掉了“FancyBox for WordPress”插件,它得到了修复。真的应该早点尝试。

在使用了 WordPress 及其各种插件一段时间后,我建议手动调用而不是依赖插件。它只是增加了另一层复杂性,如果您知道自己在做什么,就不需要在那里。

感谢 Doug 指出 WordPress 中 iframe 到父窗口 jQ​​uery 的适当语法。

【讨论】:

【参考方案9】:

嗨, 任何在 Wordpress 3.0 中手动安装 Fancy Box 时无法关闭 Fancy Box iFrame 的人:

在您的 iframe 中使用此链接:

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

它有效:)

【讨论】:

以上是关于FancyBox iframe 返回 parent.$ 为未定义(使用 WordPress)的主要内容,如果未能解决你的问题,请参考以下文章

Fancybox - 单击 iframe 上的链接,更新 URL 地址

Fancybox 图片库

Fancybox iframe 动态调整大小

jQuery FancyBox Iframe - 在fancybox 中使用$(document).ready?

fancybox关闭弹出窗体parent.$.fancybox.close();

Fancybox 3 IFrame 内容之间的过渡动​​画效果