SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

クロスブラウザスクリプトの作成テクニック

ブラウザごとのeventオブジェクトの違いを理解する

クロスブラウザスクリプト作成時に問題となる、eventオブジェクトの用法とプロパティ


レイヤー関連のプロパティ

 Mozilla系ブラウザ用プロパティのうち、layerXプロパティとlayerYプロパティはレイヤーの位置に関する情報を持つプロパティとなります。そのため、このプロパティは、レイヤーに唯一対応しているブラウザであるNetscape Navigator 4.Xでしか使用できません。JavaScriptを使用したレイヤーの取り扱いについては、「スタイルシートやレイヤーを操作する」「ブラウザがサポートしているスクリプトを判断する」「ブラウザがサポートしているスクリプトを判断する 2」などでも解説しているので併せて参照してください。

イベントの発生した位置を提供するプロパティ

 eventオブジェクトには、イベントが発生した位置を値に持つ多くのプロパティが用意されています。その中で、「イベントが発生したスクリーン上の位置」の値を持つscreenXプロパティとscreenYプロパティは、Internet Explorer、Mozilla系ブラウザの両方でサポートしています。このプロパティの値はOpera、Safariでも同じ値となります。

 また、Internet ExplorerのclientXプロパティとclientYプロパティ、Mozilla系ブラウザのpageXプロパティとpageYプロパティはともに、イベントが発生したウインドウ内の「コンテンツ表示領域上の位置」を値に持ちます。このプロパティの値も、Internet Explorer、Mozilla系ブラウザ、Opera、Safariで同じ値となります。

 これに対し、Internet ExplorerのoffsetXプロパティとoffsetYプロパティは、イベントが発生したウインドウ内の「コンテンツ表示領域内に存在する要素上の位置」を値に持っています。「Sample_1」(Sample/Sample_1.html)を見ても分かるように、コンテンツ表示領域内に何も「要素」が存在しない場合でも、ブラウザによってはclientXプロパティ、clientYプロパティとoffsetXプロパティ、offsetYプロパティの値に差がある場合があります。また、offsetXプロパティ、offsetYプロパティの値は、このプロパティをサポートしているブラウザ間でも違いがあります。これは、各ブラウザの作りによるものなので、ユーザ側ではどうすることもできません。この違いは、数ピクセルとあまり大きな差ではありません。しかし、これがコンテンツ表示領域内に何らかの「要素」が存在する場合では、話が違ってきます。試しに、次のサンプルを実行してみましょう。サンプルではbody要素内にdiv要素を設定しています。

Sample/Sample_3.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>Sample_3</title>
<script type="text/javascript">
<!--
function eve() {
    alert ( "イベントのタイプ:" + window.event.type + "\n" +
            "イベントが発生したウインドウ上のX座標:" +
                 window.event.clientX + "\n" +
            "イベントが発生したウインドウ上のY座標:" +
                 window.event.clientY + "\n" +
            "イベントが発生した要素上のX座標:" +
                 window.event.offsetX + "\n" +
            "イベントが発生した要素上のY座標:" +
                 window.event.offsetY )
   return true;
}
document.onmousedown = eve;
//-->
</script>
<style type="text/css">
<!--
body { background-color: #ffffff; }
-->
</style>
</head>
<body>
<div id='STY' name='STY' style=
      'position:absolute;left:50px;top:100px;width:300px; height:200px;background:Tan'>
 div要素...
</div>
</body></html>

clientXプロパティ、clientYプロパティとoffsetXプロパティ、offsetYプロパティの違い

 各プロパティの値に注目してください。

Internet Explorerでの実行結果
Internet Explorerでの実行結果
Operaでの実行結果
Operaでの実行結果
Safariでの実行結果
Safariでの実行結果

 このサンプルのdiv要素の上でマウスボタンを押した場合、clientXプロパティとclientYプロパティの値は、イベントが発生したウインドウ内の「コンテンツ表示領域の左上角からの値」となります。それに対しoffsetXプロパティとoffsetYプロパティの値は、「div要素の左上角からの値」となります。

 サンプルの場合、div要素はウインドウ内のコンテンツ表示領域左端から50ピクセル、上から100ピクセルの位置に表示しています。このため、div要素内でイベントが発生した場合、要素が何もない場合と同様(ブラウザによって多少の誤差はありますが)、clientXプロパティとoffsetXプロパティは約50ピクセル、clientYプロパティとoffsetYプロパティは約100ピクセルの差が発生することになります。

 このように、コンテンツ内に何らかの「要素」が存在する場合、clientXプロパティ、clientYプロパティとoffsetXプロパティ、offsetYプロパティの値には、大きな差が出てきます。もしも、ウインドウ内のコンテンツ表示領域で、イベントが発生した位置の値を利用したクロスブラウザスクリプトを作成する場合、Mozilla系ブラウザのpageXプロパティ、pageYプロパティと値を合わせることができるので、Internet Explorer用の処理では、clientXプロパティ、clientYプロパティを使った方が、より分かりやすいでしょう。

 また、offsetXプロパティ、offsetYプロパティを使った場合、これらのプロパティに対応したブラウザでも、ブラウザ間で発生する数ピクセルの値の差が問題になってくるかもしれません。

次のページ
キーの値を提供するプロパティ

この記事は参考になりましたか?

クロスブラウザスクリプトの作成テクニック連載記事一覧

もっと読む

この記事の著者

半場 方人(ハンバ マサヒト)

Netscape2.XでJavaScriptに初めて出合ったころ、「なぜJavaScriptの日本語の書籍が無いんだ」、とあちこちで嘆いていたら、じゃあおまえが書け、とお声がかかり、JavaScript関連の書籍を執筆するようになる。執筆に際していつも考えるのは、「JavaScript初心者だった頃の気持ちを忘れないよに」、ということ。主な著書は、「標準Webデザイン講座 JavaScript&Ajax」(翔泳社)などがある。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2390 2008/08/26 13:54

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー