Chrome和JQuery问题 - $(document).ready(function(){});在页面加载之前被调用

时间:2009-08-31 19:49:49

标签: jquery google-chrome

我正在学习JQuery,我遇到了一个奇怪的问题。我制作了幻灯片,它适用于IE,Firefox 3.0和Firefox 3.5,但初始图像在Chrome中不起作用。

脚本只循环显示图像列表,并根据查看窗口的大小调整div(图像,标题)的大小。如果我移动$(document).ready(function(){});脚本到正​​文的末尾,脚本工作正常。

我的印象是,在文档完全加载之前,不会调用$(document).ready函数。这是正确的,Chrome渲染引擎正在做一些奇怪的事情,或者我做错了什么?

这是代码:

slideShow.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="Stylesheet" type="text/css" href="css/main.css" />

<script src="scripts/jquery-1.3.2.js" type="text/javascript"></script>

<script src="scripts/jquery.slideShow.js" type="text/javascript"></script>

<script type="text/javascript">
    $(document).ready(function() {
        slideShow();
    });
</script>  

</head>
<body>
    <div id="gallery">
        <a href="#" class="show">
            <img src="images/bees1_edited.jpg" alt="Bees" title="" rel="<h3>Bees!</h3> Some bees in my lavender." /></a>
        <a href="#">
            <img src="images/bee1_edited.jpg" alt="Bee One" title="" rel="<h3>Bee</h3> Close-up of a bee on a lavender flower." />
        </a>
.
.
.
    <div class="caption">
        <div class="content">
        </div>
    </div>
</div>
<div class="clear">
</div>  

</body>
</html>

jquery.slideShow.js

function slideShow() {

//Set the opacity of all images to 0  
$('#gallery a').css({ opacity: 0.0 });

//Get the first image and display it (set it to full opacity)  
$('#gallery a:first').css({ opacity: 1.0 });

//Set the caption background to semi-transparent  
$('#gallery .caption').css({ opacity: 0.7 });

//Resize the width of the caption according to the image width
$('#gallery a:first').find('img').css({ height: $('#gallery a:first').find('img').height() });
$('#gallery a:first').find('img').css({ width: $('#gallery a:first').find('img').width() });

var captionPosition = parseInt($('#gallery a:first').find('img').css('height')) * -1;

if ($(window).height() < $('#gallery a:first').find('img').height()) {
    var imageWidth = parseInt($('#gallery a:first').find('img').width());
    var imageHeight = parseInt($('#gallery a:first').find('img').height());

    $('#gallery a:first').find('img').css({ height: $(window).height() - 10 });
    var cssHeight = parseInt($('#gallery a:first').find('img').css('height'));

    $('#gallery a:first').find('img').css({ width: parseInt((cssHeight * imageWidth) / cssHeight) });

    captionPosition = parseInt($('#gallery a:first').find('img').css('height') * -1);
}

if ($(window).width() < $('#gallery a:first').find('img').width()) {
    var imageWidth = parseInt($('#gallery a:first').find('img').width());
    var imageHeight = parseInt($('#gallery a:first').find('img').height());

    $('#gallery a:first').find('img').css({ width: ($(window).width() - 50) });
    var cssWidth = parseInt($('#gallery a:first').find('img').css('width'));

    $('#gallery a:first').find('img').css({ height: parseInt((cssWidth * imageHeight) / imageWidth) });

    captionPosition = parseInt($('#gallery a:first').find('img').css('height')) * -1;
}

$('#gallery .caption').css({ width: $('#gallery a:first').find('img').css('width') });
$('#gallery .caption').css({ bottom: captionPosition });

//Get the caption of the first image from REL attribute and display it  
$('#gallery .content').html($('#gallery a:first').find('img').attr('rel')).animate({ opacity: 0.7 }, 400);

//Call the gallery function to run the slideshow, 6000 = change to next image after 6 seconds  
setInterval('gallery()', 6000);

}

function gallery() {

//if no IMGs have the show class, grab the first image  
var current = ($('#gallery a.show') ? $('#gallery a.show') : $('#gallery a:first'));

//Get next image, if it reached the end of the slideshow, rotate it back to the first image  
var next = ((current.next().length) ? ((current.next().hasClass('caption')) ? $('#gallery a:first') : current.next()) : $('#gallery a:first'));

//Get next image caption  
var caption = next.find('img').attr('rel');

//Set the fade in effect for the next image, show class has higher z-index  
next.css({ opacity: 0.0 }).addClass('show').animate({ opacity: 1.0 }, 1000);

//Hide the current image
current.animate({ opacity: 0.0 }, 1000).removeClass('show');
next.find('img').css({ height: next.find('img').height() });
next.find('img').css({ width: next.find('img').width() });

var captionPosition = parseInt(next.find('img').css('height')) * -1;

if (next.find('img').height() > $(window).height()) {

    var imageHeight = parseInt(next.find('img').height());
    var imageWidth = parseInt(next.find('img').width());

    next.find('img').css({ height: (parseInt($(window).height()) - 50) });
    var cssHeight = parseInt(next.find('img').css('height'));

    var testVal = parseInt((cssHeight * imageWidth) / imageHeight);

    next.find('img').css({ width: testVal });
    //alert('css width=' + next.find('img').css('width') + ', css height=' + cssHeight + ', img width = ' + imageWidth + ', img height = ' + imageHeight + ', window width = ' + $(window).width() + ', window height = ' + $(window).height());
    captionPosition = parseInt(cssHeight * -1);
}

if (parseInt(next.find('img').css('width')) > parseInt($(window).width())) {
    var imageHeight = parseInt(next.find('img').height());
    var imageWidth = parseInt(next.find('img').width());

    next.find('img').css({ width: (parseInt($(window).width()) - 50) });
    var cssWidth = parseInt(next.find('img').css('width'));

    var testVal = parseInt((cssWidth * imageHeight) / imageWidth);

    next.find('img').css({ height: testVal });
    //alert('imageWidth = ' + imageWidth + 'imageHeight = ' + imageHeight + 'css height = ' + next.find('img').css('height') + ', css width = ' + next.find('img').css('width'));
    captionPosition = parseInt(next.find('img').css('height')) * -1;
}
$('#gallery .caption').css({ width: next.find('img').css('width') });
$('#gallery .caption').css({ bottom: captionPosition });

//Set the opacity to 0 and height to 1px  
$('#gallery .caption').animate({ opacity: 0.0 }, { queue: false, duration: 0 }).animate({ height: '1px' }, { queue: true, duration: 300 });

//Animate the caption, opacity to 0.7 and heigth to 100px, a slide up effect  
$('#gallery .caption').animate({ opacity: 0.7 }, 100).animate({ height: '100px' }, 500);

//Display the content  
$('#gallery .content').html(caption);

} 

2 个答案:

答案 0 :(得分:17)

"ready" means the DOM, not the content of the pages.这意味着页面的HTML结构就在那里,但图像,iframe等可能不一定已加载。如果您需要加载所有内容,则需要load事件而不是ready事件。

答案 1 :(得分:3)

值得注意的是,$(document).ready可能会在所有图像加载之前触发。由于您的<img>代码未设置任何尺寸,因此需要在脚本准确检测尺寸之前加载图像。

$(document).ready在页面中的定位不应影响它何时触发,但您可能会看到基于已准备好的缓存的无关竞争条件。尝试将其移回顶部并加载页面几次以查看它是否现在有效。

如果它仍然偶尔失败,那么您应该考虑使用 window.load 事件而不是$(document).ready