[8] この種の[[属性]]のリストは[[事象取扱器属性の一覧]]を参照してください。
* 事象取扱器内容属性
** スクリプト言語の指定
- [1] [[HTML]] の on[VAR[*]] 属性 (非推奨。) で [[JavaScript]] を使う時に、先頭に [[javascript:]] って書く DQN がなぜか多いな。
- [2] >>1 まあ [[Content-Script-Type:]] 問題についての[[不思議マーク付け]]的解法なのかもしれんが。。。(w
- [3] >>1-2 にしても、文法エラーにならずに動く (こともある。) なんて、一体どうなっているんだ? JavaScript 的にはどういう扱いになってるんだろう? それとも [[UA]] の補正なのかな?
- [4] >>3 [[ラベル]]。
[5]
>>1-4 [[WinIE]] だとそれが“ちゃんと”はたらいて、 [CODE[vbscript:]] と書くと [[VBScript]] になったりしちゃいます。
[10]
>748 名前:Name_Not_Found[sage] 投稿日:2005/10/08(土) 04:12:41 ID:???
>
HTML のイベント属性に javascript: を書くことについて。
- 文法的には、ただのラベルである。
- そこそこ誰でも知っていて、なんとなく使ったり読んだりしている。
- WinIE が、javascript, jscript, vbscript, vbs, perlscript に反応する。
(プラットフォームも含め、過不足あれば指摘してくれ。)
- しかし、きちんとした仕様説明が見当たらない (探せなかっただけかもしれないが)。
ラベル
ttp://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/12_Statements.html#LabelledStatement
FOO: for ( .. ) for ( .. ) if ( .. ) continue FOO;
におけるラベル FOO と同じ。
ラベルの例をもう一つ。
alert(6)
どうやら、良く練られた拡張ではなく、姑息な特例だと言わざるを得ない。
;;
[CITE@ja[+ JavaScript の質問用スレッド vol.41 +]]
** 内部での表現
[9] [CITE[Hawk's W3 Laboratory : DHTML Tips : イベントハンドラに関する考察]] [DEL[]]
>
:更新日時: 2004年09月22日
>
結論から言うと、この「属性の中身のコード」は、対象となる要素に対応するHTMLElementオブジェクトのプロパティに、関数の形で格納されています。イベント発生時にはそのオブジェクトのメソッドとして実行されるわけです。
>
実体が関数であることは、イベント内でargumentsを参照できることから分かります。更に一歩進んでarguments.calleeにアクセスすれば実体の関数そのものにアクセスできます。
>
以下の例では関数の内容を表示しています。alert(arguments.callee);という記述が "そのまま"表示されるのが確認できるでしょう。
>
[PRE(HTML example code)[
リンク
]PRE]
ただし、実際に試してみれば分かりますが、表示内容(すなわち実装方法)はブラウザによって大きく2系統に分かれます。上記の例はIEでは以下のように表示されるはずです。
>
[PRE[
function anonymous()
{
alert(arguments.callee);
}
]PRE]
>
anonymous(匿名)とは無名のFunctionオブジェクトに仮に付けられた名です。つまりIEでは、単に属性値のスクリプトコードを実行するだけの関数が生成され、対象となるオブジェクトのプロパティに格納されることになります。
>
一方で、NN4.XおよびGeckoベースのブラウザでは以下のようになります。
>
[PRE[
function onmouseover(event)
{
alert(arguments.callee);
}
]PRE]
>
Operaではこうです。
>
[PRE[
function anonymous(event)
{
alert(arguments.callee);
}
]PRE]
>
KHTMLベースのブラウザではこうなります。
[PRE[
function (event)
{
alert(arguments.callee);
}
]PRE]
>
名前の有無や名前が無い場合の表現など、瑣末な違いはありますが、いずれもeventという仮引数が存在していることが大きな特徴です。この仮引数はイベントオブジェクト(NN4.Xにおいてはevent object、その他の場合はDOM2 EventsにおけるEventインターフェイスを実装したオブジェクト)を表しています。
>
NN4.Xのイベントモデルでも、DOM2 Eventsでも、イベントに関する情報はイベントオブジェクトの形で、イベントハンドラとして登録された関数の第一引数に渡されます。だからこのような形の関数になるのは理にかなっているのですが、そのとき仮引数の名前が”event”になることなどは特に標準化されていないので注意が必要です。
>
またこのeventという名前は、偶然にも?IEのwindow.eventと同じなので、
>
[PRE(HTML example code)[
リンク
]PRE]
このように記述すれば、関数fooにはブラウザを問わず第一引数にeventオブジェクトが渡されます(もっともfoo内での条件分岐は必要になりますが)。
;; [11] [[関数]]内で[[関数]]名を使って再起呼び出しできるのかな?
* [CODE(JS)@en[window.event]]
[6] [[WinIE7]], [[Opera]], [[WebKit]] は対応しているみたいです。
[7]
[[Firefox3]] は対応していないみたいです。
;; [12] [[事象取扱器属性]]の時だけでなく、 [CODE(DOMm)@en[[[attachEvent]]]]
した[[事象取扱器]]の時にも設定されているの?
[13] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-30 00:13:50 +09:00]] 版)
[14] [CITE['''['''whatwg''']''' Additional onxxxx event attributes for DOM Level3 Events]]
([TIME[2010-12-01 08:26:00 +09:00]] 版)
[15] [CITE@en[Web Applications 1.0 r5933 Be better about how we define the creation of scripts for event handler attributes (specifically, how we interact with the JS spec).]]
( ([TIME[2011-03-04 09:52:00 +09:00]] 版))
[16] [CITE[''''''[''''''whatwg'''''']'''''' on* attributes on DOM elements]]
( ([TIME[2011-06-18 08:37:31 +09:00]] 版))
[17] [CITE[IRC logs: freenode / #whatwg / 20110728]]
( ([TIME[2011-08-07 22:56:46 +09:00]] 版))
[18] [CITE[IRC logs: freenode / #whatwg / 20111117]]
( ([TIME[2011-11-19 14:21:09 +09:00]] 版))
[19] [CITE[''''''[''''''whatwg'''''']'''''' API design restrictions due to barewords in onxxx="" attributes]]
( ([TIME[2011-12-03 12:41:47 +09:00]] 版))
[20] [CITE@en[Writing forward-compatible websites - MDN]]
( ([TIME[2011-12-03 12:41:52 +09:00]] 版))
[21] [CITE[IRC logs: freenode / #whatwg / 20120427]]
( ([TIME[2012-05-06 12:41:01 +09:00]] 版))
[22] [CITE[IRC logs: freenode / #whatwg / 20120518]]
( ([TIME[2012-05-31 20:23:25 +09:00]] 版))
[23] [CITE@en[''''''[''''''proximity'''''']'''''' HTML's WebIDL Function]]
( ([[Marcos Caceres]] 著, [TIME[2012-05-28 20:25:42 +09:00]] 版))
[24] [CITE[IRC logs: freenode / #whatwg / 20120620]]
( ([TIME[2012-07-04 21:39:52 +09:00]] 版))