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

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

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

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

4015閲覧

動的変更後のcssがajaxで追加した要素に適用されない

SugiuraY

総合スコア317

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/08/21 09:18

ajax部分がjsfiddle等で反映できないので、少し言葉でも補足させて頂きますが
申し訳ございません。

JSFiddle

  1. 下記の<!--original-->のhtmlが存在し、.toggleが設定されているため、.first内の各trは初期では表示されていません
  2. ここで.btnをクリックした場合、Jqueryにより.show()され、displayのnoneが打ち消されます(ここでなぜか、display:table-rowが設定されます)
  3. その後2)の状態のまま、ajaxにより、.insertに<!--ajaxで追加-->の要素が追加
  4. そして、<!--ajaxで追加-->のtableのtrに.toggleが設定されており、その時点で.toggleのdisplayのnoneは打ち消されているため<!--ajaxで追加-->の要素も表示される

と想定したのですが、<!--ajaxで追加-->の要素は表示されません。
developer toolでみてもtrの.toggleにはdisplay:noneが適用されておりました。

また、.show()の仕様の問題化とも考えたため、以下のようにcssの書換えを行なっても
ajaxで追加後の要素に本cssは適用されませんでした。
$('.toggle').css('display','row-table')

なぜ、.btn clickで動的に変更したtoggleのcssが
ajaxで追加した要素には適用されないのかという原因と解決方法について
アドバイスを頂けますでしょうか。

宜しくお願い申し上げます。

html

1<!--original--> 2<table class="first"> 3 <tbody> 4 <tr class="toggle"><td>A</td></tr> 5 <tr class="toggle"><td>B</td></tr> 6 <tr class="toggle"><td>C</td></tr> 7 </tbody> 8</table> 9 10<div class="insert"></div> 11<button class="btn">push</button>

html

1<!--ajaxで追加--> 2<table class="second"> 3 <tbody> 4 <tr class="toggle"><td>D</td></tr> 5 <tr class="toggle"><td>E</td></tr> 6 <tr class="toggle"><td>F</td></tr> 7 </tbody> 8</table>

css

1.toggle{ 2 display:none; 3}

javascript

1$(function(){ 2 $('.btn').on('click',function(){ 3 $('.toggle').show(); 4 }) 5})

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

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

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

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

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

guest

回答1

0

ベストアンサー

jqueryのセレクタをクラスで指定で使っていると、「クラス」の設定そのものを書き換えているように錯覚するかもしれませんが、$('.toggle').show();この.toggleは、ただの目印にすぎません。

ボタンを押したときの処理は、

今のhtmlの中から、クラス.toggleを持っている要素を見つけて、
その要素に対してshowする(あるいは、displayをrow-tableにする)

だけです。

cssファイル自体が、

.toggle{ display: row-table; }

のように上書きされた状態になるわけではありません。

■ 解決方法
あとから追加される.toggleの要素が、いつajaxで読み込まれるのか分かりませんので、
これが最善策かどうかは微妙ですが。

簡単な方法としては、

CSSは、見せるクラスを分けておく。

css

1.toggle{ 2 display: none; 3} 4.toggle.show{ 5 display: row-table; 6}

ボタン押すところは、show()(スタイルを設定)するのではなく、見せるクラスを追加する。

javascript

1$(function(){ 2 $('.btn').on('click',function(){ 3 $('.toggle').addClass('show'); 4 }) 5})

あとは、ajaxであとから.toggleの要素を足す最後の部分で、

if($('.toggle.show').length > 0){ $('.toggle:not(.show)').addClass('show'); }

見せてるクラスが付いている.toggleが他にあれば、
追加した.toggleにも.showが付くように書いておけばいいかなーと。

投稿2018/08/21 09:46

mix-peach

総合スコア1910

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

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

SugiuraY

2018/08/22 01:06

mix-peach様 ご回答を賜り、誠に有難うございます。 完全に錯覚しておりました、実際にcssを書き換えてくれているわけではなく、一時的にDOMの要素を書き換えている(インラインでcssを適用している感覚に近い?)といった感じなのですね。 ご指摘の方法でそれぞれのclassを事前に作成しておくことで無事解決しました。 classをadd removeすることでcssを適用されますが、fadeIn fadeOutやanimationといったJqueryの動きをつけれなくなることは残念ですが、大変勉強になりました。 有難うございます!
mix-peach

2018/08/22 02:31

cssでも、transition とかの設定で動いているように見せることもできたと思います。 他にも、ajaxの要素がいつ読み込まれるか次第ではありますが、ボタンを押せるタイミング自体を、全てのtoggle要素を読み込んでから・・と、制御する方法でも良いかもしれません。 回答は、あくまで「質問に提示されたことを簡単に実現できる方法」の例なので、実際の仕様(やりたいこと)に沿った良い別の方法もあると思います。もし、時間があれば試行錯誤してみても良いと思いますよー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問