aspigのブログ -5ページ目

aspigのブログ

ブログの説明を入力します。

ということでソースを書いてみた。

<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>jQueryを始めてみる</title>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(function(){
$('div.example').hide();
$('div.trigger').click(function(){
$(this).next().slideToggle('fast');
});
})
</script>
</head>
<body>

<div class='trigger'>ここをクリックすると下部が開閉されるはず</div>
<div class='example'>
この部分が開閉されるはず!<br>
この部分が開閉されるはず!<br>
この部分が開閉されるはず!<br>
この部分が開閉されるはず!<br>
この部分が開閉されるはず!<br>
この部分が開閉されるはず!<br>
</div>

</body>
</html>

前回不明だった<div class='trigger'...内の<a タグは不明なので書かない、という方針。
それと、triggerの後ろを青くするのも紛らわしいのではずす。

$(this).toggleClass('active').next().slideToggle('fast');
...を
$(this).next().slideToggle('fast');
として動作確認。

うん、一応動作しますね。
ただ、triggerのタグの上にマウスカーソルを持って行っても指になりません。
その為の<a タグだったのだろうか…?ということで<a タグを入れてみる。

<div class='trigger'><a href="#ex">ここをクリックすると下部が開閉されるはず</a></div>

なるほど、リンクっぽく下線が付き、リンクカラーになって、オンマウスでカーソルも指になりますね。
まぁでも指にするだけなら、<a タグじゃなくて、triggerクラスをそのように書く方が良いように思う。
ということで<a タグを外して、<header>タグ内に以下を追記。

<style>
div.trigger{ cursor:pointer; }
</style>

マウスカーソルはオンマウスで指になりましたね。
それから $(this).next().slideToggle('fast'); って気持ち悪いですね。
<div class='trigger' に何もしないなら next()とか使わずに直接<div class='example' を指定して slideToggle を実行すべきでは?
とするとやっぱりこの $(this) が分からないことには手が付けられない。
ので、これを調べてみる。

