【问题标题】:jQuery recursive image loading and IEjQuery递归图像加载和IE
【发布时间】:2011-02-18 11:39:06
【问题描述】:

我正在尝试以递归方式加载一堆图像,由于 13 次递归的限制,它在所有浏览器中都能完美运行,除了被上帝抛弃的 IE。

现在我可以自己解决这个问题,但我确实想遵循“最佳实践”,可以这么说,因为我还在学习 jQuery。而且我猜这里的大师可以提供有用的指导。 您建议如何解决?

我的代码sn-p:

$(文档).ready(函数(){ loadThumbs(["1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg" , "9.jpg","10.jpg","11.jpg","12.jpg","13.jpg","14.jpg","15.jpg", "16.jpg","17.jpg","18.jpg","19.jpg","20.jpg"], 0); }); 函数 loadThumbs(文件,索引){ if(index == files.length) 返回; var 文件 = 文件 [索引]; 变种图像 = 新图像(); $(图片) .load(函数(){ $("#container").append(image); loadThumbs(文件,索引+1); }) .addClass("拇指") .attr("src", 文件); }

如果您在 IE 中尝试此操作(在我的情况下为 8),您将收到 Stack Overflow 错误。

谢谢!

【问题讨论】:

  • 也许我只是不明白,但你如何停止递归?
  • 请注意,您为什么要使用递归?一个简单的循环遍历数组中的项目就可以了。
  • 该死,我的错。我忘了我删除了停止条件。在函数的开头,我执行“if(index == files.length) return;”所以停止递归不是问题。即使在所有 20 个文件加载完毕后停止,所有浏览器也能正确显示页面并且 IE 在 13 次递归后失败。

标签: jquery image internet-explorer recursion load


【解决方案1】:

我假设您是一张一张地加载图像,因为它看起来更漂亮,而不是并行加载它们。 稍微重写一下应该可以解决堆栈溢出问题:

Before:
loadThumbs(files, index+1);

After:
var nextIndex = index + 1;
setTimeout(function() { loadThumbs(files, nextIndex) }, 0)

是的,在函数顶部添加对数组边界的检查:if (!files[index]) return;,我敢打赌这就是代码在 IE8 中中断的原因。

【讨论】:

  • 对不起,艾莉西!我完全忘记了我在测试时从函数中删除了停止条件,现在我不在家,我无法重新上传正确的文件。我做了检查“如果(索引==文件长度)返回假;”在 loadThumbs 函数的开头,所以停止递归不是问题。事实上,IE 不能在全局上下文中处理超过 13 个函数的递归。我想我已经找到了解决方案,但是我无法在大学的 unix 机器上对其进行测试。我回家后会尽快回复这个问题并尝试您的解决方案:)
【解决方案2】:

我已经在 Firefox 和 IE 8 中尝试过,但失败了。我什至在没有附加组件的情况下在 IE 8 中尝试过。

来自您的代码

function loadThumbs(files, index){
 var file = files[index];
 var image = new Image();
 $(image)
 .load(function(){
 $("#container").append(image);
 loadThumbs(files, index+1);
 })
 .addClass("thumb")
 .attr("src", file)
} 

正如其中一位 cmets 所问,为什么要使用递归?请尝试以下方法(请原谅语法错误)。

function loadThumbs(files){
 for (index=0;index<files.length;i++)
 {
   var file = files[index];
   var image = new Image();
   $(image).load(function(){
     $("#container").append(image);
     loadThumbs(files, index+1);
   }).addClass("thumb").attr("src", file);
 }
} 

也许在您的情况下发生的情况是,当索引达到 20(超出数组范围)时,您的文件变量将得到未定义。这不会使浏览器崩溃,并且由于您有一个 var 类型,它会传递未定义的变量,并且可能在 IE 8 中它会不断地将索引增加 1 而不会优雅地结束。

另一个选项是检查您的递归方法。用

包围逻辑
 (if index < files.length) {...}

我做了一个基本的测试

$(document).ready(function () {
        loadThumbs(["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg","11.jpg", "12.jpg", "13.jpg", "14.jpg", "15.jpg", "16.jpg", "17.jpg", "18.jpg", "19.jpg", "20.jpg"], 0);
    });

    function loadThumbs(files, index) {
        var file = files[index];
        $("#container").append(file);

        loadThumbs(files, index + 1);       
    }

Firefox 显示 20 个文件名。 IE 8 因堆栈溢出异常而崩溃。

【讨论】:

  • 对不起,我忘了我删除了停止条件:) loadThumbs 函数的开头应该有这样一行:“if(index == files.length) return true; "这样当我到达数组的末尾时,我就会退出加载。然而,这不是问题。问题是 IE 不允许在全局上下文中对函数进行超过 13 次递归。
【解决方案3】:

你不应该在这里使用递归,简单的迭代就足够了。 jQuery 有 $.each 函数用于此目的。

var $container = $('#container');

function loadThumbs(files) {
    $.each(files, function(i, image_url) {
        $('<img class="thumb" />').attr("src", image_url).appendTo($container);
    });
}

【讨论】:

  • 这将一次添加所有图像并并行加载它们。我想要实现的是顺序加载。正如 Alisey 在她的回答中所说的“它看起来更漂亮”:) 再一次 - 问题是 IE 无法处理超过 13 个全局递归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2018-05-06
相关资源
最近更新 更多