解決する必要のある誤解がいくつかあるようです。明らかに正しい方向に進んでいることを心配しないでください。
まず、このようにdocument.readyイベント内で呼び出しをラップする必要があります。
<script type="text/javascript">
$(document).ready(function() {
var buttons = $("#buttons").find("a");
$("buttons").click(function() {
var id = $(this).attr("id");
$("pages id").css("display", "none");
$("pages id:eq("+id+")").css("display", "block");
});
});
</script>
これは、HTMLが順番にレンダリングされる、つまり1行ずつ読み取るためです。javascriptコードが実行されるとき、ボタンのHTMLはまだレンダリングされていないため、何について話しているのかわかりません。また、readyイベントハンドラーは、クリックイベントハンドラーとほぼ同じように構成されていることに注意してください。別のオブジェクトを操作し、別のイベントを使用しているだけです。
次の問題は、セレクターの動作に苦労しているように見えることです。
var buttons = $("#buttons").find("a");
ここでは実際に2つのセレクターを使用しています。$()と.find()は、ほぼ同じことを行います。ただし、jQueryオブジェクトセレクターはドキュメント全体のクエリに使用され、findはサブセットのクエリに使用されます。したがって、あなたがやろうとしていることには、これがより適切でしょう:
var buttons = $("a");
これは単に「すべてのアンカータグを選択する」という意味です。セレクターが特殊文字で始まらない場合は、単にそのタイプのタグを探しています。#文字は、idと。を使用してすべての要素を照会します。文字は、そのクラスのすべての要素を照会します。したがって、最初のステートメントは、実際には、存在しないID「buttons」を持つ要素をクエリしていました。
最後に、簡単にするために、作成しようとしている変数を作成する必要はありません。その行を削除して、クリックハンドラーに移動します。
<script type="text/javascript">
$(document).ready(function() {
$("a").click(function() {
var id = $(this).attribute("id");
$("pages id").css("display", "none");
$("pages id:eq("+id+")").css("display", "block");
});
});
</script>
次の問題は、ID属性をデータフィールドとして使用していることです。これをしないでください。要素に関する情報をそのタグ内に格納する必要がある場合は、接頭辞「data-」で始まるカスタム属性を使用します。したがって、この場合は、アンカータグを変更してみましょう。
<div id="buttons">
<a href="#" data-id="0" class="mybutton myred">Div 1</a>
<a href="#" data-id="1" class="mybutton myblue">Div 2</a>
<a href="#" data-id="2" class="mybutton myblue">Div 3</a>
</div>
それは少し良いです。今、私たちはdivで同じ問題を抱えています。同じことを行うこともできますが、この情報をクエリし、クラスでセレクターを使用する方がはるかに簡単なので、idに従ってdivクラスを指定しましょう。
<div id="pages">
<div class="mydivshow div1">1111</div>
<div class="mydivhide div2">2222</div>
<div class="mydivhide div3">3333</div>
</div>
これで、jQueryに戻ってコードを変更できます。
<script type="text/javascript">
$(document).ready(function() {
$("a").click(function() {
var id = $(this).attribute("data-id"); // Using a custom attribute.
$("#pages div").hide(); // gather all the div tags under the element with the id pages and hide them.
$(".div" + id).show(); // Show the div with the class of .divX where X is the number stored in the data-id of the object that was clicked.
});
});
</script>
そしてそれはそれをするべきです!