【问题标题】:Image onload trigger's immidately图像加载立即触发
【发布时间】:2013-06-28 06:42:57
【问题描述】:

我创建了一个灯箱,可在单击图像时(一次一张)从图库中加载图像。问题是图像没有加载,因此图像的尺寸是未知的。这是代码:

function showimage(image_path) {
    imgobj = new Image();
    imgobj.src = image_path;
    var aspectratio = imgobj.width/imgobj.height;
    var newht = imgobj.height;
    var newwd = imgobj.width;
    if (($(window).height() - 100) < newht) {
        newht = $(window).height() - 100;
        newwd = newht*aspectratio;
    }
    if (($(window).width() - 100) < newwd) {
        newwd = $(window).width() - 100;
        newht = newwd/aspectratio;
    }
    $('#lightbox img').attr('height', newht);
    $('#lightbox img').attr('width', newwd);
    $('#lightbox').show();
}

我尝试使用 onLoad,但它会立即触发并且图像仍未加载并且没有提供正确的图像尺寸。 Here我读到当图像已经加载到浏览器中时,会立即调用onLoad。

人们建议在其他任何地方使用时间延迟“setTimeout”,但这似乎不是一个好的解决方案,因为图像可能具有不同的大小并且可能需要可变的时间来加载。

任何人都可以建议我如何解决这个问题。

编辑 1:

感谢下面的回答,我可以使用 load() 获得该功能。但是现在,如果图像已经加载并已显示在灯箱中,则再次单击。 load() 中的函数没有被调用,也没有出现灯箱。有什么建议吗?

编辑 2:

解决方案:这对我有用:

function showimage(image_path) {
    imgobj = new Image();
    imgobj.src = image_path;
    if (imgobj.complete == false)
        $(imgobj).load(function(){processimage(imgobj);});
    else
        processimage(imgobj);
}

function processimage(imgobj) {
    var aspectratio = imgobj.width/imgobj.height;
    var newht = imgobj.height;
    var newwd = imgobj.width;
    if (($(window).height() - 100) < newht) {
        newht = $(window).height() - 100;
        newwd = newht*aspectratio;
    }
    if (($(window).width() - 100) < newwd) {
        newwd = $(window).width() - 100;
        newht = newwd/aspectratio;
    }
    $('#lightbox img').attr('height', newht);
    $('#lightbox img').attr('width', newwd);
    $('#lightbox').show();
}

【问题讨论】:

  • $(window).load 会等到所有外部文件都下载完...你可以使用它
  • 与其编辑问题以显示您是如何解决的,请接受下面的答案,或添加您自己的解决方案作为新答案。这让以后会查看此问题的其他人更清楚,并允许您的答案被投票赞成/反对,并与可能给出的其他答案进行比较。如果它是最好的答案,您甚至可以接受自己的答案。

标签: jquery image onload


【解决方案1】:

如果您总是想访问图像的高度和宽度,您可以采用不同的方法并使用 jquery hide()show() 函数。

这样,图像将始终被加载,并且您只会在单击图像时显示它们,从而给用户一种加载的错觉并让您访问高度和宽度。

【讨论】:

  • 有一个巨大的图像列表,加载所有图像似乎不是一个好主意。因此,我必须在用户点击后加载图像。
  • 你想用宽度和高度实现什么?照原样使用还是改变它?
  • 我必须调整灯箱和图像的大小以适应窗口
【解决方案2】:

我认为您的函数的问题在于,在您的函数中创建了一个新的图像对象,然后在其中添加路径,但实际图像在该点永远不会加载。您要做的是设置对象,添加路径然后加载它:

   function showimage(image_path) {
        imgobj = new Image();
        imgobj.src = image_path;
        //load the image:
        $(imgobj).load(function(){
           var aspectratio = imgobj.width/imgobj.height;
           var newht = imgobj.height;
           var newwd = imgobj.width;
           if (($(window).height() - 100) < newht) {
               newht = $(window).height() - 100;
               newwd = newht*aspectratio;
           }
           if (($(window).width() - 100) < newwd) {
              newwd = $(window).width() - 100;
              newht = newwd/aspectratio;
           }
           $('#lightbox img').attr('height', newht);
           $('#lightbox img').attr('width', newwd);
           $('#lightbox').show();
        });
    }

小提琴演示:http://jsfiddle.net/5d7mM/

【讨论】:

  • 这行得通。谢谢。我使用的 onLoad 效果不佳。但是我现在面临另一个问题,一旦将图像加载到灯箱中并且再次单击相同的图像,则不会调用加载函数并且没有灯箱。有什么线索吗?
  • 由于您将图像加载到新对象中,因此您必须再次将 click 事件绑定到图像。见 jquery .bind() 或 jquery .on()
  • 问题不在于事件。代码指针到达直到加载,然后没有进一步处理,此后javascript无法工作,控制台没有错误。
  • 你能展示处理点击事件的代码吗?很高兴在这里看到所有有效的功能。
  • 我已将解决方案添加到编辑中,我忘了提及我只创建了一次图像对象并重复使用它,这导致了问题。对此感到抱歉:)
【解决方案3】:

这对我有用。我正在重用图像对象。

$(document).ready(function () {
    var imgobj = new Image();
    function showimage(image_path) {
        imgobj.src = image_path;
        if (imgobj.complete == false)
            $(imgobj).load(function(){processimage(imgobj);});
        else
            processimage(imgobj);
    }

    function processimage(imgobj) {
        var aspectratio = imgobj.width/imgobj.height;
        var newht = imgobj.height;
        var newwd = imgobj.width;
        if (($(window).height() - 100) < newht) {
            newht = $(window).height() - 100;
            newwd = newht*aspectratio;
        }
        if (($(window).width() - 100) < newwd) {
            newwd = $(window).width() - 100;
            newht = newwd/aspectratio;
        }
        $('#lightbox img').attr('height', newht);
        $('#lightbox img').attr('width', newwd);
        $('#lightbox').show();
    }
});

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多