TAG: javascript
SyntaxHighlighter 2.0 -ソースコードを素敵に表示する
ブログなどでソースコードを公開する際、簡単に見栄えを良くすることができるSyntaxHighlighterをご紹介します。SyntaxHighlighterは見栄えだけではなく、印刷やクリップボード、ソース表示などの機能も付いています。
Yahoo! UI Library: Grids CSSでも利用されているので、ご存知の方も多いかもしれませんね。
dp.SyntaxHighlighterの特徴
- プログラム毎に任意の文字色で表示することができます。
- 表示するソースコードに行番号を付加することができます。
- 対応ブラウザであれば、[copy to clipboard]のリンクが表示されて、対象のコードをコピーできます。
- [view plain]をクリックすると、別画面でシンプルなコードを表示することができます。
- [print]をクリックすると、対象のコードを印刷することができます。
- JavaScriptオフの状態では、テキストエリアにコードが表示されます。
SyntaxHighlighterの導入
下記サイトからファイルをダウンロードして解凍します。
解凍したフォルダとファイルを任意の場所に設置します。今回はjsフォルダに設置します。
次に、必要なJavaScriptファイルを読み込みます。shCore.css、shThemeDefault.cssが必須で、そのほか整形したいプログラム毎に追加して読み込みます。たとえば、JavaScriptのコードを整形したい場合はshBrushJScript.js、スタイルシートを整形したい場合はshBrushCss.jsを読み込みます。
コードはPRE要素の中に記述し、class名にはbrush:の次にJavaScriptであれば下記の用に指定します。
<pre class="brush: javascript;">
function(VAL){
alert("test..");
}
</pre>
dp.SyntaxHighlighterのサポートしているプログラム言語は以下の通りです。
言語表記一覧
| 言語名 | 言語の別名 | ファイル名 |
|---|---|---|
| ActionScript3 | as3, actionscript3 | shBrushAS3.js |
| Bash/shell | bash, shell | shBrushBash.js |
| C# | c-sharp, csharp | shBrushCSharp.js |
| C++ | cpp, c | shBrushCpp.js |
| CSS | css | shBrushCss.js |
| Delphi | delphi, pas, pascal | shBrushDelphi.js |
| Diff | diff, patch | shBrushDiff.js |
| Groovy | groovy | shBrushGroovy.js |
| JavaScript | js, jscript, javascript | shBrushJScript.js |
| Java | java | shBrushJava.js |
| JavaFX | jfx, javafx | shBrushJavaFX.js |
| Perl | perl, pl | shBrushPerl.js |
| PHP | php | shBrushPhp.js |
| Plain Text | plain, text | shBrushPlain.js |
| PowerShell | ps, powershell | shBrushPowerShell.js |
| Python | py, python | shBrushPython.js |
| Ruby | rails, ror, ruby | shBrushRuby.js |
| Scala | scala | shBrushScala.js |
| SQL | sql | shBrushSql.js |
| Visual Basic | vb, vbnet | shBrushVb.js |
| XML | xml, xhtml, xslt, html, xhtml | shBrushXml.js |
SyntaxHighlighterのスタイル設定は行の高さや文字の大きさがタイトなので、下記のように変更しても良いでしょう。変更する際は、SyntaxHighlighterのCSSを直接変更せずに、他の外部CSSなどに記述しておきます。
/* syntaxhighlighter */
.syntaxhighlighter,
.syntaxhighlighter div,
.syntaxhighlighter code,
.syntaxhighlighter span
{
/* 行の高さを変更 */
line-height: 1.5em !important;
}
/* コードの表示領域、フォントサイズをサイトに合った大きさに変更 */
.syntaxhighlighter{
margin-left: auto !important;
margin-right: auto !important;
width: 93% !important;
font-size: 123.1% !important;
}
/* 改行画像の削除 */
.syntaxhighlighter .line .content .block{
background-image: url("") !important;
}
参考サイト
制御構文
プログラムの制御構造
通常、プログラムは記述したとおりに、上から順に実行されます。ですが、条件判断構造やループ構造を利用することによって、プログラムの流れを制御することができます。
プログラミングをするときには「ブロック」の概念が重要になります。ブロックは、変数やプロパティ、処理などの有効範囲を明確にします。もっとも一般的なブロックは、イベントハンドラです。ブロックは宣言部と実行部の2つで構成されますが、宣言部は省略可能です。
function disp1(){ //ブロックの始まり
//宣言部
var msg = "Hello!"
//実行部
document.write(msg);
} //ブロックの終わり
JavaScriptでは、{ } で囲まれた部分を命令といい、1つのブロックを構成します。ブロックを構成する処理が1文だけの場合は、{ } を記述する必要はありません。if文のように、true,elseと処理が分岐する場合は、ここのブロックを { } で明確に分ける必要があります。
ブロックを構成する処理が2文以上の場合は、必ず { } で囲まなければなりません。
条件分岐(if)
「もし~ならば、・・・を実行する」という条件つき命令は、プログラムの流れを制御するときによく利用されます。
JavaScript には条件つき命令が1つあります:
if..else
if~elseは、式を評価し、真ならif以降の命令を、偽りならelse以降の命令を実行します。なお、else以降は省略することができます。ifに続く命令が1文のときには、{ }を省略することができます。
構文
if ( 論理式 ) {
命令1
} else {
命令2
}
変数 VAL の値が A の時だけ出力するには次のようになります。
if ( VAL == 'A' ) {
document.write("Aです");
}
条件式は複数あってもかまいません。複数の条件を並べたいときは、論理演算子の && もしくは || を使います。
# VAL が A、 もしくはB のとき、命令文を実行
if ( VAL == 'A' || VAL == 'B' ){
....
}
# VAL1が A 、VAL2が B のとき、命令文を実行
if ( VAL1 == 'A' && VAL2 == 'B' ){
....
}
else 文で例外処理をする
if 文では、条件式が TRUE のときに命令文を実行しましたが、条件式が FALSE だった場合は、else 文で例外処理を行うことができます。
if ( meg == "○" ){
document.write("不正解です");
} else {
document.write("正解です");
}
if 文で複数の条件分岐を処理する
if 文は複数の条件分岐にも使えます。if の条件式が FALSE であった場合、さらにほかの条件式をためしたいときは、else if 文を使います。どの条件式も FALSE だった場合は、else 文を使って例外処理を行うことができます。else はどの条件式も FALSE だったときのみ実行されます。
if ( meg == "○" ){
document.write("不正解です");
} else if ( msg == '×' ) {
document.write("正解です");
} else {
document.write("正解:答えは??");
}
switch
switch 文は、式の値に一致するラベルをブロック内に探して制御を移します。
if~else if より直感的に使える構文です。
switch ( 式 ) { }
式の値と一致する case で指定した値を探します。一致したcase文があった場合、そのブロックを実行します。
どのcaseにも一致しなかった場合は、default 文のブロックを実行します。この default 文は省略してもかまいません。
次の例では、X の値が 1 なら ONE を、2 か 3 なら TOW or THREE を、それ以外なら OTHER を表示します。
switch ( X ) {
case 1:
alert("ONE");
break;
case 2:
case 3:
alert("TOW or THREE");
break;
default:
alert("OTHER");
break;
}
それぞれのcase文の最後の行にある break ラベルは、現在のブロックから脱出します。
ループ命令
ループが、命令のセットです。指定された条件が満たされるまで、それがくり返して実行します。
JavaScript はforとwhileの2つのループ構造をサポートします。
それに加えて、繰り返し文から脱出するbreak文が用意されています。
for
forループは指定された条件がfalse(偽)になるまで繰り返し処理を行います。
(式1) (式2) (式3)
for (初期化式; 条件文; 増加文) {
繰り返し処理
}
for文の記述方法です。通常は<式1>に初期化、<式2>に条件式、<式3>に次のループへ進む前の評価式を記述します。<式2>には論理式しかおくことができません。forに続く命令が1文のときには、{}を省略することができます。
for文の処理は次のような順番で行われます。
for 文の流れ
- (式1)の初期値の設定を行います。これは一度のみ行われます。
- 次に(式2)の条件判断を行い、true(真)の場合はループ内の命令を実行します。false(偽)の場合はループ外へ抜けます。
- ブロック内の命令を実行します。
- (式3)にあるループ変数の増減処理を行います。
- 2に戻ります。
簡単な例をあげます。
var n = 0
for (var i = 0; i <9; i++){ n +="i" } document.write(n);
上の式だと i は 8 までインクリメントされ、最終的に n は 36になります。
次はちょっと高度なサンプルです。ここで作成したhowMany関数は、スクロールするリストの中から選択されたオプションの数を数えます。
<script>
function howMany(selectObject) {
var numberSelected=0
for (i=0; i < selectObject.options.length; i++) {
if (selectObject.options[i].selected==true)
numberSelected++
}
return numberSelected
}
</script>
<form name="selectForm">
<p><B>音楽ジャンルをいくつか選択してください。
選択したら下のボタンをクリックしてみましょう。</B><br>
<br>
<select name="musicTypes" multiple>
<option selected> R&B
<option> Jazz
<option> Blues
<option> New Age
<option> Classical
<option> Opera
</select>
<p>
<input type="button" value="いくつ選択したでしょうか?"
onClick="alert ('選択した数: ' +
howMany(document.selectForm.musicTypes))">
</form>
while
whileは<式>がtrue(真)の間だけ、以降のブロックを繰り返し実行します。whileに続く命令が1文のときには、{}を省略することができます。
while( 式 ){
繰り返し処理
}
次のwhile文のサンプルはnが最大3になるまでループが繰り返されます。
n = 0
x = 0
while( n < 3 ) {
n ++
x += n
}
"+="は右の式に左の式を加算してから、左の式に代入します。
1回目の処理 n = 1, x = 1
2回目の処理 n = 2, x = 3
3回目の処理 n = 3, x = 6
ループの間条件が決してfalseにならない場合、命令が永遠に実行されます。
while (true) {
alert("Hello, world")
}
こうならないように気をつけましょう。
while do
do-while 構文は条件が真の間、do-until 構文は偽の間、ブロックを実行します。判定はブロックを実行した後になるので、ブロック内の命令文は少なくとも1回は実行されます。
構文
do ブロック while 条件
do ブロック until 条件
次の例文では、while の条件が TRUE の間、doブロック内の処理を続けます。
i = 0;
do {
i++;
document.write(i);
} while ( i < 10 );
break
breakはwhile~forループ内から脱出するために使用します。JavaScriptはループ内でbreakを見つけると、ループ内の実行文を中止し、ただちにループ外の最初の実行文へ移行します。breakはwhileまたはforループ中以外では使えません。
次のbreak文には、 i が3(i == 3)に等しいとき、いったんループを終わらせ、3 *
xを返すbreak文が処理されます。
function testBreak(x) {
var i = 0
while (i<6){
if (i="=" 3) break i++ }
return i*x
}
continue
continueは、whileまたはforループ内で使用されます。continueはそれ以降に続くブロック内の命令をスキップし、先頭ループへ戻ります。breakと同じようにwhileまたはforループ中以外では使えません。
次のサンプルをじっくりと見てみましょう。
conticue命令は、break命令とは対照的に強制的にループの先頭に処理を移す命令です。ただしwhileループとforループでは若干の違いがあります。その違いを以下に示します。
- whileループの場合条件判断の処理に戻ります。
- forループの場合、ループ値の増減処理に戻ります。
オブジェクト操作命令
for~in
オブジェクトのすべてのプロパティとメソッド(または配列のすべての要素)を参照したい場合に使います。変数にはオブジェクトの要素の名前が一つずつ代入されて、命令が実行されます。forに続く命令が1文の時には、{ }を省略することができます。
for (変数 in オブジェクト) { 命令 }
windowオブジェクトのすべての要素の名前と内容を表示します。
for (var i in window) document.write(i + ";" + window[i] + "<BR>");
出力結果は以下のようになります。
new演算子
new演算子はオブジェクトのインスタンスを作成します。
オブジェクト名 = new オブジェクト型 ( param1 [,param2] ...[,paramN] )
オブジェクト名は新しいオブジェクトのインスタンスです。
オブジェクト型はオブジェクトの型です。オブジェクトの型を定義する関数が不可欠です。
paramはオブジェクトのプロパティの値です。これらのプロパティは、 オブジェクト型関数のために定義されるパラメーターです。
function car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
次のような記述でmycarオブジェクトを作ることができます。
mycar = new car("Eagle", "Talon TSi", 1993);
この命令は mycar を作り、そのプロパティに指定された値を割り当てます。
newを上記のように呼び出せば、いくつでもcarオブジェクトを作ることができます。例えば、
car1 = new car("Eagle", "Talon TSi", 1993, rand);
car2 = new car("Nissan", "300ZX", 1992, ken);
というようにです。
この関数はpersonオブジェクトを作成しています。
function person(name, elected, attached) {
this.name = name
this.elected = elected
this.attached = attached
}
新しいpersonオブジェクトをインスタンス化します。personオブジェクトの name,elected,attached に名前と当選回数、所属名を代入していきます。
Suge = new person("菅直人", 5, "さきがけ")
Hatoyama = new person("鳩山由紀夫", 3, "無所属")
サンプル1で作成したcarオブジェクトを次のように変更します。
function car(make, model, year,owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
//carオブジェクトにownerを追加しました
}
carオブジェクトをインスタンス化します。ここにはちょっとした面白い仕掛けがあります。person関数で割り当てたプロパティ値を、car関数のownerプロパティに渡しています。このようにプロパティをプロパティに渡すときは、ダブルクォーテーション(")はいりません。逆にダブルクォーテーションで囲ってしまうと、文字列になるので注意しましょう。
car1 = new car("Eagle", "Talon TSi", 1993, Suge);
car2 = new car("Nissan", "300ZX", 1992, hatoyama);
全体のソースは次のようになります。
<script>
function person(name, elected, attached) {
this.name = name
this.elected = elected
this.attached = attached
}
Suge = new person("菅直人", 5, "さきがけ")
Hatoyama = new person("鳩山由紀夫", 3, "無所属")
function car(make, model, year, owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
//carオブジェクトにownerを追加しました
}
car1 = new car("Eagle", "Talon TSi", 1993, Suge);
car2 = new car("Nissan", "300ZX", 1992, Hatoyama);
document.write(car1.owner.name);
document.write("<br>");
document.write(car2.owner.name);
</script>
car1 のowner名は次のように呼び出します。
car2.owner.name
car1のオーナー名と当選回数と所属、車種を呼び出すには次のように記述します。
document.write("名前:"+car1.owner.name);
document.write(" 当選回数:" + car1.owner.elected);
document.write(" 所属:" + car1.owner.attached);
document.write(" 車種:" + car1.name);
結果は下記のようになります。
this
thisはクラス内でのみ用いることができる変数です。thisはメソッドの属するクラス、またはインスタンス自信を示します。
サンプル:thisはオブジェクトのプロパティ値を呼び出すことができます。
ここでは、テキストフォームで指定されている18と99の引数と、入力された値を受け取っています。
function validate(obj, lowval, hival){
if ((obj.value <lowval) || (obj.value> hival)){
alert("値を超えてるよ!");
} else {
alert(obj.value+"これがthisで呼び出した値です");
}
}
//if文でobj.valueが18と99の間の数字かどうかを調べています。
テキストフォームを作成します。引数 thisでテキストフォームのすべてのプロパティと、任意の値(18,99)をvaildate関数に渡しています。
<b>18から99の間の数字を入力してください:</b> <input type= "text" name= "age" size= 3 onchange="validate(this, 18, 99)">
- 18から99の間の数字を入力してください:
テキストフォームに数字を入力したらウインドウ内の適当なところをクリックしてみましょう。
---○←たとえばここをクリックしてみて
return
returnはメソッド中で用い、メソッドから戻るときに使います。値を返さないメソッドの場合、returnの式は不要です。
return 式
下記の関数は引数 x と y を乗算して返します。
unction pow(x,y){
return x * y;
}
with
オブジェクトのプロパティやメソッドを、頻繁に参照する部分で使用します。with命令は、オブジェクトの名前を記述しなくても、オブジェクトの要素にアクセスすることのできるブロックを作ります。
with(オブジェクト){
命令
}
次の式は、Mathオブジェクトのminとmaxを、オブジェクト名なしで参照しています。
<script>
var a = 5, b = 10;
with (Math) {
littler = min(a,b);
bugger = max(a,b);
document.write("a = " + a + ", b = " + b);
}
</script>
出力結果は、
というようになります。
コメント
コメントは実行されず、無視されます。JavaScriptはJavaと同じコメント形式を採用しています。
- //~行末まで:行末までがコメントになります。
- /*~*/:で終わる複数行。囲まれている部分全てがコメントになります。
- /**~*/:クラスの宣言の前で使用するコメント。クラスの解説を記述する。
以下の2つは両方ともコメント文です。
// コメント1です /* -----コメント2です コメント2の続きです-----*/
インベントハンドラ2
イベントハンドラの種類
イベントハンドラ名には、
- onblur
- onclick
- onchange
- onfocus
- onload
- onmoveover
- onselect
- onsubmit
- onunload
の9種類があります。
イベント・ハンドラの種類
| イベントハンドラ名 | イベントの発生するタイミング | イベントが発生する部品 |
|---|---|---|
| onblur | フォーカスがはずれたとき | テキストフィールド |
| onclick | クリックされたとき | ボタン、ラジオボタン、チェックボックス、サブミットボタン、リンク、リセットボタン |
| onchange | フィールドの内容が変更されたとき | テキストフィールド |
| onfocus | フォーカスされたとき | テキストフィールド |
| onload | ロードされたとき | <BODY>タグ |
| onmoveover | マウスカーソルが上を通り過ぎたとき | リンク |
| onselect | INPUTフィールドをセレクトしたとき | テキストフィールド、テキストエリア |
| onsubmit | フォームをsubmitしたとき | サブミットボタン |
| onunload | 別のページに移動するとき | <BODY>タグ |
オブジェクトに起こるイベント
| イベント名 | オブジェクト名 | ||||
|---|---|---|---|---|---|
| Botton | CheckBox | Link | RadioBotton | Reset | |
| onclick | ○ | ○ | ○ | ○ | ○ |
| onmouseover | ○ | ||||
| onfocus | |||||
| onblur | |||||
| onchange | |||||
| onselect | |||||
| onload | |||||
| onunload | |||||
| onsubmit | |||||
オブジェクトに起こるイベント
| イベント名 | オブジェクト名 | ||||
|---|---|---|---|---|---|
| Submit | Select | Text | TextArea | Window | |
| onclick | ○ | ||||
| onmouseover | |||||
| onfocus | ○ | ○ | ○ | ||
| onblur | ○ | ○ | ○ | ||
| onchange | ○ | ○ | ○ | ||
| onselect | ○ | ○ | |||
| onload | ○ | ||||
| onunload | ○ | ||||
| onsubmit | |||||
onclickイベント
onclickイベントは、オブジェクトがマウスでクリックされたときに生じます。ボタンフィールドを例に取ると次のように記入します。
<input type="botton" onclick="関数名">
オブジェクトのイベント(onclick)が発生すると、そこで指定された動作が呼び出されます。
<input type="button" value="ボタン" onclick="alert( 'BUTTON was CLICKED.' )">
チェックボックス
<input type="checkbox" onclick="alert( 'CHECKBOX was CLICKED.' )">チェックボックス
<a href="Link to" onclick="alert( 'LINK was CLICKED and jump now.')">リンク</a>
ラジオボタン
<input type="radio" onclick="alert( 'RADIOBUTTON was CLICKED.' )">ラジオボタン
<input type="reset" value="リセット" onclick="alert( 'RESET was CLICKED.' )">
<input type="submit" value="送信" onclick="alert( 'SUBMIT was CLICKED.' )">
onmouseoverイベント
onmouseoverイベントは、ハイパーテキストリンクにだけ生じるイベントで、リンクの上にマウスが行ったときに起こります。次のようにリンクを記述することでこのイベントに対応した動作を実行できます。
Text
onfocusイベント
onfocusイベントは、そのオブジェクトがユーザの入力を受け付け可能(フォーカス)になったときに起こります。
フォーカスがどうとかいうのは、例えばtextareaにマウスカーソルを合わせてクリックするとカーソルが出現しますが、これがフォーカスされた状態です。マウスカーソルを他に移動してクリックすればカーソルは消えてしまいます。これがフォーカスを失った状態です。TABキーを押してもフォーカスは移動します。フレームの場合なら、フォーカスされたフレームが黒枠に囲まれます。
onfocusイベントがあるのは、ユーザの入力や選択領域のあるテキストフィールドとセレクトだけです。ボタンなどのオブジェクトでは、「マウスが押された」こと自体が入力であり、その後にそこへ何かを入力したり、選択してもonfocusイベントはありません。
onfocusは次のようにして使います。
onblurイベント
onblurイベントは、そのオブジェクトでのユーザの入力が終了したときに起こります。別のオブジェクトがマウスでクリックされたりして、入力対象だった(フォーカスのあった)オブジェクトから別のオブジェクトへフォーカスが移るときに生じるものです。
onfocusイベントがあるのは、ユーザの入力や選択領域のあるテキストフィールドとセレクトだけです。ボタンなどのオブジェクトでは、「マウスが押される」という瞬間的なイベントしかないため、onfocusと同様にonblurイベントはありません。
次のようにして使います。
onchangeイベント
onchangeイベントは、そのオブジェクトでのユーザが何かを入力/削除してから(フォーカスを外した)ときに起こります。
また、初期値を設定していないテキストフィールドに初めてフォーカスし、何もしないでフォーカスを外したときにもonchangeが生じます。
onchangeイベントがあるのは、ユーザの入力や選択領域のあるテキストフィールドとセレクトだけです。ボタンなどのオブジェクトでは、「マウスが押される」という瞬間的なイベントしかなく、そのこと自体が「状態を変化させた」ことであるため、onchangeイベントはありません。
onchangeイベントは次のようにして使います。
onselectイベント
onselectイベントは、そのテキストフィールドオブジェクトでユーザが文字列を選択したときに起こります。
onselectイベントは次のようにして使います。
<input type="text" name="Text" value="Select Me" size=10 onselect="alert( 'Selected.')">
<textarea rows=3 cols=10 onselect="alert( 'Selected.' )">Select Me</textarea>
onloadイベント
onloadイベントはあるHTMLが表示されるときに生じます。
次のようにして使います。
<body onload="alert( 'Welcome!! This is the first event for you.' )">
onunloadイベント
onunloadイベントはあるHTMLの表示を終了して別のページへ移るときに生じます。
次のようにして使います。
<body onunload="alert( 'Good bye. Please come here again!!' )">
onsubmitイベント
onsubmitイベントはこれまでに紹介してきたイベントと異なり、独立した一つ一つのオブジェクトに対して生じるものではありません。onsubmitイベントは「サブミットボタンが押されて、あるフォーム全体がサブミットされるとき」に生じるものです。
フォームの内容を送信するという機能上、イベント(送信)が起きるまえにスクリプトが呼び出されます。つまり、onsubmitイベントは「送信してから***をする」ではなく、「***の条件を満たしてないので送信しない」とか、「***の条件を満たしているから送信する」という条件判定に使用します。
Example:
<script language="JavaScript">
function CheckMailAddress(FORM) {
if ( FORM.address.value == "" ) {
alert( "メールアドレスを記入してね" );
return false;
}
else {
return true;
}
}
</script>
<form name="myForm" onsubmit="CheckMailAddress(this)">
<p>メールアドレス:<input type="text" size="25" name="address">
<input type="submit"> </p>
</form>
onsubmitに代入される値がTRUEのときはサブミットされ、FALSEのときはサブミットされません。この例ではメールアドレスを記入するテキストフィールドに文字列がない場合(value="")は関数 CheckMailAddressがFALSEを返すのでサブミットしません。テキストフィールドに何かしら記入があれば関数CheckMailAddressがTRUEを返すのでサブミットします。
テキストフィールドなどの内部の値を取り出す方法は・・・(また今度!)。
インベントハンドラ1
イベントハンドラ概要
ネットスケープ・ナビゲーターやインターネット・エクスプローラーなどのブラウザには、JavaScriptが識別することのできるイベントが用意されています。イベントは、日本語に訳すと"出来事"ですよね。たとえば、ボタンをクリックする、テキストを入力する、というのがイベントです。
JavaScriptはそれらのイベントをとらえて、それに反応するスクリプトを定義できます。その、イベントを定義するのがイベントハンドラです。
イベントハンドラには以下の9種類があります。
- onBlur
- onClick
- onChange
- onFocus
- onLoad
- onMouseOver
- onSelect
- onSubmit
- onUnload
HTMLに表示するボタンは次のようにフォームの<input>タグのtypeオプションにbuttonと指定すれば作成できます。
formタグについては、「初心者もOKのHTML入門」を参照してください。
<form> <input type="button" value="ボタン" onclick="Button()"> </form>
onclickはボタンがクリックされたときにButton()関数を呼び出すイベント・ハンドラです。
onClick の後に JavaScript 命令文も入れることができます。ユーザーがボタンをクリックするとき、これらの命令文は実行されます。 このButton()関数を次のように定義しておけば、その関数が実行されます。
<script>
function clickButton(){
alert("ボタンが押されました!")
}
</script>
HTMLファイル全体では次のようになります。
<html>
<head>
<script>
function Button(){
alert("ボタンが押されました!");
}
</script>
</head>
<body>
<form>
<input type="button" //ボタンの指定
value="ShowAlert" //ボタン上に文字の表示
onclick="clickButton()">
</form>
</body>
</html>
注)Button関数は<HEAD>部に記述しています。
結果は次のようになります。
"ShowAlert"ボタンを押してみてください。<HEAD>部で記述したButton()関数が呼び出され、メッセージ・ボックスが表示されます。
alert: 警告関数
下のスクリプトは、ボタンが押されたときにcompute()関数を呼び出します。
<input type="button" value="Calculate" onclick="compute(this.form)">
ここで注意して欲しいのは、compute関数のパラメーターthis.formです。日本語に直訳すると"このフォーム"、つまりフォーム内にあるすべてのオブジェクト(ここではボタン)を意味します。ここで指定されたパラメーターは関数(ここではcompute関数)が受け取ることになります。
あとは、受け渡されたオブジェクトから様々なプロパティを利用することができます。
それでは、イベントハンドラを使用したサンプルを作成してみましょう。ここで、先ほどでてきた this.form に注意してください。フォーム内のオブジェクト(ここではボタンとテキストフィールド×2)の情報がcompute関数に引き渡されています。
<head>
<script>
function compute(form) {
if (confirm("Are you sure?"))
form.result.value = eval(form.expr.value)
else
alert("Please come back again.")
}
</script>
</head>
<body>
<form>
Enter an expression:
<input type="text" name="expr" size=15 >
<input type="button" value="Calculate"
onclick="compute(this.form)">
<br>
Result:
<input type="text" name="result" size=15 >
<br>
</form>
</body>
Example 2:出力結果
演算子
1.演算子の概要
演算子は、算術演算子に代表されるように、変数やリテラルなどの値に対して演算を行うための記号です。 演算子の中でも有名なのが、加算演算子や減算演算子などの算術演算子です。
JavaScriptの組み込み演算子は、『オペランド』の個数によって単数演算子、二項演算子、三項演算子に分類することができます。また、間値演算子か前置演算子か、数値、文字列、ファイルなど捜査対象によっても分類できます。ただし、これらの分類はプログラミングする上であまり重要ではなく、一つ一つの演算子を理解することが必要となります。
用語
- オペランド
- 演算の対象となる値。演算内容をあらわす記号は演算子と呼びます。例えば 10+X という式では、10 と X がオペランドで、+ がオペレータです。
演算子の優先順位
演算子には結合性と優先順位があります。次の表は優先順位が高い順になっています。
演算子の一覧
| 演算子 | 結合性 |
|---|---|
| 配列 括弧 | 左 |
| インクリメント(++) デクリメント( -- ) 反転( ~ ) NOT( ! ) |
しない |
| 乗算( * ) 除算( / ) 剰余( % ) |
左 |
| 加算( + ) 減算( - ) 文字列結合( + ) |
左 |
| 左ビットシフト( << ) 右ビットシフト( >> ) 符号なし右ビットシフト( >>> ) |
左 |
| 小さい( < ) 大きい( > ) 小さいか等しい( <= ) 大きいか等しい。( >= ) |
しない |
| 等しい( == ) 等しくない( != ) 等しい( === ) 等しくない( !== ) |
しない |
| ビットごとのAND( & ) ビットごとのXOR( ^ ) ビットごとのOR( | ) |
左 |
| 論理AND( && ) | 左 |
| 論理OR( || ) | 左 |
| 3項の条件演算子( ?: ) | 右 |
| 代入演算子( = += -= *= など ) | 右 |
| カンマ( , ) | 左 |
結合性
結合性とは、左右どちらかに配置された変数や定数を演算の対象にするかということです。たとえば、&& や || などの論理演算子は左側にある値を対象とします。代入演算子などは右側にある値を対象とします。たとえば、次の式は、加算演算子が左側にある値に対して、右側の値を加算し、代入演算子が右側にある値を左側にある変数に代入しています。
# 10 に x を加算する val = 10 + x;
演算子と優先順位
優先順位は利便性を考慮して付けられているので、あまり気にしなくても正常に扱えます。もし不安な時は、カッコをつかって順番をはっきりさせましょう。
x = (10 + 10) * 2;
演算子の中で、項が最も高い優先順位を持っています。項には、変数、クォート、クォート風の演算子、カッコで囲んだ式、引数をカッコで囲んだ関数が含まれます。
単項演算子は、引数として1個の値を受け取るものです。演算子を挟んで右と左に値が必要な二項演算子、右側、もしくは左側だけが必要な単項演算子です。
2.算術演算子
算術演算子は、数値に対して数学関数を実行します。
算術演算子の使用方法
算術演算子の一覧
| 演算子 | 説明 | 例題 |
|---|---|---|
| + | 加算 | $x = 10+2 # $x の値は 12 |
| - | 減算 | $x = 10-2 # $x の値は 8 |
| * | 乗算(×) | $x = 10*2 # $x の値は 20 |
| / | 除算(÷) | $x = 10/2 # $x の値は 5 |
| % | 剰余 | $x = 10%2 # $x の値は 0 |
| ** | 累乗 | $x = 10** # $x の値は 100 |
| ++ | インクリメント | $x = 10++ # $x の値は 11 |
| -- | デクリメント | $x = 10-- # $x の値は 9 |
プログラム言語のほとんどは、算術式を左から順に記述します。2分の1 という式をプログラミング言語のルールに従うと、1/2 となります。
カッコの使い方は代数学の場合と同じです。たとえば、 b+c に a を掛けるには次のようにします。
(b + c) * a
演算子の順番では、乗算、除算、剰余演算子の次に加算、減算が計算されます。同一の優先順位にある演算子が複数並ぶときは、左から順に計算されます。ただし、カッコ内にある演算子は、最初に計算されます。計算式が複雑になるときはカッコを使って見やすくしましょう。
単項のマイナス( - )
単項演算子のマイナス( - )は対象の値が数値であれば、算術否定を行ないます。
x = -10; val = -x; // xの値が数値なので、算術否定が行われ、valの値は 10
足し算/引き算/掛け算/割り算
足し算、引き算、掛け算、割り算は違和感なく使うことができると思います。
x = 10 + 2; # x の値は 12x = 10 - 2; # x の値は 8 x = 10 * 2; # x の値は 20 x = 10 / 2; # x の値は 5
※ 割る数が 0 だとオーバーフローが発生します。割る数が変数ならチェックしてから割り算を実行してください。
剰余
剰余は割ったあまりを返します。
x = 10 % 4; // 割り切れなかった2が返され、x の値は 2 x = 10 % 2; // 2 * 5で割り切れるから x の値は 00
インクリメント/デクリメント
++ 演算子と -- 演算子は、引数に1を加える、もしくは1を引きます。
x = 5; y = 5; x++; // x は加算されて6 y--; // y は減算されて4
これらの演算子は、引数の前にある場合は値を返す前に値を増減し、引数の後ろにある場合は値を返してから増減します。引数の前に置く場合はプリインクリメント/プリデクリメント、引数の後に置く場合はポストインクリメント/ポストデクリメントといいます。
x = 5; y = 5 z = x++; // z に x の値を代入してから、x の値を増加(z の値は 5)) z = ++y; // yを増加させてからその値を代入(z の値は 6))
3.比較演算子
予測できない複数の値を比較したいときは、『比較演算子』を使います。比較演算子は数値用と文字列用の2種類が用意されています。
比較演算子の使用方法
比較演算子は左引数と右引数を比較し、その結果を論理値で返します。
数値比較演算子と文字列比較演算子の早見表
| 比較 | 数値 | 戻り値 |
|---|---|---|
| 等しい | == | 左引数と右引数が等しければ真を返す。 |
| 等しくない | != | 左引数と右引数が等しくなければ真を返す。 |
| 等しい | === | == 演算子と同様に比較を行いますが、比較対象が同じデータ型でないと評価しません。 |
| 等しくない | !== | != 演算子と同様に比較を行いますが、比較対象が同じデータ型でないと評価しません。 |
| 小さい | < | 左引数が右引数より小さければ真を返す。 |
| 大きい | > | 左引数が右引数より大きければ真を返す。 |
| 以下 | <= | 左引数が右引数と同じか小さければ真を返す。 |
| 以上 | >= | 左引数が右引数と同じか大きければ真を返す。 |
| 比較 | <=> | 等しければ0、大きければ1、右引数が大きければ-1を返す。 |
数値用の演算子でも、文字列を比較することができます。
1 == '1'; # 等しい 'alpha' == 'beta' # 等しくない
数値や文字も真偽値が必要なところでは真偽を解釈されます。
# 0 は偽りなのでブロックを実行しない
if (0) { ... }
# 1 は真なのでブロックを実行
if (1) { ... }
# 空の文字列は偽なのでブロックを実行しない
if ("") { ... }
# 通常の文字列なら真なのでブロックを実行する
if ("a") { ... }
4.論理演算子
&& や || は『論理演算子』と呼ばれています。「AとBがTRUEならば・・・」、「A、もしくはBのどちらかがTRUEならば・・・」など、式の真偽値を左から順に解釈していきます。
論理演算子の使用方法
論理演算子の一覧1
| 名前 | 例 | 結果 |
|---|---|---|
| 論理積 | a && b | $a と $b が真ならTRUEを返す |
| 論理和 | a || b | $a もしくは $b が真ならTRUEを返す |
| 否定 | ! a | $aが真でなければTRUEを返す |
用語
- 論理積
- && は、左側の演算子が真であれば、右側の演算子も評価します。左側の演算子が偽であれば、右側の演算子を評価せずに結果を返します。
- 論理和
- || は、左側の演算子が真であれば、右側の演算子を評価せずに結果を返します。左側の演算子が偽りであれば、右側の演算子も評価します。
条件演算子
?: は、『条件演算子』です。? の前の引数が TRUE であれば、: の前の引数が返されますが、FALSE であれば、: の後の引数が返されます。
x = a > b ? a : 0;
上記の例は、a が b より大きい値であれば a の値を返し、それ以外は 0 を返します。
5.文字列演算子
文字列演算子は、値を文字列リテラルと解釈して演算処理を行います。
文字列を連結する演算子
+ 演算子は文字列の連結を行います。
x = "filename"; x = x + ".txt"; // x の値は "filename.txt"
6.ビット演算子
ビット演算子は、ビットを対象として処理する演算子です。
論理積
& は、両被演算子のビットごとに論理積をとって、その結果を返します。
X = x1 & x2;
論理和
| は、両被演算子のビットごとに論理和をとって、その結果を返します。
X = x1 | x2;
排他的論理和
^ は、両被演算子のビットごとに排他論理和をとって、その結果を返します。
X = x1 ^ x2;
~ 演算子
式で指定された値の各ビットを反転させます。元の式でビットが 1 の場合、必ず 0 になります。元の式でビットが 0 の場合、必ず 1 になります。
X = ~ x1
~ 演算子は、式の値を 2 進数形式で取り込み、その各ビットを反転させます。例えば変数x1の値が0101であれば、変数Xは1010になります。
シフト演算子
<<
演算子は、左引数の値を右引数で示すビット数だけ、左にシフトした値を返します。引数は整数でなければなりません。
>>
演算子は、左引数の値を右引数で示すビット数だけ、右にシフトした値を返します。引数は整数でなければなりません。
X = x1 >> x2;
X = x1 << x2;
>>>演算子
値の各ビットを指定されたビット数分だけ右へシフトします。ただし、符号は保持されません。
X = x1 >>> x2
>>> 演算子は、x1 の各ビットを x2 で指定されたビット数分だけ右へシフトします。上位ビットは、0 で埋められます。シフトされて最下位ビットより右へ移動した桁は破棄されます。
X = -14 >>> 2
変数 X の値は、-14 (2 進数で 11111111 11111111 11111111 11110010) から 2 ビット分だけ右シフトされて
1073741820 (2 進数で 00111111 11111111 11111111 11111100) になります。
7.代入演算子
= は代入演算子で、算術演算子、論理演算子、文字列演算子、繰り返し演算子、ビット演算子などと組み合わせて使うことができます。
代入演算子の使用方法
最もよく使われる代入演算子は、次のような単純代入です。
// x に 10 を代入 x = 10; // x に x の値掛ける2の値を代入 x = x * 2;
上記の最後の行のように、左辺値の値を元にした計算は1つの行で済ませることができます。たとえば、以下の2つの式は同じ意味になります。
// x に 2 を加算 x = x + 2; // 上記の式と同様に、x に 2 を加算 x += 2;
代入演算子の一覧
| 演算子 | 説明 |
|---|---|
| += | 加算して代入
x = 10; |
| *= | 乗算して代入
x = 10; |
| -= | 減算して代入
x = 10; |
| /= | 除算して代入
x = 10; |
| %= | 剰余して代入x = 10; |
型と定数
変数のデータタイプ
『変数』のページでもふれましたが、JavaScriptの変数は型を指定する必要がありませんが、値には型があります。
| 型 | 内容 | 例 |
|---|---|---|
| 数値 | 整数 浮動小数 |
123,-123,3,14 314e-2,0.314E1 |
| 論理値 | 真と偽のどちらか | true,false |
| 文字列 | ダブルクォート(")またはシングルクォート(')で囲まれた値 | "Hello, JavaScript!" |
| null | 何も入っていないことを表す特殊な値 | null |
整数(Intergers)
整数は最大64ビットの整数値です。整数定数を表現する場合には、8進数、10進数、16進数を使うことができます。
| 基数 | 内容 | 例 |
|---|---|---|
| 8進数 | 0から始まる数値(0~7を含む) | 37,140,200,000 |
| 10進数 | 1~9から始まる数値(0~9を含む) | 199,665,536 |
| 16進数 | 0xまたは0xから始まり、0~9とa~fまたはA~Fを含む | 0x7cc,0x10000 |
8進数の整数であることを示すには、先頭に "0" を付けます。各桁には、0 ~ 7の数字を使用します。先頭が "0" が付いても、各桁に "8" や "9" を使用している数値があれば、それは10進数として処理されます。また、8進数の表記で各桁に "e" (または "E") を数値として使用すると、エラーが発生します。
16 進数 ("Hex") の整数であることを示すには、先頭に "0x" ("x" は大文字でも小文字でもかまいません) を付けます。各桁には、0 ~ 9 の数字および A ~ F の英字(大文字でも小文字でもかまいません) を使用します。16 進数の表記では、"e" を数値として使用できますが、"e" を使用していても指数の指定にはならないので注意してください。A ~ F の英字は、1 桁分の数値を表すのに使用され、10 進数での 10 ~ 15 に相当します。たとえば、0xF は 15、0x10 は 16 に相当します。
8 進数および 16 進数には負の値もありますが、浮動小数点数はありません。単一の "0" で始まり小数点を持つ数値は、10 進数の浮動小数点数として処理されます。"0x" または "00" で始まり小数点を持つ数値では、小数点以下の桁は無視されます。
// 4 つの浮動小数点数は、すべて同じ値です。 .0001, 0.0001, 1e-4, 1.0e-4 // 浮動小数点数。345 に相当します。 3.45e2 // 整数です。 42 // 8 進数。255 に相当します。 0377 // 8 進数は小数部を持つことができないため、この数値は 0 になります。 00.0001 // 整数。378 になります。 0378 // 16 進数の整数。255 に相当します。 0Xff // 16 進数の整数。14287 に相当します 0x37CF // 16 進数の整数。999 に相当します。 0x3e7 // 16 進数は小数部を持つことができないため、この数値は 3 になります。 0x3.45e2
浮動少数(Floating Point Literals)
浮動小数は、小数点をピリオド(.)で表した10進数で表現されます。
論理値定数(Boolean Literals)
論理値は、真(true)か偽(false)のどちらかの値を持つ型です。論理演算の結果も、論理値になります。
比較処理では、比較式の 0 は 偽 (false) と見なされ、0 以外の数値を結果として持つステートメントは、真 (true) と見なされます。 したがって、次に示す式は、真 (true) です。
alse == 0
文字列(String Literals)
文字列は、ダブルクォート(")またはシングルクォート(')で囲まれた値です。シングル クォーテーション (') を使用すると、ダブル クォーテーション (") を含む文字列を指定することができます。
"This is JavaScript" //数字をダブルクォートで囲んでも文字列になります。 "1234" //文字列中にダブルクォーテーションがある場合 'This is "JavaScript"'
文字列中で特殊な値を表現するために,エスケープ文字での表現が用意されています。
また,特殊文字(ダブルクォートやシングルクォート)を文字列中で使用するため,バックスラッシュによって特殊文字をエスケープすることができます。たとえば,"\\"と記述すれば"\"を表します。
| エスケープ文字 | 名称 |
|---|---|
| \t | 水平タブ |
| \n | ラインフィード |
| \f | フォームフィード |
| \r | キャリッジリターン |
| \b | バックスペース |
| \" | ダブルクォート |
| \' | シングルクォート |
| \\ | バックスラッシュ,または円マーク(注1) |
注1)バックスラッシュは,多くの日本語のフォントでは円マーク(\)が割り当てられています。
注2)このエスケープ文字は,文字定数中や文字列定数中以外でも用いることができます。
「This is "JavaScript".」を代入させるには以下のようにバックスラッシュでダブルクォーテーションをエスケープします。
var text = "This is \"JavaScript\"."
ただし、シングルクォーテーションで文字列を囲った場合はエスケープする必要ありません。
var text = 'This is "JavaScript".'
変数
変数の基礎知識
変数は、プログラム中で値を保存しておくために使用します。ここでいう値とは、例えばウインドウ内に表示する文字列や、計算に使われる数字のことです。
たいていの言語では、値には文字列や数字などの型があり、使用する前に型を明示的に宣言する必要がありました。JavaScriptでは変数を使うときに型を指定することはありません。簡単にいうと、JavaScriptの変数に型はありません。ですが、値には型があります。
JavaScriptでは代入された値によって、自動的に型が変換されるのです。
変数の宣言
変数の宣言は必ずしも必要ではありません。ただし、使用する前に変数を宣言しておくのがよいプログラミング作法とされています。変数の宣言にはvarステートメントを使用します。
JavaScriptにおける変数は、以下のように宣言を行います。
var answer; //変数answerを定義。型は決まっていません
JavaScriptでは宣言時に変数に値を代入しておくことができます。
//文字型に変換 var a="Doremi"; //数値型に変換 var b = 3.1415; //論理型に変換 var c = false; //nullになります var d = null;
また、演算子カンマ (,) を利用して、複数の変数を同時に宣言することも可能です。例えば、以下のように宣言を行うこともできます。
var a , b;
変数へ値の代入
変数への値の代入には、代入演算子 ( = ) を使います。
変数に値を代入
x = 5;
変数 x に 5 を代入しています。この状態の x は数値の 5 とまったく同じに扱うことができ、後から利用することができます。ここでは変数 x に数値が格納されていますが、その他に文字列や様々なタイプの値を格納することができます。
式
式は、値または変数、関数と演算子の組み合わせによって表現されます。JavaScriptでは、あらゆる表現は値を持ちます。たとえば、
a = 12;
という表現は、aに12という値を代入するという演算だけではなく、12という値をも表現しています。
次の式では、100 に x を足して y に代入しています。
y = 100 + x;
x には 5 が代入されているので、 y には 100 + 5 の結果の値 105 が代入されます。
次のような表現も可能です。
a = ((b = 12) == 12);
この表現では12が代入され、次に12 ==12という論理式が評価されます。結果はtrueが代入され、この表現全体の値はtrueとなります。
型の自動変換
先に述べたように、JavaScriptでは代入された値によって、自動的に型が変換されます。次のように処理が続いていたら、変数answerはコメントに書かれているように変化します。
//変数answerを定義。型は決まっていません。 var answer; //文字列を代入しているので、answerは文字列になります。 answer = "Doremi"; //数値を代入すると、answerは文字列から数値に変化します。 answer = 1;
//数値と文字の演算の結果は、文字列になります answer = answer + "ABCD";
このように変数の扱いが曖昧で、その時々によって変化する言語のことをダイナミック言語といいます。
変数の表記
変数名は英字とアンダースコア( _ )を自由に組み合わせることができます。変数名に数字も使うことができますが、変数名の先頭に数字を使うことは出来ません。
変数名のルール
name_01; # OK _name_01; # OK 0234; # NG。数字で始まる変数名は許されていません
また、大文字と小文字は区別されます。a と A は違う変数として扱われます。
変数名の大文字と小文字
a = 1; # a に 1 を代入 A = 2; # A に 2 を代入。a の値に影響はない
変数の有効範囲
変数には『グローバル変数』と『ローカル変数』があります。どこからでも参照することが可能な変数をグローバル変数、有効な範囲を決められている変数をローカル変数と呼びます。JavaScriptでは、関数内で var を付けて変数宣言すると、その変数はローカル変数となり、var を付けない場合はすべてグローバル変数になります。
ローカル変数とグローバル変数の違い
var a = 5;
var b = 5;
function func () {
var a = 10;
b = 10;
}
alert("a:" + a + " - b:" + b);
func();
alert("a:" + a + " - b:" + b);
スクリプトの実行結果は以下のようになります。
a:5 - b:5
a:5 - b:10
func 内で宣言された変数 a は var を使ってローカル変数ということを明確にしているので、func 外で宣言されているグローバル変数 a とは別の変数として扱われます。
予約語
JavaScriptでは、次の53種類の識別子が予約語として指定されています。予約語は、変数名、関数名、メソッド名、プロパティ名、オブジェクト名などには使用できません。これらの言葉のいくつかは、JavaScript で実際に使われているか、将来使用のためにキープされています。
| abstract boolean break byte case catch char class const continue default do double else |
extends false final finally float for function goto if implements import in instanceof |
int interface long native new null package private protected public return short static |
super switch synchronized this throw throws transient true try var void while with |
オブジェクト
関数と変数
用意された定義済みのオブジェクトは、プロパティ(属性)と呼ばれる関数(メソッド)と変数(メンバ変数)を持っていて、プログラムの中で使用することができます。
例えば次のようにして document オブジェクトを使用すると、
<script>
document.write("Hello,JavaScript !")
</script>
次のように表示されます。
Hello,JavaScript !
オブジェクトの階層
オブジェクトの階層図
※現在のJavascriptは上記よりもオブジェクト数が増えています。
JavaScriptの動作環境には、組み込みオブジェクトがあらかじめ用意されています。オブジェクトは上記のように階層関係があり、下の階層のオブジェクトは上の階層のオブジェクトのプロパティになっています。
これらのオブジェクトの特定のプロパティを参照するには、その祖先をから名前を指定しなければなりません。
例えば、link オブジェクトを使用する場合、
document.write("URL:",document.links[0].pathname)
上記のように link オブジェクトの上の階層にある document オブジェクトから記述します。
捕捉)本来は document の上の階層にある windowオブジェクトから記述するのですが、windowオブジェクトは特別に省略が許されています。
documentオブジェクト
上記で例にあげたdocumentですが、なかなか面白い特徴があります。たとえばdocumentオブジェクトを使用した次のようなプログラムの場合、
<script>
document.write("<B>Hello,JavaScript!</B>")
</script>
下のように表示されます。
Hello,JavaScript !
documentオブジェクトはHTML文書のBODY要素に対応しているので、その結果は特に指定することなくBODY内に表示されます。ここで注目したいのは、JavaScript内でそのままHTMLタグの<B>を使用している点です。このようなことからもJavaScriptとHTMLの密接な関係を感じ取ることができます。
この他にも、JavaScriptにはHTMLの部品にアクセスするためのオブジェクトが用意されていています。formオブジェクトの下にあるbuttonやcheckboxなどはその名前の通りボタンやチェックボックスにアクセスすることができます。
オブジェクトの中には、HTML文書に対応していないオブジェクトも幾つかあって、navigatorやwindowオブジェクトは、ブラウザそのものに直接結びついていますし、Mathやstringなどは、プログラミング言語としての基本的な関数です。
HTMLに埋め込む
ブラウザはHTMLファイルを読み込んで、その命令通りにレイアウトを定義していきます。定義する順番は上から順番に行われていくので、一度定義されてしまえばいつでもそれを参照することができます。
例えば次のようなフォームですが、
<FORM NAME="statform">
<input type = "text" name = "username" size = 20>
<FORM NAME="statform">
上記の FORM の名前や text フィールドの名前を呼び出したり、VALUE の値を変更することができます。ただし、既に定義されて実行されたプロパティ値を変更することができません。
<TITLE>My JavaScript Page</TITLE>
TITLEタグで指定したタイトル名が、すでにブラウザのタイトルバーに表示された後では、あとでこれを変更することができません。
document.title = "The New Improved JavaScript Page"
上記のようなスクリプトはタイトルバーに表示されたタイトル名を変更できないばかりか、エラーを引き起こします。
JavaScriptの呼び出し
JavaScriptは通常<SCRIPT>タグに囲まれたブロックに記述しますが、実は、そればかりでなく、各オブジェクトで発生するイベントをフックするための拡張がHTMLタグに含まれます。典型的な例を挙げると、以下のようなフォームのボタンに対応したものがあります。
<FORM NAME="myform">
<INPUT TYPE="button" NAME="button1" VALUE="ボタン"
onClick="formName(this.form)">
...
</FORM>
ボタンをクリックすると、onClickという属性が formName 関数を呼び出します。formName 関数の引数は(this.form)フォーム全体の情報を渡すので、formName 関数は自由にフォームにアクセスすることができます。
例えば NAME 属性で button1 と名付けたボタンにアクセスしたいときは
document.myform.button1
というように指定します。また、ボタン上に表示された文字にアクセスしたい場合は
document.myform.button1.value
というように指定します。
オブジェクトの名前を直接指定する以外に、配列を使用してアクセスする方法があります。フォームの一番最初にあるオブジェクトが form[0]、二番目に位置するのが form[1]として配列に格納されます。ですから、上記の例だとform[0]がボタンになります。ボタンの下にチェックボックスを置くとしたら、チェックボックスは form[1] になります。
JavaScriptの基礎からはじめよう
JavaScriptはウェブブラウザに搭載されたスクリプト言語で、HTMLでページを作成できる人なら誰でも簡単に使えるほど簡単です。
<SCRIPT>タグ
JavaScriptは<SCRIPT>要素を使って、HTMLファイルに直接記述できます。
JavaScriptを宣言する方法
<script>
//ここにJavaScriptプログラムを記述する
</script>
<script>タグをどこにでも記述できますが、通常は次の2つの場所になります。
- <head>~</head>の間:命令文、関数を使用するとき
- <body>~</body>の間:イベントハンドラーを使用するとき
HTMLファイルは上から下へ向かって読み込まれるので、書いた場所が上であるほど先に実行されることになります。最初に実行させたいスクリプト、または関数などは<HEAD>ブロックに記述しましょう。
<html>
<head><title></title></head>
<body>
<script>
//ここにJavaScriptプログラムを記述する
document.write("Welcom to Smart!!")
</script>
</body>
</html>
上のサンプルですが、<SCRIPT>要素に document.write(...) という命令文があります。documentは日本語で「文書」という意味ですが、ここでの document は括弧の中にある文字列を「文書」というオブジェクトとして扱うということです。write は「書く」という命令。ですから、 document.write(...) を直訳すると「文書として指定された文字列を書け」ということになります。
ちなみに、ここでは文字列を扱いましたが、括弧内は文字列でも変数または関数でもかまいません。文字列を扱うときはダブルクォーテーション(")で囲こむことをお忘れなく。
実行結果は下記のとおりです。
Welcom to Smart!!
TYPE属性
HTML4.01 では後述のLANGUAGE属性が却下され、代わりにTYPE属性が必須属性として定義されました。HTML4.01に準拠する場合は、LANGUAGE属性の代わりにTYPE属性を指定するようにしましょう。値には "text/javascript" を指定します。
<script type="text/javascript">
<!--
document.write("Welcom to Smart!!");
// -->
</script>
HTML5.0ではTYPE属性の初期値がtext/javascriptですので、JavaScriptの場合は属性の指定は不要になりました。
<script>
<!--
document.write("Welcom to Smart!!");
// -->
</script>
CHARSET属性
charset属性は、外部スクリプトファイルのエンコードを指定する際に使用します。
<script src="***" charset="UTF-8"></script>
JavaScriptに対応していないブラウザ
JavaScriptに対応していないブラウザでJavaScriptを読み込むと、<SCRIPT>タグブロックの中身が画面に表示されてしまいます。
この問題を回避するために、<SCRIPT>タグをコメント中に記述しておくことが出来ます。ただし、コメントの終了タグ(-->)はSyntaxErrorになってしまうので
、この部分はJavaScriptのコメント(//)にします。
<script>
<!---コメントの始まり
document.write("Hello,JavaScript!!")
//--->コメントの終わり
</script>
また、JavaScriptに対応していないブラウザのユーザーにJavaScriptを使っていることを知らせたいときには、コメントの後にさらにメッセージを書きます。
<script>
<!-------------
document.write("Hello,JavaScript!!")
//------------>
JavaScript対応のブラウザを使えば、このページをより楽しめます。
</script>
「JavaScript対応のブラウザを使えば~」の部分はJavaScript対応のブラウザではコメントであるために無視されますが、JavaScript未対応のブラウザではコメント外となり 、"-->"以降のメッセージが表示されます。
Content-Script-Type
イベントハンドラ(onXxxx="~")に記述したスクリプトの言語を指定するため、HTML4.01では、HTMLのヘッダ部に、下記のようなMETA記述を行うことを推奨しています。
<html>
<head>
<title>JavaScript Sample</title>
<meta http-equiv="Content-Script-Type" content="text/javascript">
</head>
<body>
:
<input type="button" value="OK" onclick="~">
:
</body>
</html>
JavaScript外部ファイル
JavaScriptのスクリプトを外部ファイルとして作成し、HTMLから呼び出すこともできます。例えば、下記の内容を test.js など、拡張子が .jsのファイルに記述しておきます。
function printMsg() {
alert("Hello!");
}
これを、例えば次のように呼び出すことができます。
<html>
<head>
<title>JavaScript Sample</title>
<script src="test.js"></script>
</head>
<body>
:
<input type="button" value="OK" onclick="printMsg()">
:
</body>
</html>