【问题标题】:Open fancybox(iframe) as a child?小时候打开fancybox(iframe)?
【发布时间】:2012-08-31 11:53:49
【问题描述】:

如果可能,我希望使用 iframe 作为父级的子级打开一个花式框。

是否可以打开一个 iframe(用 fancybox 构建)并让浏览器相信我已经使用 window.open 打开了它,这样 window.close()window.opener.location.reload() 之类的功能仍然可以工作?

fancybox 代码很简单:

$("#custom_alert").fancybox({
        'width'             : w,
        'height'            : h,
        'autoScale'         : false,
        'transitionIn'      : 'none',
        'transitionOut'     : 'none',
        'type'              : 'iframe',
        //'scrolling'         : 'no'
    }).trigger('click');

编辑:我不能使用类似的功能:

function closePopup(){
     window.close();
     if(parent.jQuery().fancybox) {
      parent.jQuery.fancybox.close();
     }
}

我必须使用 window.close() 函数。

解决我的问题也可以告诉我为什么我不能像使用警报或确认那样重写关闭函数。

编辑 2: 感谢 Raohmaru 和 JFK,在看到小提琴奏效后,我已经完成了我需要的功能,但是(对我而言)发生了一件奇怪的事情:

工作代码,如果其他人需要它是:

(function() {
  var proxied = window.close;
  window.close = function() {
    if(parent.jQuery().fancybox) {
        parent.jQuery.fancybox.close();
    }
    else
        return proxied.apply(this, arguments);
  };
})();

这适用于 fancybox 和 window.open 案例。

我的问题是这样的: 我在索引中包含了一些 .js 文件:

overwrites
fancybox pack
general scripts

如果我将该函数放在通用脚本中,它可以完美运行,但是如果我将它放在覆盖 js 中(它应该在哪里),它就不起作用(没有控制台错误,只是没有任何反应)。我曾尝试交换包含的位置,但没有运气。

这就是为什么我一开始就不能让它工作的原因,因为我总是将它包含在覆盖的 .js 中。

【问题讨论】:

  • 哪些浏览器不能覆盖关闭功能?您可以在 Firefox(在 13.0.1 中测试)、Chrome(21.0)甚至在 Internet Explorer 8 及更低版本中执行此操作。但是你不能在标准模式下的 IE9 (link)。
  • 关闭覆盖功能在任何浏览器上都对我不起作用,JS也没有抛出任何错误。
  • 这个例子不适合你? jsfiddle.net/ufPbf。另请注意,您不能在 iframe 中重写父窗口的对象。
  • @Raohmaru :编辑问题,谢谢。
  • 我猜是因为如果还没有加载fancybox 脚本,这个parent.jQuery.fancybox.close(); 就没有意义了。我认为overwrites 应该是最后包含的脚本。

标签: javascript iframe fancybox parent-child


【解决方案1】:

您可以做的是验证页面是否已在fancybox 中打开并执行正确的fancybox 方法,否则只需使用您的常规javascript 方法(即window.close()

话虽如此,在打开的页面中(通过window.open() 或fancybox),您可能具有关闭它的功能

function closePopup(){
 window.close();
}

关联到关闭按钮/链接,例如

<a href="javascript:;" onclick="closePopup()" >Close Window</a>

这肯定会关闭弹出窗口,但不会关闭花式框,因此您可以添加以下内容:

function closePopup(){
 window.close();
 if(parent.jQuery().fancybox) {
  parent.jQuery.fancybox.close();
 }
}

这适用于弹出窗口或花式框。

【讨论】:

  • 谢谢你,但这对我没有帮助。我已经覆盖了一些默认的 JS 函数,并且我已经尝试过覆盖 close 函数,但不幸的是我无法重写这个特定的函数,不知道为什么。我不能添加新功能,我只需要使用现有功能,因此添加closePopup() 功能没有帮助。
  • 只是一个示例,你可以编辑你现有的函数(并添加条件语句以查看fancybox是否打开)以达到相同的结果
  • 请阅读我的顶级评论。我很清楚。我无法重写关闭函数(JS 默认函数),就像我覆盖了其他函数(警报、确认等)一样,我也无法添加新函数。我必须使用 window.close() 和其他 JS 函数,不能使用像 function closePopup(){ window.close(); } 这样的函数
  • @Cosmin 你从来没有说过你是如何在你的代码中“重写”你的其他 js 函数的。
  • 与问题无关,更多信息可以查看stackoverflow.com/questions/1729501/javascript-overriding-alert。例如:window.alert = function() { console.log(arguments); }; - 压制alert 并改用console.log。但由于某种原因,这不适用于window.close
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多