Wikiみたく

2011-05-06

Head First JavaScriptを読んだ。

| 19:43

はじめに

JavaScript合宿の教材として、「WEB+DB vol62」と「Head First JavaScript」を読んだ(2011/5/4-2011/5/6)。新しく知ったことをまとめていく。

Head First JavaScript ―頭とからだで覚えるJavaScriptの基本

Head First JavaScript ―頭とからだで覚えるJavaScriptの基本

1章 インタラクティブウェブ:応答するバーチャルワールド

2章 データを格納する:あらゆる物には然るべき場所がある

P49

データはテキスト、数値、論理値で表現される。

定数は、"const HOGE = 300;"のように作成する。ただしIEでは使えない。

P69

定数名はすべて大文字、変数関数名は小文字始まりのキャメルケースを使用する。

定数作成時は必ず初期化する。

NaNは"Not a Number"の略。

文字列から数値への変換には、parseInt()やparseFloat()を使用する。

3章 ブラウザを調べる:ブラウザを探検する

P104

1回かぎりのタイマーはsetTimeout()を、一定間隔で繰り返すタイマーはsetInterval()を使用する。(中止はclearInterval()。)

ウェブページ要素のstyleオブジェクトにはwidth, heightなどのスタイルプロパティがある。

クライアントウィンドウ」とはブラウザのうち、ウェブページが表示される領域をいう。

クライアントウィンドウ」の幅・高さはdocument.body.clientWidth, clientHeightでアクセスする。

4章 意思決定:道が分かれていたら、どっちに進むか決めなさい

P165

false自身の他に、null, 0, ""はfalseとみなされる。

5章 ループ:同じことが重複するのは危険

P199

配列は、"var ary = new Array();"のように作成する。

インデクス配列の作成と初期化は、"var ary = [1, 2, 3];"のようにする。

P201

配列には異なる型のデータを格納することができる。

P202

インデクス配列は、数値キーを使ってアクセスする。

P232

二次元配列は、"var ary = new Array(new Array(3), new Array(3));"のように作成する。

P234

配列に要素を追加するときは、Array.push()を使用するか、"ary[4] = 99;"(要素数4の配列に1要素を追加する場合)のようにする。

二次元配列の行は、異なる大きさであってもよい。"var a = new Array(new Array(1), new Array(3));"

6章 関数:節約、再利用、リサイクル

P272

関数の宣言方法は次の二通りある。(両方とも同じ)

function func(arg1, arg2) {
  return arg1 + arg2;
}
var func = function (arg1, arg2) {
  return arg1 + arg2;
}
P278

HTML属性を使ってコールバック関数イベントハンドラとしてイベントに関連付ける代わりにJavaScriptで書くことができる。(二番目は匿名関数を使用した場合)

window.onload = func;
window.onload = function (evt) {
  //...何か処理
}

7章 フォームと検証:ユーザに洗いざらい話してもらう

P295

フォームフィールドで発生するイベント

  1. フィールド選択(onfocus)
  2. データ入力
  3. 次のフィールドへ(onblur/onchange(値が変化していた場合))
  4. 次のフィールド選択(onfocus)
  5. ...
P309

関数宣言の引数の個数よりも実際の使用時の引数の個数が少ない場合は、渡されなかった仮引数にはnullが入る。

function func(a1, a2) {
  //a1 = 10, a2 = null
}
func(10);

HTMLのsize属性は単なる大きさを表す。入力可能桁数とは無関係。

正規表現にはRegExpオブジェクトを使用する。マッチにはtest()メソッドを使用する。

var regexp = /^\d{5}$/;
if (regexp.test("97875"))
  //...

8章 ページの部品をかき集める:HTMLDOMで切る

P352

innerHTMLはMicrosoftIEのために作成した機能でありウェブ標準ではない。

P354

DOMツリーにあるノードタイプには以下のようなものがある。他にもある。

  • DOCUMENT
  • ELEMENT
  • TEXT
  • ATTRIBUTE
  • ...
P357

ノードプロパティには以下のようなものがある。多分他にもある。

  • nodeValue
  • nodeType
  • childNodes
  • firstChild
  • lastChild
P361

ノードテキストを変更する安全な手順は以下のようになる。

//子ノードをすべて削除する。
var node = document.getElementById("hoge");
while (node.firstChild)
  node.removeChild(node.firstChild);
//新しいテキストノードを作成する。
var textNode = document.createTextNode("fugafuga");
//作成したテキストノードを子ノードとして追加する。
node.appendChild(textNode);
P364

innerHTMLを使用してコンテンツを変更すると、要素の子ノードがすべて削除されてから、新しいコンテンツが追加される。

P379

ノードのclassNameプロパティでスタイルクラスを変えることで、大きくスタイルを変更できる。

ノードのstyleプロパティでスタイルを変えることで、細かくスタイルを変更できる。

var node = document.getElementById("hoge");
node.className = "anotherclass";
var node2 = document.getElementById("hoge");
node2.style.display = "none";
P385

新しいHTML要素を作成するには、document.createElement()を使用する。

var elem = document.createElement("p");
elem.appendChild(document.createTextNode("hogehoge"));
document.getElementById("fuga").appendChild(elem);

DOMツリーにノードを追加したり削除すればウェブページを思い通りに変更できる。

