图像损坏或在Firefox中截断

时间:2012-07-30 18:16:59

标签: javascript firefox

我的代码(以及此处:http://jsbin.com/oseruc/1)在每次点击鼠标时翻转给定的图像。它可以在我可以测试的所有浏览器中正常工作,除了最新的Firefox。 Firefox显示错误,例如:

Image corrupt or truncated: http://upload.wikimedia.org/wikipedia/commons/0/0c/St._Cristopher-D%C3%BCrer.jpg
Image corrupt or truncated: http://upload.wikimedia.org/wikipedia/commons/0/0c/St._Cristopher-D%C3%BCrer.jpg
Image corrupt or truncated: Rhinoceros.jpg">http://upload.wikimedia.org/wikipedia/commons/b/b9/D%C3%BCrer-_Rhinoceros.jpg
Image corrupt or truncated: http://upload.wikimedia.org/wikipedia/commons/0/0c/St._Cristopher-D%C3%BCrer.jpg
Image corrupt or truncated: Rhinoceros.jpg">http://upload.wikimedia.org/wikipedia/commons/b/b9/D%C3%BCrer-_Rhinoceros.jpg
如果我点击太快就会发生这种情况。是的,已经看过这个错误报告:http://code.google.com/p/fbug/issues/detail?id=4291

任何想法为什么会发生这种情况以及如何解决这个问题?因为我不能忽视这些错误。它们干扰了我的功能。

我的代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <script type="text/javascript">
(function (window) {
    var frames = [
        "http://upload.wikimedia.org/wikipedia/commons/6/65/Duerer_%28Marter_der_zehntausend_Christen%29.jpg",
        "http://upload.wikimedia.org/wikipedia/commons/0/0c/St._Cristopher-D%C3%BCrer.jpg",
        "http://upload.wikimedia.org/wikipedia/commons/b/b9/D%C3%BCrer_-_Rhinoceros.jpg"
    ];
window.onload = function () { var frame_num = 0; var image = document.getElementById("image");
image.onclick = function () { frame_num = (frame_num + 1) % frames.length; image.src = frames[frame_num]; return false; }; }; })(window); </script> </head> <body> <img id="image" src="http://upload.wikimedia.org/wikipedia/commons/6/65/Duerer_%28Marter_der_zehntausend_Christen%29.jpg" style="position:relative"> </body> </html>

4 个答案:

答案 0 :(得分:6)

当您请求图像太快时,肯定会发生这种情况。我通过使用setTimeout来查看是否在过去的35ms内请求了一个图像。我的应用程序有点不同,但您可以执行类似的操作(或者只是在图像加载之前禁用按钮)。

答案 1 :(得分:3)

我有完全相同的问题,它影响所有浏览器firefox,chrome,即不仅仅是firefox,只有firefox然后在consol日志中显示错误消息“图像损坏或截断”。 问题只发生在ajax请求发生得太快而导致beforeSend函数和success函数之间发生冲突时。这是我的代码:

function loadlist(page, maxrows){
    var orderby = $('.sortby_active').attr('title');
    var category = $('.category_active').attr('title');
    $.ajax({
        type: 'post',
        url: 'gallery_pages.php?page=' + page + '&maxrows=' + maxrows + '&orderby=' + orderby + '&category=' + category,
        beforeSend: function(){
            $('#page_loading').show();
            $('#container').fadeOut(300);
        },
        success: function(data){
            $('#container').html(data);
            $('#container').stop().animate({'bottom': '0px'}, 100);
            n = 0;
            $('#up_arrow').hide();
            $('#scrollup').css('cursor', 'default');
            if(!$('#down_arrow').is(':visible')){
                $('#down_arrow').show();
                $('#scrolldown').css('cursor', 'pointer');
            }
            $('#page_loading').hide();
            $('#container').fadeIn(700);
        }
    });
}

我的代码中的冲突发生在fadeIn和fadeOut之间。 fadeout需要300ms,如果ajax请求发生的时间超过300ms,它将显示消息和ajax响应数据不能正确显示。解决方案是在成功函数中使用 delay()。我将fadeIn推迟了310ms以防万一:)

function loadlist(page, maxrows){
    var orderby = $('.sortby_active').attr('title');
    var category = $('.category_active').attr('title');
    $.ajax({
        type: 'post',
        url: 'gallery_pages.php?page=' + page + '&maxrows=' + maxrows + '&orderby=' + orderby + '&category=' + category,
        beforeSend: function(){
            $('#page_loading').show();
            $('#container').fadeOut(300);
        },
        success: function(data){
            $('#container').html(data);
            $('#container').stop().animate({'bottom': '0px'}, 100);
            n = 0;
            $('#up_arrow').hide();
            $('#scrollup').css('cursor', 'default');
            if(!$('#down_arrow').is(':visible')){
                $('#down_arrow').show();
                $('#scrolldown').css('cursor', 'pointer');
            }
            $('#page_loading').hide();
            $('#container')**.delay(310)**.fadeIn(700);
        }
    });
}

答案 2 :(得分:1)

试试这个:

window.onload = function () {
    var frame_num = 0;
    var image = document.getElementById("image");
    function load_next_image() {
        image.onclick = null;
        frame_num = (frame_num + 1) % frames.length;
        image.src = frames[frame_num];
        return false;
    };
    image.onclick = load_next_image;
    image.onload = function() {
        image.onclick = load_next_image;
    }
};

每当您点击图片时,它会暂时禁用点击处理程序,然后在图片加载完成后重新启用它。

答案 3 :(得分:1)

我知道这已经过时了,但对于其他任何偶然发现检查并确保文件确实没有损坏的人。在查看了其中几个解决方案之后,我让我的设计师重新创建了图像。一旦他上传,一切都按预期开始工作。