aspigのブログ -3ページ目

aspigのブログ

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

前回宣言した通り、地道に次の項目を試す。
今回は EACH。普通にプログラミング言語的には、あの each ?って感じですがどうでしょう?
とりあえず書いてみたコードが以下。

<!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(){
$("span").click(function () {
$("div").each(function(){
$(this).toggleClass("example");
});
});
});
</script>
<style>
div.example { background-color:blue; }
</style>
</head>
<body>
<span>Click here...</span>
<div>number 1</div><br>
<div>number 2</div><br>
<div>number 3</div>
</body>
</html>

クリックすると全<div>タグの背景が青くなります。
これってループしてるんですかね?
each ならループしてるって前提なんですが・・・(私的には)
そこで

<!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">
var i=0;
$(function(){
$("span").click(function () {
$('div').each(function(i) {
alert(i);
i++;
});
});
});
</script>
<style>
div.example { background-color:blue; }
</style>
</head>
<body>
<span>Click here...</span>
<div>number 1</div><br>
<div>number 2</div><br>
<div>number 3</div>
</body>
</html>

としてみた。
単純に<div>タグの数だけ alert(番号(0~2)) が表示されましたので、ループしてるんでしょうね。
この時のキーって何になるんだろ?そしてキーって取れるんだろうか?
そこで、サンプル2を見てみると・・・

$("button").click(function () {
$("div").each(function (index, domEle) {
// domEle == this
$(domEle).css("backgroundColor", "yellow"); 
if ($(this).is("#stop")) {
$("span").text("Stopped at div index #" + index);
return false;
}
});
});

ってのがあるんだけど、なんじゃこりゃ???
eachの後ろのfunctionがパラメータを2つ取ってますが、これって誰が何を渡してるの?
動きと合わせて読んでみると、どうやら、index は繰上げ数、domEleはDOMエレメントのことのようです。
それを確かめるために、以下のコードを書いてみた。

<!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(){
$("span").click(function () {
$('div').each(function(index,domEle) {
$(domEle).css("backgroundColor", "yellow");
alert(index);
});
});
});
</script>
<style>
div.example { background-color:blue; }
</style>
</head>
<body>
<span>Click here...</span>
<div>number 1</div><br>
<div>number 2</div><br>
<div>number 3</div>
</body>
</html>

さっきまでは, var i=0 としてから i をインクリメントしながらアラートたんだけど、今回のは単に index をアラートしてる。
果たして同じように 0, 1, 2 と順にアラートが出てきた。
また、アラートが出る前に、対象DOMエレメントの背景が黄色になっていることも確認できた。

補足:toggleClass() は、括弧内のcssセレクタが対象エレメントにおいて、ONならOFFにOFFならONにする命令だった。
(用語の使い方は合っているのだろうか?)

なんか地味なのばっかりで早くも飽きてきた。
基礎の基礎なんだけどね。
ってことでやっぱ派手な(って程でもないけど)EFFECT系にちょっとだけ走ってみた。
ということで今回は fadeIn フワッと表示するやつ。

まずは
fadeIn サンプルのソースを利用して書いたみた。

<!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(){
$(document.body).click(function() {
$("div:hidden:first").fadeIn("slow");
});
});
</script>
<style>
span{ color:red; cursor:pointer; }
div{ margin:3px; width:80px; display:none;
     height:80px; float:left; }
div#one{ background:#f00; }
div#two{ background:#0f0; }
div#three{ background:#00f; }
</style>
</head>
<body>
<span>Click here...</span>
<div id="one"></div>
<div id="two"></div>
<div id="three"></div>
</body>
</html>

動作したソースはこれ。
動きとしては、まずクリック・・・ん?
$(document.body).click(func...ってことは、<body>全体にかかってるなぁ。ホントかな?ってことで、<span>Click here...</span> の後ろにいろいろ書いてみて、それをクリックして動作するかどうかを検証。うん、ちゃんと動く。
このクリックは<span>タグとは無関係だ。

で、クリックすると多分、<div>タグの隠れているものの最初のエレメント(?)がフェードインする…ということなんだと思われる。
ちなみに 3つの<div>タグはもともと、スタイルシートの

div{ margin:3px; width:80px; display:none;
      height:80px; float:left; }

の中の display:none; によって、表示されていない。
動作はなんとなく読めたが、今回の焦点の $("div:hidden:first").fadeIn("slow"); が分からない。
実際の動きからの推測(あてずっぽう)だ。


このセミコロン繋がりはなんだろ?基礎をすっ飛ばしたから分からないんだろなぁ。
と思って探してみたらやっぱりあった。API/Selectors
のページにいろいろ載っているようだ。
という事で、次回からやっぱり地道に行くことにする。

今回は jQuery(callback) です。

$(document).ready()の短縮形。

って書いてあるけど、なんだろ?

DOM Documentのロードが終わった際に、バインドしておいた関数が実行されるようになる。

って?おぉ前記事の最後に書いたことが早速出てきたじゃん!
ってことでしょ?ということで試してみる。
ソースはこれ。

<!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><p>Hello</p></div>").appendTo("body");
});
</script>
</head>
<body>

</body>
</html>

<body>タグの前に $("<div><p>Hello</p></div>").appendTo("body"); を書いたら上手くいかなかったのを、全部読み込んでから実行するなら前に書いても良いでしょ?ってことでこんな風に書いてみました。

オッケーです。バッチリ表示されました。
こりゃ便利ですね。

ついでに 
$(document).ready() について・・・
window.onload だと画像を読み込んでから実行するので、ちょっと遅い。
$(document).ready() だと、ソースだけでも読み込み終われば実行するから、動作も少し早めに開始される(ようだ)。
ただし、$(document).ready()($(function(){も同じ)を使うときは、 window.onload は使っちゃ駄目だそうだ。
使うとどうなるんだろ?試してみよう。

<!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><p>Hello</p></div>").appendTo("body");
});
window.onload=function(){ alert('abc'); }
</script>
</head>
<body>

</body>
</html>

あれれ?普通に「Hello」も表示され、alert('abc')も出てくるんだけどなぁ。
まぁいいや。保留。