No.2ベストアンサー
- 回答日時:
// CSSOM-View : MSHTML
if ('undefined' !== typeof document.elementFromPoint
/*@cc_on @set @v = (5.5 <= @_jscript_version && @_jscript_version <= 5.8) @*/)
document./*@if (@v) attachEvent ('on' + @else@*/ addEventListener (/*@end@*/'click', function (e) {
for (
var
x = e.clientX, y = e.clientY, // [BUG] some browsers need e.page(X|Y)
d = e./*@if (@v) srcElement @else@*/ target /*@end@*/.ownerDocument,
r = d.documentElement, c = null, p = [ ], v = [ ], n, s;
c !== r;
c = n
) {
n = d.elementFromPoint (x, y);
if (n && n !== c) {
p[p.length] = n;
s = n.style;
v[v.length] = s.visibility;
s.visibility = 'hidden';
continue;
}
break;
}
for (var i = 0; n = p[i]; i++)
n.style.visibility = v[i];
alert (p);
}, false);
回答ありがとうございます。
elementFromPointメソッドなんてものがあったんですね。
コードをきちんと読み取れてはいませんが、
対象と成り得る全ての要素に対して、visibility:hiddenを1つずつかけながら、
その都度elementFromPointでチェックしていく、というのが大筋でしょうか。
しかし、こういったトリッキー?なコードが出てくるということは、
やはりイベントバブリングの制御のような便利機能は提供されていないんでしょうか・・・
ありがとうございました。
No.3
- 回答日時:
No.2 補足。
> 大筋
document.elementFromPoint(event.clientX, event.clientY) で要素を識別後、それを { visibility: hidden } し、同座標で背面にある要素を識別します({ display: none } では再描画が走る可能性がある)。それを null あるいは同要素の繰り返しになるまで続けます(実際問題として非表示によって背面要素を得られる確証はない)。
要素識別時に @style の visibility 値を保存しておき、後で復元します。指定されてなければ空文字列が返るはずです。復元時の style.visibility = '' は style.removeProperty('visibility') の構文糖衣のため(CSSOM: 5.5.1)、上記の { visibility: hidden } を除去します。
なお、ブラウザによっては数ピクセルずれたりなど振る舞いの一致は保証しませんので工夫して下さい。例えば、Opera 10 や Safari 3 などでは event.pageX、event.pageY でないと期待通りにならない不具合があります。
> イベントバブリングの制御のような
描画制御は DOM3-Views&Formatting で策定していましたが、2004 年に中止され実装もありません。ご存知のように、各ブラウザは MSIE の offset*、client*、scroll* などの描画プロパティを独自にサポートしたため、混乱を極めています。現在 CSSOM-View 草案が事態の収拾に努めていますが、人手不足のため遅々としています。モバイル機器など端末の多様化もあり、少なくともあと数年は描画制御の標準化は見込めないと思います。
なお、No.0 に
> 下層要素のonclick等の処理が走る必要は無く
とありますが、実はこちらの方なら現在でも手段が用意されています。
/* p 要素をスルーして背面の要素にマウスイベントを通知する */
p { pointer-events: none }
これは SVG のものですが、確認した限りでは Firefox 3.6 と Safari 4.1 は HTML 文書でサポートしています。
参考URL:http://www.w3.org/TR/SVG11/interact.html#Pointer …
No.1
- 回答日時:
document.addEventListener('click', function (event) { alert(event.target); }, false);
element.addEventListener - MDC
https://developer.mozilla.org/ja/DOM/element.add …
回答ありがとうございます。
しかしすみません、そのコードの意図が分かりません。
それだと、一番上にある要素しか処理が走らないと思うのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- 事件・犯罪 万引きの逮捕について 近年、捜査技術が進化してきているとは言えど、依然として万引きは基本的に現行犯で 4 2022/07/09 21:04
- 子供 男性に必要で女性に不要なモノ(才能・能力・身体的機能など)は何だと思いますか? 3 2022/06/21 17:07
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) Vba 配列の中の特定文字列の位置の調べ方 9 2022/05/23 17:46
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVAでの背景画像表示
-
画面のちらつきの原因が知りた...
-
VB.NET フォーム上に描いたグ...
-
MFCでMSペイントみたいなツー...
-
javaでクイズ
-
複数画像表示切り替え Visual c++
-
<JFreeChart> 縦軸の値の間隔を...
-
javaアプレットで太字を描く方法。
-
C# DataGridView のCellPaintin...
-
SwingとEDT(イベントディスパッ...
-
canvasで表示されてる画像を1...
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
-
複数の変数を宣言する時、同時...
-
C# インスタンスの破棄
-
インスタンス参照でアクセスで...
-
関数内の変数に<summary>コメン...
-
VB.NET getとsetの概念がわかり...
-
main()を持つクラスが2つ以上...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVAでの背景画像表示
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
C# DataGridView のCellPaintin...
-
SwingとEDT(イベントディスパッ...
-
描画してもウィンドウをリサイ...
-
GDI+で描画した画像を消去する...
-
C# リストビューの特定のセルの...
-
画面のちらつきの原因が知りた...
-
重なった要素上でのイベントで...
-
C#のGraphicsクラスについてです。
-
アクセスで他アプリから復帰し...
-
Javaで文字の角度を変えて表示...
-
Canvas等の図形を移動する時,直...
-
canvasで表示されてる画像を1...
-
複数画像表示切り替え Visual c++
-
PictureBoxのDrawWidthの設定
-
C# でパネルのマウスイベントが...
-
JavaScriptについて
-
このプログラミングをどう組み...
おすすめ情報