前提・実現したいこと
jQueryの質問になります。
二つのHTMLを比較し、『異なる部分を置換』する方法を知りたいです。
該当のソースコード
次のソースコードは、iniObjからHTMLを生成し、ボタンクリックでnewObjのHTMLへと『すべてを置換』しますが、これを『異なる部分を置換』という風にしたいのです。
『異なる部分を置換』というのは『iniObjとnewObjの値を比較して、HTMLの異なる部分を置換』という意味で、たとえば『user_idが異なればHTMLのその部分だけを置換し、titleが異なれば以下同文』です。
html
1<button type="button">ボタン</button> 2<div class="box"> 3 <!-- 4 読み込み時 5 → iniObjから生成されたHTMLが入ります 6 ボタンクリック時 7 → iniObjとnewObjの値を比較して、HTMLの異なる部分を置換します 8 --> 9</div>
jQuery
1// 読み込み時 2const iniObj = {user_id:1,user_name:'鈴木',title:'今日の天気'}; 3const html = getHtml(iniObj); 4$('.box').html(html); 5 6// HTML生成 7function getHtml(obj){ 8 const 9 user_id = obj.user_id, 10 user_name = obj.user_name, 11 title = obj.title; 12 return ` 13 <div> 14 <p class="userdata user_id">${user_id}</p> 15 <p class="user_name">${user_name}</p> 16 <p class="post_title">${title}</p> 17 </div>`; 18} 19 20// ボタンクリック時 21$('button').click(function(){ 22 const newObj = {user_id:2,user_name:'山田',title:'今日の天気'}; 23 const html = getHtml(newObj); 24 $('.box').html(html); 25});
試したこと
次の流れで考えています。
躓いているのは「一致しない文字列のクラスを取得」の部分です。
あと'userdata user_id'のように複数クラスがある場合の置換もできません。(findメソッドが単一クラスにしか対応していないため?)
jQuery
1// ボタンクリック時 2$('button').click(function(){ 3 // 2つのHTMLを取得する 4 const iniHtml = getHtml(iniObj); 5 const newObj = {user_id:2,user_name:'山田',title:'今日の天気'}; 6 const newHtml = getHtml(newObj); 7 8 // 一致しない文字列のクラスを取得 9 let classNames = ['userdata user_id','user_name']; 10 11 // そのクラスだけを置換する 12 classNames.forEach(function(className){ 13 const html = $(newHtml).find('.'+className); 14 $('.box').find('.'+className).html(html); 15 }); 16});
補足情報(FW/ツールのバージョンなど)
あくまで『異なる部分を置換』であって、『すべてを置換』ではないというのが難しいところです。
jQueryは3.4.1です。
良いお考えがございましたらご回答宜しくお願い致します。
回答3件
あなたの回答
tips
プレビュー