9章 データを活気づける:オブジェクトフランケンデータ

P417

DateオブジェクトのgetMonth()メソッドは0から11を返す。

P432

toString()メソッドは、alert()の引数に渡されたときに自動的に呼び出される。

Array.sort()は以下のように使用する。(あまり良くない例だなぁ。。。)

ary.sort(function (a1, a2) {
  //a1が小さい => -1
  //a1 = a2   =>  0
  //a1が大きい =>  1

  //上記のような戻り値にした場合、小->大のようにsortされる。
});

10章 カスタムオブジェクトを作成する:カスタムオブジェクトを思い通りに

P458

JavaScriptでクラスのようなものを作る。

//コンストラクタ
function Hoge(a1, a2) {
  this.a1 = a1;
  this.a2 = a2;
}

//メソッド宣言
Hoge.prototype.method1 = function () {
  //...
}
Hoge.prototype.method2 = function (a1, a2, a3) {
  //...
}
P463, P471

クラスプロパティとクラスメソッドを作成する。

//上記のHogeクラスをそのまま使用する。

//クラスプロパティ
Hoge.prototype.fuga = "FUGAFUGA";
//クラスメソッド
Hoge.method3 = function () {
  //...
  //クラスメソッドはクラスプロパティにアクセスできる。
}
P469

標準オブジェクトを拡張することができる。

String.prototype.hoge = function () {
  //...
  //でもプロパティに何があるか不明だから、
  //メソッドからもらえる値しか使えないような気がする。。。
}

11章 バグをなくせ:良いスクリプトも悪くなる

P524

ヘッダ部にスクリプトを書いている場合には、その時点ではボディ部が読み込まれていないことに注意する。onloadイベントはページの読み込みが完了したことを表すので、そのイベントハンドラでボディ部を使用するようにする。

<html>
 <head>
  <script type="text/javascript">
   var hoge = new Hoge(); //実行時エラー
   function Hoge() {
    //document.bodyを使用する。
   }
  </script>
 </head>
 <body>
 </body>
</html>
<html>
 <head>
  <script type="text/javascript">
   var hoge;
   function Hoge() {
    //document.bodyを使用する。
   }
  </script>
 </head>
 <body onload="hoge = new Hoge();">
 </body>
</html>

12章 ダイナミックなデータ:感度良好なウェブアプリケーション

困ったときに見るURL

URLコメント
MDNJavaScripthttps://developer.mozilla.org/ja/JavaScript色々書いてある。でも重い。
HTTP/1.1http://www.studyinghttp.net/rfc_ja/rfc2616
HTML4.01Specificationhttp://www.w3.org/TR/html401/
CSS2仕様http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/
ECMAScript仕様http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/
DOM仕様http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/Core/index.html
DOM HTML仕様http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/HTML/index.html

JavaScriptライブラリ

その他のメモ

関数, メソッド

alert(), confirm(), prompt()

isNaN()

Number.toFixed()

String.indexOf()

数字の欲しいフィールドに対するチェック
if ( document.getElementById("hoge").value == ""
     || isNaN(document.getElementById("hoge").value) ) {
  //エラー処理
}
クッキー

クッキーはデータの永続化に使用する。クッキーには"名前と値、有効期限"がある。

navigator.cookieEnabledで利用可能かどうかを調べる。

document.cookieアクセスする。

デバッグ、エラー

debugにはalert(), エラーにはブラウザのエラーコンソール

2011-05-03

はてなダイアリーの検索の表示順について

| 20:25

前々から思っていたんだけど、はてなダイアリートップページから「はてなダイアリーから検索」で検索をしたときの検索結果の表示順は何を元にしているのかがついに分かった(今まで調べなかっただけだけど)。「検索結果の表示順は、はてなで開発した独自のアルゴリズムによって決定され、より検索結果として相応しいものが上位に来るよう調整されます。」だそうで。自分の使い方では、例えば日付順に並べてほしいことがすごくたくさんある。ある製品について誰か感想を書いていないか探す場合、発売日前に書かれた日記が発売後も表示される。日付順にソートできれば、新しいことは何も書かれていないことが確認できて新しい記事を探す手間が無くなると思う。もしかしたら「はてなで開発した独自のアルゴリズム」はもう既にそうなっているのか?それならそう書いてほしいなぁ。それともそんな使い方は誰もしないのかな。

ピノキオ

| 19:59

好き。

2011-03-21

UNIXコマンド1

| 10:44

tee 標準入力をそのまま標準出力とファイルに出力

% make 2>&1 | tee make.log

findコマンドの結果に対して処理をする

% find . -name "hoge" -exec rm '{}' ';'
% find . -name "hoge" -print0 | xargs -0 rm

2011-03-19

Emacsのヘルプコマンド

| 02:28

今までEmacsのヘルプを使っていなかった。何か便利そう。ちゃんとしたEmacs使いの人なら常識なのかもしれない。

キー操作内容
C-h cキーバインドが実行するコマンド名
C-h kキーバインドが実行するコマンド名+詳細
C-h f関数の詳細
C-h v変数の詳細
C-h mバッファのモード
C-h bバッファのすべてのキーバインド
C-h wコマンドのキーバインド
C-h sバッファの構文テーブル
C-h l入力した最後のxxx文字
C-h eメッセージ表示