jQueryでidが認識されなかったことのメモ
■ボタンでid追加した場合に認識されなかった。
javascriptを少しいじっていて、画面からボタンを押した際に、画面上にレイヤー表示させ、そのレイヤーをクリックすると消えるといったことをやりたいけど、クリックして消える部分がうまくいかなかった。以前、javascriptで作ったカレンダーのコードをベースにしているので、なぜ動かないか調べた内容のメモ。
サンプルのHTMLファイルは下のもの。
<html>
<head>
<meta charset="utf-8">
<title>Map</title>
<link href="sample2Cs.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="jquery-3.5.1.min.js"></script>
<script>
$(function () {
$("#glayLayer").click(function(){
$("#glayLayer").hide()
window.alert("コードが来ているかのチェック");
})
});
function setLayer(dir) {
$("body").append("<div id='glayLayer'></div>");
$("#glayLayer").show();
}
</script>
</head>
<body>
<button text="BUTTON" id="mark01" onclick="setLayer(id)">Display Layer</button>
</body>
</html>
HTMLのボタンをセットして、クリックするとsetLayer(id)関数が動き、レイヤー(glayLayer)を追加、表示する。次のsample2Cs.cssで、glayLayerのプロパティを決める。
#glayLayer{
display:none;
position:fixed;
left:0;
top:0;
height:100%;
width:100%;
background:#7BAEB5;
filter:alpha(opacity=75);
opacity: 0.75;
}
これをChromeで実行して、ボタンをクリックすると下のような画面になる。画面一面にレイヤーが張られた状態。ChromeのディベロッパーツールからHTMLを見ると、glayLayerが追加されていることが分かる。
ここから、レイヤーをクリックすると、上のコードで$("#glayLayer").click(function() 以下が起動して、消えることを予想していたけど、消えない(もちろんalertも出ない)。
以前のカレンダーのコードといろいろ見比べてみたら、どうやらレイヤーのタグの追加タイミングが違っていたよう。下のように、<div>タグの追加をjQueryの関数部分($(function ()以下)に持っていったら予想通りの動きになった。
<html>
<head>
<meta charset="utf-8">
<title>Map</title>
<link href="sample2Cs.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="jquery-3.5.1.min.js"></script>
<script>
$(function () {
$("body").append("<div id='glayLayer'></div>");
$("#glayLayer").click(function(){
$("#glayLayer").hide()
window.alert("コードが来ているかのチェック");
})
});
function setLayer(dir) {
$("#glayLayer").show();
}
</script>
</head>
<body>
<button text="BUTTON" id="mark01" onclick="setLayer(id)">Display Layer</button>
</body>
</html>
このHTMLファイルを実行すると、ブラウザが起動した直後からglayLayerのタグ自体は入っている(表示はされていないけど)。これが重要のよう。
ボタンをクリックしてレイヤーを追加、表示しても、HTMLのコードには、対象のidが入っているので、なぜjQueryでの関数が認識されないのか少しはまった話。