私のWebページでJSを使用してドロップダウンメニューを実装しようとしています。私はこれがCSSで可能であることを知っていますが、私はまだこれを達成するためにJSを使いたいと思います。window.setTimeout(someFunc、0)がsomeFuncを直接呼び出すのと同じではないのはなぜですか?
だから私はGoogleで周りに検索し、このコードを見つけました:
var timeout = 500;
var closetimer = 0;
var ddmenuitem = 0;
// open hidden layer
function mopen(id)
{
// cancel close timer
mcancelclosetime();
// close old layer
if(ddmenuitem) ddmenuitem.style.visibility = 'hidden';
// get new layer and show it
ddmenuitem = document.getElementById(id);
ddmenuitem.style.visibility = 'visible';
}
// close showed layer
function mclose()
{
if(ddmenuitem) ddmenuitem.style.visibility = 'hidden';
}
function mclosetime()
{
closetimer = window.setTimeout(mclose, timeout);
}
// cancel close timer
function mcancelclosetime()
{
if(closetimer)
{
window.clearTimeout(closetimer);
closetimer = null;
}
}
// close layer when click-out
document.onclick = mclose;
#sddm
{ margin: 0;
padding: 0;
z-index: 30}
#sddm li
{ margin: 0;
padding: 0;
list-style: none;
float: left;
font: bold 11px arial}
#sddm li a
{ display: block;
margin: 0 1px 0 0;
padding: 4px 10px;
width: 60px;
background: #5970B2;
color: #FFF;
text-align: center;
text-decoration: none}
#sddm li a:hover
{ background: #49A3FF}
#sddm div
{ position: absolute;
visibility: hidden;
margin: 0;
padding: 0;
background: #EAEBD8;
border: 1px solid #5970B2}
#sddm div a
{ position: relative;
display: block;
margin: 0;
padding: 5px 10px;
width: auto;
white-space: nowrap;
text-align: left;
text-decoration: none;
background: #EAEBD8;
color: #2875DE;
font: 11px arial}
#sddm div a:hover
{ background: #49A3FF;
color: #FFF}
<ul id="sddm">
<li><a href="#" onmouseover="mopen('m1')" onmouseout="mclosetime()">Home</a>
<div id="m1" onmouseover="mcancelclosetime()" onmouseout="mclosetime()">
<a href="#">HTML DropDown</a>
<a href="#">DHTML DropDown menu</a>
<a href="#">JavaScript DropDown</a>
<a href="#">DropDown Menu</a>
<a href="#">CSS DropDown</a>
</div>
</li>
<li><a href="#" onmouseover="mopen('m2')" onmouseout="mclosetime()">Download</a>
<div id="m2" onmouseover="mcancelclosetime()" onmouseout="mclosetime()">
<a href="#">ASP Dropdown</a>
<a href="#">Pulldown menu</a>
<a href="#">AJAX dropdown</a>
<a href="#">DIV dropdown</a>
</div>
</li>
<li><a href="#" onmouseover="mopen('m3')" onmouseout="mclosetime()">Order</a>
<div id="m3" onmouseover="mcancelclosetime()" onmouseout="mclosetime()">
<a href="#">Visa Credit Card</a>
<a href="#">Paypal</a>
</div>
</li>
<li><a href="#" onmouseover="mopen('m4')" onmouseout="mclosetime()">Help</a>
<div id="m4" onmouseover="mcancelclosetime()" onmouseout="mclosetime()">
<a href="#">Download Help File</a>
<a href="#">Read online</a>
</div>
</li>
<li><a href="#" onmouseover="mopen('m5')" onmouseout="mclosetime()">Contact</a>
<div id="m5" onmouseover="mcancelclosetime()" onmouseout="mclosetime()">
<a href="#">E-mail</a>
<a href="#">Submit Request Form</a>
<a href="#">Call Center</a>
</div>
</li>
</ul>
<div style="clear:both"></div>
<div style="clear:both"></div>
私はドロップダウンがすぐに消えるしたいので、マウスポインタが出て移動した後、私はJSを少し編集しましたドロップダウンの
function mclosetime()
{
closetimer = window.setTimeout(mclose, 0);
}
とtimeout
変数を削除:だから私はこれにそれを変更しました。すべてはまだ動作します。それで、mclosetime
は、基本的にmclose
を0の遅れで呼び出していることに気付きました。私はmclosetime
があまり機能せず、取り除くことができると思っていました。だから私はそれを取り出して、直接mclose
を呼び出すためにli
の要素を変更:
<li><a href="#" onmouseover="mopen('m1')" onmouseout="mclose()">Home</a>
<div id="m1" onmouseover="mcancelclosetime()" onmouseout="mclose()">
<a href="#">HTML DropDown</a>
<a href="#">DHTML DropDown menu</a>
<a href="#">JavaScript DropDown</a>
<a href="#">DropDown Menu</a>
<a href="#">CSS DropDown</a>
</div>
</li>
次にドロップダウンはもう動作しません!マウスポインタをドロップダウンメニューに移動するとすぐにドロップダウンが消えます。私はこれがclosetimer
が0であることに起因していると思ったので、私はこれにmclose
を変更:
function mclose()
{
closetimer = 1;
if(ddmenuitem) ddmenuitem.style.visibility = 'hidden';
}
それでも同じことが起こります。
私は本当に混乱しています。 window.setTimeout
は、タイムアウトが0の場合に関数を呼び出すだけではありませんか?それ以上のことがなければ、ここでmclose
と呼ぶとうまくいくはずです!
は、技術的に、 'のsetTimeout(FUNC、遅延)が' 'ない_exactly delay'のミリ秒after_、delay'のミリ秒' than_ _no以下で 'func'を呼び出すことを意味します。 – Passerby
@Passerbyなぜそれが違いになるのでしょうか?また、ドキュメントへのリンクを教えてください。私はW3Schoolsの 'setTimeout'に関するページを読んでいますが、これについては言及していません。 – Sweeper
[このMDNドキュメント](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout)、特に「Notes」の部分をお読みください。 – Passerby