【问题标题】:iFrame .load event not waiting for preloading images to finishiFrame .load 事件不等待预加载图像完成
【发布时间】:2014-01-02 21:17:39
【问题描述】:

我建立了一个作品集网站,其中包含一个 iFrame 来展示艺术品。为了显示每幅作品,将一个包含大图像的 html 页面加载到 iFrame 中。

iFrame 在为空时隐藏(显示:无),并且应该仅在内容完全加载时淡出。

//pass url of artwork page to iFrame
$("#creativeiframe").attr('src', thisLink.attr('href'));

//fade up iFrame once content loaded
$('#creativeiframe').load(function() {
        $('#creativeiframe').fadeIn(300);
});

我按预期工作 - iFrame 只会在内容包括大图像完全加载时加载,但加载缓慢促使我尝试预加载艺术图像,以便他们开始下载在用户单击将它们加载到 iFrame 之前。

function preloadImage(url)
{
    var img=new Image();
    img.src=url;
}

现在我遇到了一个问题 - 有时当用户点击加载艺术品时,iFrame 会淡出显示半加载的图像,或者更糟糕的是只显示 html 内容而没有加载图像。我查看了 Chrome 开发工具网络检查器,这似乎发生在相关图像已开始预加载但尚未完成时。

所以我的问题是:

a.) 有谁知道为什么会这样?是不是因为在iFrame src改变时预加载没有网络请求图片,所以.load事件不等待图片加载?

b.) 有没有办法让 iFrame .load 事件在触发前等待“半预加载”图像完成加载?

感谢期待 - 放轻松,我是 JS 的新手!

【问题讨论】:

  • 如果你的图片真的很大,我建议你使用 Progressive JPEG 进行预览。
  • 谢谢伊戈尔,是的,我正在使用渐进式 JPEG,尽可能压缩等
  • 顺便说一句,有人知道为什么我的问题被否决了吗?没有人要求澄清或完全回答它,所以假设它相当清楚而不是一个愚蠢的问题。我是这个论坛的新手,所以想改进...
  • 是的,我认为这是一个现实世界的问题。 +1

标签: javascript iframe javascript-events preloading


【解决方案1】:

我最终通过在子 HTML 文档中运行脚本来检测图像负载来实现这一点。然后这会触发父文档中的“淡入淡出功能”,淡化包含的 iFrame。

  <script type='text/javascript'>
    var img = new Image();
    img.onload = function(){
        window.parent.fadeFn();
    }
    <?php echo"img.src='".$fileNameVar."'"?> 
  </script>

【讨论】:

    【解决方案2】:

    编辑:这是不正确的,我很困惑 load 事件在 DOM 完全加载时触发,但不包括外部图像。

    你应该可以使用 ready() 事件做你想做的事:

    //no reason to run the jQuery selector multiple times
    var creativeIframe = $("#creativeiframe"); 
    
    //fade up iFrame once content loaded
    creativeIframe.ready(function() {
            creativeIframe.fadeIn(300);
    });
    

    【讨论】:

    • 不是反过来吗? api.jquery.com/ready “如果代码依赖于加载的资产......代码应该放在加载事件的处理程序中。”此外 .ready() 只能在匹配当前文档的 jQuery 对象上调用,而 iFrame 内容不是。
    • 已经尝试过了,但 .ready() 似乎根本不会触发 - 即使在加载图像时也是如此。不过,关于我多次调用 jQuery 选择器的好处,谢谢。
    【解决方案3】:

    img标签中还有一个.load()函数,可以用来显示图片是否加载完毕。

    所以我认为你可以使用 .load() 函数来启用/禁用 iframe 点击。

    或者显示一个等待指示器,也许更好。

    【讨论】:

    • 谢谢 Sho - 您是否建议在子 html 页面中运行脚本来检测图像是否已加载?知道如何触发父 iFrame 上的淡入吗?
    • 您可以显示 iframe 并将 display:none 应用于其内容,当 img 加载时将其删除(/淡入)
    • 谢谢,我会尝试解决这个问题,但它并不理想,因为加载动画在 iFrame 后面(将它放在 iFrame 内没有意义,因为有几个不同的 HTML '被加载的模板',因此这意味着复制所有这些)。我仍然很好奇为什么预加载会破坏以前工作的东西......
    • 只是一个建议。您是否介意首先显示“加载”指示器或预览图像,然后在 img 加载事件中将预览图像替换为真实的 img?预览图像是指大型艺术品的小图像,例如缩略图。另一个问题:请问您为什么使用 iFrame 来显示图像?我认为我们可以只使用一个 div 来保存所有的艺术作品。因为我们需要更多的进程来处理 iFrame 中的 DOM 元素。
    • 嗨,Sho,该站点确实使用用户单击的缩略图来加载 iFrame 中的艺术作品。加载指示器当前位于 iFrame 后面,并且在 iFrame 淡入之前可见。我正在使用 iFrame,因为艺术品是网页设计并且网站是响应式的 - iFrame 解决方案提供了一种使艺术品也响应式的简单方法,背景图像和滚动等。还有一些艺术品是 SWF。该网站位于 www.sjbdigital.co - 可能会让事情更清楚!还没写完,代码有点杂乱无章……
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2011-03-09
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多