2

我有一些与一些外部 PHP 一起工作的 jQuery 代码,但通常只有在第二次刷新之后。该代码旨在获取列表中每个图像的尺寸然后根据其最长边重新设置每个图像的样式以适合其父级。第一次加载此页面时,jQuery 似乎无法确定所有图像的高度和宽度,因此忽略了样式。确保在从 PHP 调用的图像完全加载后执行 jQuery 的最佳方法是什么?

场景: 我有一个使用外部 PHP 脚本调用图像列表的页面。PHP 运行后,结果会在 id 为“txtHint”的 div 中以 HTML 形式回显。

所以这个PHP(为了相关性而被截断)......

echo "<li><img src='images/".$rowcat['imageurl']. "'><div class='title'>" . $counter . ". " . $rowcat['name'] ."</div></li>";                       
    $counter++;

回显到此“txtHint” div 中:

<div class="featured-scroller">
<ul>
    <div id="txtHint">
            <li><img src="images/012.jpg"><div class="title">1. Eyemouth Museum </div></li>
            <li><img src="images/014.jpg"><div class="title">2. Edinburgh Museum</div></li>
            // and so on...
    </div>
</ul>
</div>

但是,一旦返回结果,我需要检查每个图像实例的尺寸,并根据宽度或高度是否较长来设置样式,同时还要保持其原始纵横比。

目前,我正在使用以下 jQuery:

$("#txtHint img").each(function() {
    var imgHeight = $(this).height();
    var imgWidth = $(this).width();

    if(imgHeight > imgWidth)
        {
            $(this).css({'height':'100%', 'width':'auto'});
        }
    else
        {
            $(this).css({'height':'auto', 'width':'100%', 'position':'relative', 'top':'50%', 'margin-top': -imgHeight / 2 + 'px', 'display':'inline-block'});
        }
}); 

应该提到的是,外部 PHP 脚本是从页面头部的 JavaScript 中调用的。我不确定这是否会有所不同。

当前代码有效,但不是第一次。我试过 $(window).load 等,以及在提到的调用 PHP 脚本的 JavaScript 中调用它,但问题仍然存在。

有关工作示例,请参见以下 JSfiddle:http: //jsfiddle.net/EMPqW/

4

5 回答 5

2

你的问题有点令人困惑。据我了解,您在这里真正要问的是如何确保加载图像以准确计算其尺寸。

PHP 代码无关紧要,因为 PHP 总是在 JavaScript 之前被解释。服务器将输出 HTML,JS 会看到,但不会看到原始的 PHP。这就是服务器-客户端模型的工作原理。

为了确保在操作图像之前加载图像,您可以使用对象的load事件window

$(window).load(function(){ //images were loaded });
于 2012-12-13T23:16:54.660 回答
1

你试过了吗

$(document).ready(function(){
//your code here
});
于 2012-12-13T23:13:47.900 回答
0

在使用加载事件之前,这是您需要的,请确保您正在运行最新版本的 jquery。早期版本在不同的浏览器中没有很好地实现它。

于 2012-12-13T23:46:51.190 回答
0

如果您想确保所有图像都已加载,您可以使用该.load()事件:

$(window).load(function() {
    // document and images should have loaded by now.
});
于 2012-12-13T23:16:03.180 回答
0

通常,如果您需要检查图像是否已完全加载(在 javascript 中渲染图像 src 时通常需要,但在您的情况下看起来也需要)以及其他任何无济于事的事情,您可能希望在处理load()图像之前将处理程序放在图像上,这里是演示:

$("#txtHint img").each(function() {
    $t = $(this);

    function image_process() {
        var imgHeight = $t.height();
        var imgWidth = $t.width();

        if (imgHeight > imgWidth) {
            $t.css({
                'height': '100%',
                'width': 'auto'
            });
        }
        else {
            $t.css({
                'height': 'auto',
                'width': '100%',
                'position': 'relative',
                'top': '50%',
                'margin-top': -imgHeight / 2 + 'px',
                'display': 'inline-block'
            });
        }
    }
    if (this.complete) {
        image_process()
    } else {
        $t.one('load',image_process);
    }
});​

http://jsfiddle.net/oceog/EMPqW/5/但是,在示例中两者都$(window).load()没有$(document).ready()使用这个处理程序。

于 2012-12-13T23:22:16.900 回答