私はしばらくこれをいじっていましたが、それは機能せず、理由がわかりません。助けてください。ここに私が持っているものがあります:
<html>
<head>
<title>lala</title>
</head>
<body>
<h1 onmouseover="go('The dog is in its shed')" onmouseout="clear()">lalala</h1>
<div id="goy"></div>
<script type="text/javascript">
function go(what) {
document.getElementById("goy").innerHTML = what;
}
function clear() {
document.getElementById("goy").innerHTML = "";
}
</script>
</body>
</html>
マウスオーバーは機能し、div内のテキストを表示しますが、マウスをh1タグの外に移動すると、テキストはそこに留まり、理由がわかりません。
問題は、グローバルシンボルclear
が既に使用されており、関数がそれをオーバーライドできないことです。その名前を別の名前に変更した場合(blah
を使用しました)、うまく機能します
ライブ: 失敗したclear
を使用したバージョン | 動作するblah
を使用するバージョン
<html>
<head>
<title>lala</title>
</head>
<body>
<h1 onmouseover="go('The dog is in its shed')" onmouseout="blah()">lalala</h1>
<div id="goy"></div>
<script type="text/javascript">
function go(what) {
document.getElementById("goy").innerHTML = what;
}
function blah() {
document.getElementById("goy").innerHTML = "";
}
</script>
</body>
</html>
これは、基本原則の優れた例です。可能な限りグローバル変数を使用しないでください。ブラウザのグローバル名前空間は信じられないほど混雑しており、競合が発生すると、このような奇妙なバグが発生します。
その結果、古いスタイルのonxyz=...
属性を使用してイベントハンドラーをフックしないのが、グローバルを必要とするためです。代わりに、少なくともコードを使用して接続します。 Live Copy
<html>
<head>
<title>lala</title>
</head>
<body>
<h1 id="the-header">lalala</h1>
<div id="goy"></div>
<script type="text/javascript">
// Scoping function makes the declarations within
// it *not* globals
(function(){
var header = document.getElementById("the-header");
header.onmouseover = function() {
go('The dog is in its shed');
};
header.onmouseout = clear;
function go(what) {
document.getElementById("goy").innerHTML = what;
}
function clear() {
document.getElementById("goy").innerHTML = "";
}
})();
</script>
</body>
</html>
...さらには、DOM2のaddEventListener
(またはIE8以前ではattachEvent
)を使用して、要素のイベントに複数のハンドラーを持たせることができます。
残念ながら、h1タグはonmouseoutイベントを受け取りません。
以下の簡単なJavascriptスニペットは、すべての要素で機能し、1つのマウスイベントのみを使用します。
注:「スニペットの境界線は、要素を視覚的に区別するために適用されます。」
document.body.onmousemove = function(){ move("The dog is in its shed"); };
document.body.style.border = "2px solid red";
document.getElementById("h1Tag").style.border = "2px solid blue";
function move(what) {
if(event.target.id == "h1Tag"){ document.getElementById("goy").innerHTML = "what"; } else { document.getElementById("goy").innerHTML = ""; }
}
<h1 id="h1Tag">lalala</h1>
<div id="goy"></div>
これは、h1タグにホバーセレクターのcssプロパティを追加することにより、純粋なCSSでも実行できます。
const destroy = container => {
document.getElementById(container).innerHTML = '';
};
前へ
const destroyFast = container => {
const el = document.getElementById(container);
while (el.firstChild) el.removeChild(el.firstChild);
};