Javascript 为什么我的按钮需要点击两次,事件处理程序才能第一次工作,但之后只需点击一次?
我希望访问者能够展开/折叠某些部分,并使用:Javascript 为什么我的按钮需要点击两次,事件处理程序才能第一次工作,但之后只需点击一次?,javascript,events,dom,Javascript,Events,Dom,我希望访问者能够展开/折叠某些部分,并使用: <input onclick="return toggleDiv('xx')" type="button" class="button" value="click here to expand/collapse"/> 第一次单击按钮时,按钮不起作用,随后的单击(在任何按钮上)都可以正常工作 这里有相关的对话: 但是我不明白答案(太专业了;-), 有人能解释一下吗?您的“xx”div的初始
<input onclick="return toggleDiv('xx')"
type="button"
class="button"
value="click here to expand/collapse"/>
第一次单击按钮时,按钮不起作用,随后的单击(在任何按钮上)都可以正常工作
这里有相关的对话:
但是我不明白答案(太专业了;-),
有人能解释一下吗?您的“xx”div的初始样式可能会引起一些麻烦 解释 假设您配置了一个样式表规则,使
div
s最初处于隐藏状态。比如:
div { display: none }
(…当然,选择器(div
)的宽度可能会小一些)
这看起来工作正常,因为页面将加载所有隐藏的div
元素(“折叠”)。但是,元素本身的style.display属性没有实际值——它们只是从样式表继承了值。因此,在代码中,用于检查元素是否隐藏的测试:
if(e.style.display=="none"){
…将失败,错误地将目标标识为可见,并导致style.display
属性设置为“none”(该属性没有可见效果,因为元素已被样式表隐藏)。然后,下次单击按钮时,您上次设置的值将导致文本成功,并且您的例程将style.display
设置为“block”
纠正此问题的简单方法是简单地反转测试并检查“阻塞”:
…但是,如果您将某些元素配置为初始可见,则这将崩溃:相反,您将遇到相同的问题,第一次单击按钮无法产生任何可见效果。要获得更健壮的行为,需要测试元素上实际处于活动状态的样式:
function getStyle(el, name)
{
// the way of the DOM
if ( document.defaultView && document.defaultView.getComputedStyle )
{
var style = document.defaultView.getComputedStyle(el, null);
if ( style )
return style[name];
}
// IE-specific
else if ( el.currentStyle )
return el.currentStyle[name];
return null;
}
function toggleDiv(a){
var e=document.getElementById(a);
if(!e)return true;
if(getStyle(e, "display") == "none"){
e.style.display="block"
} else {
e.style.display="none"
}
return true;
}
在这里,我们使用一个助手函数,
getStyle()
,以跨平台的方式检索活动值。另请参见:,类似的内容可能适合您。但是把它放在文件的开头。windowonload函数很重要,因为在处理输入字段之前需要加载DOM
<input id="divOpener" rel="xx" type="button" class="button" value="click here to expand/collapse"/>
为了保存所有额外的Javascript代码以获得样式等,一个简单的修复方法是将隐藏CSS添加到元素本身
<div class="yourclass" style="display:none;">content</div>
内容
编辑
我决定更好地解释我的答案。我假设您没有隐藏默认情况下要切换的div
,因此它是可见的,但是当调用e.style.display
时,结果不会是none
也不会是block
,因为尚未设置样式
相反,您正在检索一个空字符串,这意味着您第一次单击它时,else语句正在触发;第一次单击时,
div
显示被设置为无,这样下一次单击将检索值为none
,因此当然会将其更改为block
,更容易实现
var a=1;
function toggleDiv(xx){
var e=document.getElementById(xx);
if(a==1){
e.style.display="block";a=0;
} else {
e.style.display="none";
a=1;
}
}
您要寻找的简单答案是添加
显示:无代码>到内联样式。这样,当你看着
if (x.style.display == 'none')
它会变成现实 Shog9的回答使我免于一个晚上的挫折。谢谢
然而,有一个比他提出的更简单的解决方案。秘密在于简单地切换条件的顺序。i、 e
if(e.style.display == "block"){
e.style.display="none"
} else {
e.style.display="block"
}
这里的观点是,该条件可能会因为两个不同的原因而失败:如果无法获得该值,它无论如何都会做正确的事情。xx div的定义/样式是什么?我要做的第一件事是打开FireBug(firefox javascript开发工具),设置断点iside toggleDive,然后逐步执行,确保一切如我所想。如果不想处理这个问题,可以在函数中设置do alert(e.style.display)。这可能会让我们了解一些情况。就在第一个if语句之后,添加以下行:alert(“display is'+e.style.display+”);然后再次运行代码。这应该有助于你理解发生了什么。进一步信息:页面验证,并且在Chrome中需要相同的第一次双击,即Firefox。回答:谢谢你花时间解释清楚Jaime。我现在明白了,并且让它工作了。你可以在这里看到你的手工作品:www.alanarnoldguitars.co.uk/guitar\u repairs.htm再次感谢,如果这不起作用,请说明你的要求,我们可以从那里开始。。。
var a=1;
function toggleDiv(xx){
var e=document.getElementById(xx);
if(a==1){
e.style.display="block";a=0;
} else {
e.style.display="none";
a=1;
}
}
if (x.style.display == 'none')
if(e.style.display == "block"){
e.style.display="none"
} else {
e.style.display="block"
}