Javascript-在手风琴展开/折叠时设置文本
我有一个JavaScript手风琴式菜单。我想在菜单部分标题前面有一个指示器,当部分折叠时显示(+),当部分展开时显示(-)。根据下面的代码,我已经能够做到这一点,但是指示器仅在单击时更改,而不是根据节是展开还是折叠来设置。我已经看了几个小时了,如果能多看一眼,我会很感激的,因为我可能无法理解其中的逻辑Javascript-在手风琴展开/折叠时设置文本,javascript,css,accordion,Javascript,Css,Accordion,我有一个JavaScript手风琴式菜单。我想在菜单部分标题前面有一个指示器,当部分折叠时显示(+),当部分展开时显示(-)。根据下面的代码,我已经能够做到这一点,但是指示器仅在单击时更改,而不是根据节是展开还是折叠来设置。我已经看了几个小时了,如果能多看一眼,我会很感激的,因为我可能无法理解其中的逻辑 下面是Javascript: var ContentHeight; var TimeToSlide = 250.0; var opening; var openAccordion = '';
下面是Javascript:
var ContentHeight;
var TimeToSlide = 250.0;
var opening;
var openAccordion = '';
function runAccordion(index, height)
{
ContentHeight = height;
var nID = "Accordion" + index + "Content";
if(openAccordion == nID)
nID = '';
setTimeout("animate(" + new Date().getTime() + "," + TimeToSlide + ",'"
+ openAccordion + "','" + nID + "')", 33);
openAccordion = nID;
}
function animate(lastTick, timeLeft, closingId, openingId)
{
var curTick = new Date().getTime();
var elapsedTicks = curTick - lastTick;
opening = (openingId == '') ? null : document.getElementById(openingId);
var closing = (closingId == '') ? null : document.getElementById(closingId);
if(timeLeft <= elapsedTicks)
{
if(opening != null)
opening.style.height = ContentHeight + 'px';
if(closing != null)
{
closing.style.display = 'none';
closing.style.height = '0px';
}
return;
}
timeLeft -= elapsedTicks;
var newClosedHeight = Math.round((timeLeft/TimeToSlide) * ContentHeight);
if(opening != null)
{
if(opening.style.display != 'block')
opening.style.display = 'block';
opening.style.height = (ContentHeight - newClosedHeight) + 'px';
}
if(closing != null)
closing.style.height = newClosedHeight + 'px';
setTimeout("animate(" + curTick + "," + timeLeft + ",'"
+ closingId + "','" + openingId + "')", 33);
}
function changeText(index){
var accordionID = "Accordion" + index + "Content";
var indicatorID = document.getElementById("expandIndicator" + index);
var currentIndicator = indicatorID.innerHTML;
var openIndicator = "(+)";
var closedIndicator = "(-)";
if (currentIndicator == openIndicator) {
indicatorID.innerHTML = closedIndicator; }
else {
indicatorID.innerHTML = openIndicator; }
}
var内容高度;
var-TimeToSlide=250.0;
var开放;
var openAccordion=“”;
功能运行手风琴(索引、高度)
{
ContentHeight=高度;
var nID=“手风琴”+索引+“内容”;
如果(openAccordion==nID)
nID='';
setTimeout(“动画”(“+new Date().getTime()+”,“+TimeToSlide+”,”
+openAccordion+“,”+nID+“)”,33);
openAccordion=nID;
}
函数animate(lastTick、timeLeft、closingId、openingId)
{
var curTick=new Date().getTime();
var elapsedTicks=curTick-lastTick;
opening=(openingId=“”)?null:document.getElementById(openingId);
var closing=(closingId=“”)?null:document.getElementById(closingId);
if(timeLeft在执行任何其他操作之前,您需要在changeText方法中将所有指示符设置为“+”。在changeText方法的if语句之前添加以下代码:
document.getElementById("expandIndicator1").innerHTML = openIndicator;
document.getElementById("expandIndicator2").innerHTML = openIndicator;
document.getElementById("expandIndicator3").innerHTML = openIndicator;
或者,如果内容div太多:
var numberOfContentDivs = 36;
for ( var i = 1; i <= numberOfContentDivs; i++) {
document.getElementById("expandIndicator" + i).innerHTML = openIndicator;
}
var numberOfContentDivs=36;
对于(var i=1;我知道,您是否试图将其设置为初始页面加载?其他事件是否有时会导致扩展/崩溃?我不确定自己是否理解问题所在。我创建了一个fiddle:,但我没有“获取”您的代码,因此如果您的要求允许,我建议使用jQuery UI。编辑:。编辑:下载和使用最多需要20分钟.JSager-加载页面时,所有步骤都设置为(+)。当您单击步骤1时,它将展开,+,步骤1应改为-。当您单击步骤2时,步骤1将折叠,步骤2将展开。同时,步骤1-应改为步骤1+,步骤2+应改为步骤2-。啊,好的。那么,mindandmedia的想法是正确的。有什么东西阻止您使用jQuery和jQuery UI吗?您会得到b解决业务问题比调试其他人的手动JavaScript小部件更有价值。如果没有,我会尽力提供帮助,但jQ是最好的选择。我从来没有使用过jQuery UI,也不知道重新编写代码需要多长时间。实际菜单中有36个部分。我希望使用什么样的代码才能找到解决方案dy in place.Hrm,由于某些原因,它在单独设置变量值时起作用,但在循环中不起作用。请确保numberOfContentDivs正确。如果不正确,它可能会自动失败。此外,如果我在单击任何其他内容之前单击步骤3,步骤3指示器将变为-如预期的那样;但是,如果您在已单击之后单击步骤3,则在第1步或第2步中,第3步的指示符不会改变。换句话说,只有当您有36个div时,才使用36。否则,请使用正确数量的内容div。啊,好吧……现在是什么导致第3步指示符间歇性改变?
var numberOfContentDivs = 36;
for ( var i = 1; i <= numberOfContentDivs; i++) {
document.getElementById("expandIndicator" + i).innerHTML = openIndicator;
}