【问题标题】:Preload images for HTML5 app on mobile Safari?在移动 Safari 上为 HTML5 应用程序预加载图像?
【发布时间】:2013-08-06 22:05:40
【问题描述】:

是否可以为 HTML5 应用(针对移动 Safari)预加载一组图像?

在理想情况下,应用的启动图像会一直存在,直到加载某些图像。

我们尝试使用 CSS 背景属性并将每张图片作为单独的背景包含在内,但无法预加载图片并保留启动图片。

这是我们用于设置启动图像的 HTML,但是直到所有图像都加载完毕后才会持续:

<!-- iPhone 3 and 4 Non-Retina -->
<link rel='apple-touch-startup-image' media='(device-width: 320px)' href='/images/x/apple-touch-startup-image-320x460.png'>

【问题讨论】:

    标签: javascript html mobile safari


    【解决方案1】:

    使用以下代码使用 jquery 预加载图像。

    <style type="text/css">
    .start_up{width:100%;height:100%;position:fixed;z-index:999;display:none;}
    .start_up img{width:100%;height:100%;display:block;}
    </style>
    
    <div class="start_up"> <img src="startup-image.png" /></div>
    
    <script type="text/javascript">
    $(document).ready(function(e) {
        //showing startup image. By default it will be display:none via css.
        $('.start_up').show();
    
        //load img
        var imgArray = ['image 1 path','image 2 path', 'image 3 path'];
        var total = imgArray.length;
        var imgLoaded = 0;
        for (var i in imgArray) {
            $("<img />").load(function() {
                imgLoaded++;
                if (imgLoaded == total) {
                    //when all images loaded we hide start up image.
                    $('.start_up').hide();
                }
            }).error(function() {
                imgLoaded++;
                if (imgLoaded == total) {
                    //when all images loaded even error in img loading, we hide startup image.
                    $('.start_up').hide();
                }   
            }).attr("src", imgArray[i]);
        }   
    });
    
    </script>
    

    【讨论】:

    • 谢谢,但是我们如何保持 HTML5 启动图像直到所有图像都被预加载?
    【解决方案2】:

    即使 DOM 尚未准备好,您也可以使用 Image constructor 预加载图像:

    var srcArray = ['/path/to/image1.jpg', '/path/to/image2.jpg']; // your image sources
    
    function loadImages(srcArray, callback) {
      var loaded   = []; // here the loaded images will be contained
    
      for (var i; i < srcArray.length; i++) {
        // wrap the loop into a closure because onload is asynchronous
        (function(src) {
          // construct a new image
          var img = new Image();
    
          // use the onload event of the image
          // you can react to errors or load aborts using 'onerror' or 'onabort'
          img.onload = function() {
            loaded.push(img);
    
            // call the callback once all images are loaded
            loaded.length === srcArray.length && callback.call(this, loaded); 
          };
    
          // set the source
          img.src = src;
        })(srcArray[i]);
      }
    }
    
    // an easy, convenient function to load some images and do something
    // when they are loaded
    loadImages(srcArray, function(images) {
      // when this function is called, all images are loaded
      // use them as you please
    });
    

    【讨论】:

    • 谢谢,但是我们如何保持 HTML5 启动图像直到所有图像都被预加载?
    • 使用普通的html图片,然后将图片替换为loadImages
    【解决方案3】:

    您应该使用 HTML 显示“启动图像”,并在 $(document).ready 事件中使用 javascript 添加其他图像。

    //编辑

    rajni 的回答很好地说明了应该做什么。但是,您应该阅读有关 .load() 事件的警告 on this page

    【讨论】:

    • 谢谢,我们现在使用 HTML 显示启动图像(使用代码更新问题),但在加载应用程序所需的所有图像之前,启动图像会隐藏。在预加载所有图像之前,我们如何才能保留图像?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多