質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1924閲覧

JavaScript 後から追加された要素がクリックできない

d04062

総合スコア111

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/06/15 05:43

JavaScript初心者です。

Chromeのコンソールから、ボタンをクリックしたいのですが、(jQuery無しで)
調べていると、後から追加された要素に対しては、.clickが効かないようです。

イメージ説明
※実サイトではなくテスト用の画像です

Javascript

1document.querySelector('.button').click() 2>undefined

難しいことではない?かなと思うのですが、抜け出せずにいます。
アドバイスいただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/06/15 05:44

> 後から追加された要素に対しては、.clickが効かないようです。 それは、どのように判断しましたか?
d04062

2022/06/15 05:49

いくつかのサイトに記述がありました。 例 https://begeeek.com/article/972/ また、そのサイト内でも、他のボタンは.clickが効くのですが、 アニメーション(おそらくjs?)で出てくるボタンに、.clickが効かないため、 そのように判断しました。
guest

回答2

0

ベストアンサー

document.querySelector('.button')で取れるボタンは、このセレクタに合致するもののうち、並び順がDOMの最初にあるものだけです(MDN)。

あとから追加したかどうかにかかわらず、2つ目以降の.buttondocument.querySelector('.button').click()を実行しても何の影響もありません。

投稿2022/06/15 05:52

編集2022/06/15 05:54
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/06/15 05:53

ボタンにイベントがセットされているかどうかと関係なく、「検証方法が正しくないかもしれない」という趣旨の回答です。
d04062

2022/06/15 05:58

ありがとうございます。 >DOMの最初にあるものだけ 確かに失念していました。 ただ、どうやら今回は、「.buttonsView」という固有の1つだけしか存在しないクラス名で、 document.querySelector('.buttonsView')で取得できているようでした。
d04062

2022/06/15 06:02

またChromeで、リロード後のDOMを見ていると、 そのクラス名が後から、追加されているようです。
maisumakun

2022/06/15 06:09

> そのクラス名が後から、追加されているようです。 当然ながら、クラス名の追加前にquerySelectorを行ってもエレメントは取れません。
d04062

2022/06/15 06:16 編集

ありがとうございます。 順番を時系列にするとこんな形になっています ブラウザロード途中 (クラス名が追加されていない) ↓ ブラウザロード完了 (クラス名が追加される) ↓ document.querySelector('.buttonsView') > <div class="buttonsView" style="overflow: visible;">..</div> ↓ document.querySelector('.buttonsView').click() > undefined
maisumakun

2022/06/15 06:18

「undefined」と出るのは、clickが動作したかしないかに関係なく表示されますが、そこは大丈夫ですか?
d04062

2022/06/15 06:21

また、getElementsByClassNameでも同様undefinedになってしまいました。 document.getElementsByClassName('buttonsView')[0] > <div class=​"buttonsView" style=​"overflow:​ visible;​">​…​</div>​ document.getElementsByClassName('buttonsView')[0].click() > undefined
d04062

2022/06/15 06:25

>「uundefined」と出るのは、clickが動作したかしないかに関係なく表示されますが、そこは大丈夫ですか? そうだったんですね、理解していませんでした。 そうすると、クリック出来たかどうか、どのように判定すればよいのでしょうか? (手動でクリックすればページ遷移します、ページ遷移はしませんでした)
d04062

2022/06/15 06:45

>「uundefined」と出るのは、clickが動作したかしないかに関係なく表示されますが、そこは大丈夫ですか? そうだったんですね、理解していませんでした。 そうすると、クリック出来たかどうか、どのように判定すればよいのでしょうか? (手動でクリックすればページ遷移します、ページ遷移はしませんでした)
d04062

2022/06/15 06:45

もしかすると、そもそも私の認識に間違いがあるかもしれないと思いまして、 動画を撮りました。 https://youtube.com/shorts/H2BPiUQGO5E ・リロードすると、dvi.overlayViewと、その中にdiv.buttonsViewが後から追加されます。 ・document.querySelector('.buttonsView')で取得はできるが、 ・document.querySelector('.buttonsView').click()をしても何も発火しない ・手動で、dvi.overlayViewをクリックすると、イベントが発火する といった流れです。
maisumakun

2022/06/15 06:50 編集

単にbuttonsViewは見た目だけで置いてあって、上から透明で被さるoverlayViewにイベントが仕掛けてある、という状況かもしれません。 (click()で動作させると、本当にそのボタンについてイベントを起こすので、「実際には上にかぶさったものがクリックされる」動作は再現できません)
d04062

2022/06/15 07:00

ありがとうございます。 おっしゃるとおりでした。
maisumakun

2022/06/16 07:28 編集

余談ですが、「透明なiframeを使って別な表示でユーザーのクリックを誘い、本来ユーザーにしかできない操作を意図せずに行わせる」という、「クリックジャッキング」と呼ばれる攻撃手法もあります。
guest

0

プログラムで作成されたものはコンソールからは普通に参照できるはずです

javascript

1window.addEventListener('DOMContentLoaded', ()=>{ 2 const btn=document.createElement('button'); 3 btn.classList.add('button'); 4 btn.textContent="btn"; 5 btn.addEventListener('click',()=>{ 6 console.log('btn'); 7 }); 8 document.body.appendChild(btn); 9});

上記でつくってあればコンソールから
document.querySelector('.button').click()
でクリックイベントが実行できます

投稿2022/06/15 06:03

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

d04062

2022/06/15 06:10

ありがとうございます。 「自サイトに上記のコードを埋め込んであれば」ということ?かなと思うのですが、 ブラウザ自動操作で、他サイトのボタンをクリックしたいと思ってます。 (JavaScrip 全く初心者で認識間違っていたら、すみません)
yambejp

2022/06/15 06:49 編集

> 自サイトに上記のコードを埋め込んであれば いえ、違います。命題が「後から追加された要素」と書いてあるので それを想像して実装しただけです。 本来なら質問者さんが「後から追加」の部分を説明すべきでした > 他サイトのボタンをクリック 他サイトでも同じです。 あとからボタンが追加されても参照時点でボタンがあるのであれば イベントは利用可能です。
d04062

2022/06/15 07:01

ありがとうございます。解決しました 透明のレイヤーだっため、押すことが出来ないようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問