『jquery $(this)』でググってみる。
ずっと工事中」というページで、thisのjqueryでの書き方・・・とありました。
まぁつまり、$('div.trigger').click(function(){ の対象タグである <div class='tregger' のことなのでしょう。
ということは、これを書き換えるためには、<div class='example' を示せば良いわけで、それは $('div.example').hide(); の行の方法に沿ってみてはどうだろう?と考えて、以下のように書いてみた。

$('div.example').slideToggle('fast');

ちゃんと動作した。きっと正しい書き方なんだろぉ。
これで未解決の問題の2と3がまぁ大体(雑だけど)解けた。
あとは1番の 'example'の当たっているDIVタグ(長いなこの表現)は hide() で隠れています。いつの間に非表示⇒表示にしているのでしょう? という謎が残っている。

試しに 
$('div.example').hide(); を消してみる。
を?元が表示されている状態だったのが、クリックすると消えるアニメーションが起きる。
ということは、slideToggle は対象の状態を見て、どちらのアニメーションをするのか決めていると言えるようだ。
まぁそんな事言っててもクリアにはならないので、slideToggle について調べてみよう。

またしても『jquery slideToggle』でググる。
アルファシス – alphasis.info -」というページに以下のように書いてある。

「セレクター」の要素が非表示の場合、「セレクター」の要素を、「速度」に指定した速度で、「イージング関数名」に指定したイージング関数名の動作パターンのスライド・ダウン・アニメーションで表示し、その後、「コールバック関数」に指定した関数を実行する。「セレクター」の要素が表示されている場合、「セレクター」の要素を、「速度」に指定した速度で、「イージング関数名」に指定したイージング関数名の動作パターンのスライド・アップ・アニメーションで非表示にし、その後、「コールバック関数」に指定した関数を実行する。

とあるので、予想通りのようだ。

ふ~ん、便利ですねぇ。

前回のミスは<div id='example'>と書いていたことですが(全角ダブルコーテーションの件は無かったことに・・・)、じゃぁこのDIVタグのまま、つまりidで指示したい場合はどうしたらいんだろ?という疑問がわく。元ページによると「css同様に・・・」という記述があった。

ということは、もしかしたら指示側の $('div.example').hide(); を $('div#example').hide(); というようにCSS的に書けばよいのかしら?
試してみよう。

おぉ!ビンゴ!!
ちゃんと「EXAMPLE」が隠れてる。IDで指示する方法はこれで良し。

という事で本題。前回に引き続き「元ページ」に沿って進めてみよう。
今回は隠れてる「EXAMPLE」を表示させる方法です。

$('div.trigger').click(function(){ $(this).toggleClass('active').next().slideToggle('fast');
});

ソースを見てもさっぱりわかりません??説明を読んでみます。
「1行目:div.triggerというHTML要素をクリックすると、その後に命令されているコードが実行されます。」
きっとHTML側(BODY内の方)にtriggerというクラスを持ったdivがあるのでしょうね。
で、そのDIVをクリックすると function内の指示が実行される・・・と。

で、その functionの中身ですね。
「2行目:toggleClassは指定したcssのclassが要素に無ければ追加、あれば削除させるコードです。slideToggleは要素をスライドアップ/ダウンさせます。fastはアニメーションのスピードの指示内容です」
おぉぅ・・・何を言っているのか分からない。
「toggleClassは指定したcssのclassが要素に無ければ・・・」ん?
指定したcssのclassってなに?ソースを見てみる。

$(this).toggleClass('active')... 

'active'のことかな? 'active'ってクラスが無かったら追加、あれば削除?なんで??
まぁ目的は良く分からないけど、先に進もう。
「slideToggleは要素をスライドアップ/ダウンさせます。fastはアニメーションのスピードの指示内容です」
デモを見ると確かにアニメーションして表示非表示が切り替わってます。スライドアップ/ダウンしてますね。
この場合の「slideToggleは要素をスライ・・・」の要素って何だろ?

'active'ってクラスの当たっているタグの事かな?
あと toggleClass と slideToggle の間にある next() ってなんだろ? $(this) ってなに?

???だらけのまま読み進めてみる。

「せっかくtoggleClass(“active”)でcssに変化を加えていますので、パネルが開いている際のスタイルを変更してみます。」
この感じだとやっぱり 'active' はcssのクラスらしい。

<style type="text/css">
div.active{
background: #0f81ff;
}
</style>

なるほど、バックグラウンドを緑がかった青にしている。
動作デモを見てみると、表示させるためにクリックする文字列「クリックでパネルを開閉出来ます」をクリックするとそのバックがこの色になりますね。
ってことは、この'active'というクラスをこの文字列のタグに当てている。ということですね。
で、この「クリックでパネルを開閉出来ます」という文字列には元々'trigger'というクラスが当たっていて'active'はクリックされると当たったり外れたりする、ということですね。

で、slideToggle('fast') これで何してるんでしたっけ?

「slideToggleは要素をスライドアップ/ダウンさせます。fastはアニメーションのスピードの指示内容です」

あぁそうそう、アニメーションですね。
next()の意味は未だに分かりませんが、toggleClassとslideToggleが並列なら、slideToggleの動作対象はtriggerタグの当たっているDIVタグですね。
ん?クリックされる文字列がtriggerタグの当たってるDIVなので、それがアニメーションして表示される?表示されてないのは'example'の方であって'example'がアニメーションして表示されるはずなのでは???

きっと next() に秘密があるのでしょう。

『jquery next()』とググってみる。
jQuery日本語リファレンス」というページのトップに「要素集合の各要素の「次」にあたる兄弟要素を、全て抽出する。」と書いてある。この事と動作デモの動作内容から推測するに、toggleClassの対象である'trigger'クラスの当たっているDIVの次のタグ(これに'example'が当たっていると思われる)に対象が移動する、ということのようです。

ということで、slideToggleの対象は'example'クラスが当たっているタグであり、それをスライドアップ/ダウンさせる。ということなのでしょう。
大体のなぞが解けましたので、まとめてみます。

1.$('div.example').hide(); で、<div class='example'...というタグを非表示にする。
2.<div class='trigger'>クリックでパネルを開閉出来ます</div>というタグがあり、これをクリックすると以下が動作する。
3.toggleClass('active') という指示によって、<div class='trigger'...タグに cssの'active'というクラスが適用され、バックグラウンドが緑がかった青になる。
4.<div class='trigger'...タグの次のタグ、<div class='example'...タグに slideToggle('fast')が実行される。
5.slideToggleによって、アニメーションされて表示される。(表示されてる場合は隠れる)

更に読み進めます。
なんと!ここにHTMLを含めたソースがあるじゃないですか!!!
ということでじっくりソースを眺める。

上記の私の予想通り、<div class='trigger'>クリックでパネルを開閉出来ます</div>というタグがありますね。
ただ文字列がAタグで括られており、以下の通りになっています。

<div class="trigger"><a href="#ex">クリックでパネルを開閉出来ます</a></div>

ん?#exってなんだろ?
まぁいいや。

それと更に予想通り、<div class='trigger'...の後に <div class='example'...があります。
という事で概ね私の予想通りの動きをしていると思われます。

が、未解決(未理解)の問題がいくつかあります。

【未解決の問題】
1.'example'の当たっているDIVタグ(長いなこの表現)は hide() で隠れています。いつの間に非表示⇒表示にしているのでしょう?
2.$(this) とはなんでしょ?
3.<a href="#ex"...タグはなんのため?

次回、自分でソースをいじりながらこれらの問題を考えて見たいと思います。

javascriptの勉強も兼ねて、jqueryについて勉強を始めてみるので、勉強したことをこのブログにメモしながら進めようと思う。

まず「jquery 基礎」とググって、一番上に出てきたページを見てみる。
<div>「jQuery事始め・コピペに頼らず、基礎知識を理解して実際に動かしてみる」というページが出てきたので、こちらを参照しながら進めて見ることにする。</div>

まずjqueryを利用するには、jqueryのエンジン部を取り込む必要がある。
それをするには、こう書く。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript" charset="UTF-8"></script>

わざわざダウンロードしてサイトに設置しなくても、公開されてるソースをそのまま取り込めればそれに越したことはないですね。

けどこれって最新なのだろうか?
もし最新のjqueryと仕様が違うなら、これをベースに進めるのもなんなので、一応確認。
単純に『jquery』でググって、jqueryのページに行ってみる。
DOWNLOADのページ」で、以下の記述を見つける。

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

1.9.1>1.7.0ということで、こちらを組み込むことにしてみる。

元ページに戻って、早速見よう見まねでソースを書いてみる。

----- ここから -----
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>jQueryを始めてみる</title>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(function(){
$(”div.example”).hide();
})
</script>
</head>
<body>
<div id='example'>EXAMPLE</div>
</body>
</html>
----- ここまで -----

こんな感じかなぁ?
これで「EXAMPLE」が表示されなければひとまず成功。

ん?EXAMPLEがひょうじされたままだぞ!!?
なんでだろ。jqueryが1.7.0じゃないからか?DIVタグの書き方が悪いのか?なんか指定する順番とかあるのか?
よく分からないので、元ページの動作デモのソースを眺めてみることに。

ん~、こちらのデモは開閉機能(非表示から表示にする機能)まで含んでいるので、ちょっと違うけど、
やってることはほぼ一緒だな。あっいや違う。idじゃなくてclassで'example'を指定している。
ということで、<div id='example'>⇒<div class='example'>に変更。

どうだ?
あれれ?まだ表示されるぞ?

jquery(エンジン?)は読み込めてるのかな?
Google Chromeでソースを表示して、<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>の「http://code.jquery.com/jquery-1.9.1.min.js」の部分をクリックしてみると、ちゃんとなにやらそれらしいものが表示されてる。なので、これは問題ないだろぅ。

あとはなんだろ?
ってことで、一つずつソースを元ページの動作デモソースからコピッてみることに・・・

まず怪しいのは、隠す指示が書いてある scriptタグだ。
この部分をコピペしてみる。(元ソースでは表示機能部分もあるので、それを除いて)

どうだ?
おっ!!隠れた!!
違いはなんだ?

あららコピーミスですわ。
(×) $(”div.example”).hide(); ⇒ (○) $("div.example").hide();
でした。ダブルコーテーションが表示用の全角文字になってた部分をコピっちゃってたのね。

くだらないミスをしながらも、最低限の基礎の基礎が出来た!!
と満足したので、次にいくことにする。