我正在学习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);
}
答案 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