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

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

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

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

Q&A

解決済

2回答

944閲覧

特定の要素にCSSを付与してデザインを変更してからアラートを表示したい

bokupiroki

総合スコア54

JavaScript

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

0グッド

2クリップ

投稿2022/01/03 16:52

前提・実現したいこと

投稿のアーカイブページにて
・削除ボタンを押したら、該当記事の明るさを変更するCSSを付与
・その後アラートを表示してOKが押されたら該当記事を削除
このような一連の動作を行う処理を行いたいです。

発生している問題・エラーメッセージ

クラスを付与してからアラートを表示したいのに、
アラートが表示されてOKを押した後にしかCSSが効かない。

厳密にいうとクラス自体は付与されているようなのですが、
OKを押すまでデザインは変わらないような感じです。

該当のソースコード

javascript

1delete(id) { 2 var activeClass = document.getElementById(id); 3 activeClass.classList.add("activeCard"); 4 5 alert(id+'を削除しますか') 6},

css

1.activeCard { 2 opacity: 0.5; 3}

単純に上から順に実行してくれるのであればこれで大丈夫だろうと思っていましたが、ダメなようです。

試したこと

クラスを付与する処理が完了してからalertが表示されるように、
下記のように関数を分割してみました。

javascript

1delete(id) { 2 var activeClass = document.getElementById(id); 3 var result = this.changeActiveClassColor(activeClass) 4 5 if(result){alert(id+'を削除しますか')}//色が変わってからalertを発火 6}, 7changeActiveClassColor(activeClass){ 8 activeClass.classList.add("activeCard");//該当要素の色を変更するクラスを付与 9 return true 10}

しかし、結果は同じでした。

「〇秒待ってからアラートを表示する」みたいな書き方をすれば可能なのかもしれませんが、
それはあまりスマートではない気がします。

どなたか知恵を貸していただきたいです。

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

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

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

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

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

guest

回答2

0

jsの処理が終わるまでhtmlパースが止まってしまうから不可能ぽい気がします。

投稿2022/01/03 18:41

recal

総合スコア1126

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

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

bokupiroki

2022/01/04 08:01

やっぱりsetTimeoutとか使わないと無理みたいですね。 ありがとうございました。
guest

0

ベストアンサー

「〇秒待ってからアラートを表示する」みたいな書き方をすれば可能なのかもしれませんが、

それはあまりスマートではない気がします。

recalさんの回答通り、この要件は難しく、
○秒経ってから、実行、とするのが一番素直で簡単なので、
setTimeoutを使うと良いかと。
そして、は入りません。
おそらく人間が体感する時間より遥かに短い時間(100ms以下)でも遅らせれば、
先にレンダリングがされると思います。

また、かなり処理が複雑にはなりますが、
DOMの変化を監視させ、該当箇所が変化した際にコールバックして処理を実行、という手段も存在します。
そこらへんは、どうかご自分でお調べください。

投稿2022/01/04 01:08

miyabi_takatsuk

総合スコア9528

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

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

bokupiroki

2022/01/04 08:01

ありがとうございます。 setTimeoutで対応しました。 delete(id) { var activeClass = document.getElementById(id); activeClass.classList.add("activeCard"); setTimeout(function () { alert(id + 'を削除しますか') }, 100);
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問