【发布时间】:2010-12-19 11:52:06
【问题描述】:
更新:
标签悬停的缩略图会调用一个名为 displayImage() 的函数:
function displayImage(index, parent){
var images = document.getElementById(parent).getElementsByClassName("mainProductImage");
for(var i = 0; i < images.length; i++) {
var image = images[i];
if (image.className != 'mainProductImage') { continue }
if(i == index-1) {
// display main image
image.style.display="block";
// change selectedIndex of select list
jQuery("#mySelect").attr('selectedIndex', index-1);
jQuery('#mySelect').trigger('change', [ i ]);
}
else {
image.style.display="none";
}
}
}
我意识到我没有很好地解释这一点:) 我有 n 个图像缩略图,当悬停时会更改页面上的主要产品图像。缩略图悬停事件将 trigger() 发送到同一页面上的选择列表(带有 n 个产品的下拉列表,如果有 3 张图像,则选择列表上有 3 个对应的产品项)。
根据 Patrick 的建议,我在鼠标悬停时首先将其添加到循环中:
jQuery('#mySelect').trigger('change', [ i ]); // now passing the i variable
然后我补充说:
$('#mySelect').change( function( event, idx ) {
if( idx === 0 ) {
$('#fade').fadeOut('fast');
$('#fade').fadeIn('slow');
}
当我将鼠标悬停在缩略图上时,此代码现在限制了图像淡出的次数,但由于某种原因仍会淡出两次,而不仅仅是一次。
我还希望在更改选择列表中的产品项目时出现图像淡入淡出效果,但由于 .change() 函数无法识别循环数组中的 [i],因此现在无法正常工作。所以我需要一种解决方案,当一个人悬停在缩略图上或当一个人更改产品选择列表项时会触发淡入淡出。
我希望这有点道理!
有没有办法在常规的 javascript 函数中只运行一次 jQuery 代码?
我有一个fadeImage() 函数,根据页面上的不同事件调用该函数用于图像转换。这些事件之一是从 for 循环触发的。该循环导致该函数被多次调用,因此图像的淡入和淡出循环直到循环完成。我需要从循环内部触发淡入淡出效果,但只需要一次,所以我希望不要更改循环区域中的任何内容,而是让淡入淡出功能无论如何只运行一次。
我尝试了.one(),但没有运气。
function fadeImage()
{
// is there a way to run these two lines only once?
$('#fade').fadeOut('fast');
$('#fade').fadeIn('slow');
}
非常感谢任何建议。或者任何其他想法,也许我根本不需要一个函数来包装 jQuery 代码?
【问题讨论】:
-
因此,悬停缩略图会更新主产品图像,并更改
<select>中的选定项目以匹配缩略图。那正确吗?如果是这样,for循环在哪里发挥作用? -
在缩略图悬停时调用函数 displayImage()。主帖上的代码:)
-
首先,题外话,但你知道
getElementsByClassName在IE 中不受支持吗?无论如何,我看到你现在在做什么,额外参数解决方案不会那样工作。问题似乎与for循环无关,因为.change()事件仅在循环中发生一次。相反(如果我理解的话)问题是用户可能会在动画有机会完成之前从一个缩略图快速移动到另一个缩略图。如果这听起来不错,请尝试在您的fadeIn/Out调用中使用.stop()或stop(true,true)。
标签: jquery jquery-ui javascript-events