Internet Explorer 中的图像加载超时问题

8

我有一个内部应用程序页面,使用Web服务从文档存储系统中流式传输文档图像。我的问题是,当用户进行搜索时,他们可能会得到数百个结果,在一个大页面上显示所有结果以便打印。在Firefox中这样做没有问题,但在IE中,加载图像一段时间后就停止了,只能显示一百多个,其余的只有损坏的图像符号。有没有设置可以更改此超时时间?


@Niklas - 如果没有被接受的答案,赏金不是会自动颁发吗? - Joshua Carmody
嗯,我其实不知道?如果它能像那样工作就太好了。 - Niklas
1
@Niklas - 来自http://meta.stackexchange.com/questions/16065/how-does-the-bounty-system-work的内容:在赏金期结束时,如果赏金发起者没有手动授予赏金,则有资格的答案可以自动获得一半的赏金金额。 - Joshua Carmody
2
谢谢!我仍然希望Kevin能够学会接受更多的问题... - Niklas
@Kevin - 不可以。但是如果你能像在这个问题(http://stackoverflow.com/questions/1868044/cant-create-directory-via-asmx-web-service)中找到答案一样,你可以将你的解决方案作为回答发布在问题下面,然后接受你自己的答案。这实际上是被鼓励的,而且比编辑问题并将解决方案放在那里更可取。 - Joshua Carmody
@Kevin和Joshua Carmody:最好将解决方案发布在问题中,而不是告诉任何人。好吧,这不是首选方式,但有足够多的人什么都不发表! - sra
5个回答

10

如果问题确实是超时引起的,您可以通过使用“懒加载”脚本并仅在现有图像加载完毕后将新图像添加到文档中来解决它。

有很多方法可以做到这一点,但这里是我准备并测试过的一个简单示例。不要使用以下内容:

<img src="image001.jpg" />
<img src="image002.jpg" />
<img src="image003.jpg" />
<img src="image004.jpg" />
<!-- Etc etc etc -->

你可以这样做:

<div id="imgsGoHere">
</div>

<script type="text/javascript">
    function crossBrowserEventAttach(objectRef, eventName, functionRef)
    {
        try {
            objectRef.addEventListener(eventName, functionRef, false);
        }
        catch(err) {
            try {
                objectRef.attachEvent("on" + eventName, functionRef);
            }
            catch(err2) {
                // event attachment failed
            }
        }
    }


    function addImageToPage()
    {
        var newImageElement = document.createElement("img");
        newImageElement.src = imageArray[nextImageNumber];

        var targetElement = document.getElementById("imgsGoHere");
        targetElement.appendChild(newImageElement);

        nextImageNumber++;

        if (nextImageNumber < imageArray.length) {
            crossBrowserEventAttach(newImageElement, "load", addImageToPage);
            crossBrowserEventAttach(newImageElement, "error", addImageToPage);
        }
    }

    var nextImageNumber = 0;

    var imageArray = new Array();
    imageArray[imageArray.length] = "image001.jpg";
    imageArray[imageArray.length] = "image002.jpg";
    imageArray[imageArray.length] = "image003.jpg";
    // .
    // .
    // .
    // Snip hundreds of rows
    // .
    // .
    // .
    imageArray[imageArray.length] = "image999.jpg";

    addImageToPage();
</script>

每张图片只有在前一张图片加载(或加载失败)后才会被添加到页面上。如果您的浏览器超时了,我认为这将解决问题。

当然,问题实际上可能不是超时,而是您耗尽了内存/系统资源,IE放弃了。或者可能存在IE DOM限制,就像Sra所说的那样。


好答案。我不知道那个 +1 - sra
我不认为这是内存/资源问题,因为在Firefox中它可以正常工作。我会尝试给你懒加载的建议。 - Kevin
1
IE 6-8并不像Firefox或其他现代浏览器一样高效地利用内存和资源。在IE中,您经常会遇到在其他浏览器中不存在的瓶颈问题。 - peteorpeter
@Joshua,首先感谢您的建议。在尝试实现时,我至少找出了问题的一部分。由于某种原因,IE在页面加载过程中会切换到兼容模式。我们的安全检查检测到这与登录的不同浏览器,并终止了会话。然而,即使纠正了这个问题,仍然没有完全解决问题。IT加载了多达50%的图像,但仍然在所有图像加载完成之前死机。 - Kevin
1
@Kevin - 嗯...我不确定还有什么其他建议了。你确定这不是资源问题吗?正如Peteorpeter所提到的,IE通常比其他浏览器效率低,并且可能更早达到其极限。你可以尝试使用简单的图像(例如2色GIF而不是全彩色JPEG),或者使用缩小的图像副本(创建一个50%大小的缩小副本用于测试目的),并查看它是否加载更多图像?如果是这样,您可能遇到了资源限制,并且可能没有解决该问题的方法。 - Joshua Carmody
显示剩余3条评论

2

我猜测你需要绕过IE的设置,最简单的方法是不显示未加载的图片或用默认图片替换它们:

你的HTML代码:

<img src="http://domain.com/image.jpg" />

你的JS代码:

$('img').load(function(){

    // ... loaded  

}).error(function(){

    // ... not loaded, replace
    $(this).attr('src','/whatever/default.jpg');

    // ... not loaded, hide
    $(this).hide();

});

2

没有最终的解决方案,但有一些提示... 我认为ie Dom卡住了。我在其他情况下也见过这种情况。我只需要显示图片,并使用js加载图像,当它们进入焦点时,但如果直接打印,这可能不起作用。您可以使用新的css功能直接存储imagedata而不是链接。这应该解决您的问题。我不太确定,但我认为自ie 7以来就支持它。


我对 CSS 不是很擅长,但我会查看您的建议。不幸的是,由于各种原因,我不认为我可以存储这些图像。 - Kevin

1

我曾经使用过类似的方法,使用ASP页面作为背景加载高清图片。

但是我使用了jQuery来处理这些图片及其加载。这是一个关于1张图片的示例,但稍加调整即可实现动态加载。

myImage = new Image();
        $(myImage).load(function () 
              {
               $(this).hide(); //Stops the loading effect of large images. can be removed
               $('.csBackground li').append(this); //Append image to where you need it
               $(myImage).show();
              }).attr('src', settings.images[0]) //I pass an array from ASP code behind so 0 can be 'i'
                .error( function { checkImages(); } ) //try and relaod the image or something?

因此,不要更改超时时间-只需在出现错误时尝试重新加载图像。

否则,我只找到了一个特定于客户端的解决方案(HTTP超时)

http://support.microsoft.com/kb/813827


1

这是一个与Microsoft相关的问题。不幸的是,这是一个需要在每台电脑上更改设置的问题,因为没有远程方式可以修改它。要在您的计算机上更改它,请尝试打开regedit并添加RecieveTimeout DWORD,并将值设置为(#分钟)* 6000。 希望这能帮到您-CodeKid1001

编辑:抱歉,我忘了放文件路径: HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ InternetSettings


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接