###実現したいこと
以下条件を実現したいです。
【ケース1】.item_link
に子要素が存在するとき
→linkData
に値を入れたい
【ケース2】.item_photos
に子要素が存在するとき
→photoData
に値を入れたい
※ちなみに.item_link
と.item_photos
は片方しか存在しません。
###発生している問題
かなり謎な現象です。
ケース1と2はis_link
とis_photo
で条件分岐しているのにも関わらず、どちらのケースでもlinkData
とphotoData
の双方に値が入ってしまいます。
###該当のソースコード
以下を実行してみてください。ケース2です。
.item_photos
にしか子要素は存在しませんので、判定は問題なく
is_link = false
is_photos = true
とコンソールに出ます。
しかし、linkData
とphotoData
の双方に値が入ってしまうといった現象です。
html
1<div class="list"> 2 <button type="button">button</button> 3 <div class="item_link"> 4 <!-- <div class="box" data-box='{"name":"taro","id":"1"}'></div> --> 5 </div> 6 <div class="item_photos"> 7 <img src="" data-photo_id="10"><img src="" data-photo_id="20"> 8 </div> 9</div>
js
1$(document).on('click','button', function(){ 2 3 const $list = $(this).closest('.list'); 4 5 let linkData = photoData = []; 6 7 const is_link = $list.find('.item_link').children().length === 0 ? false : true; 8 const is_photos = $list.find('.item_photos').children().length === 0 ? false : true; 9 console.log('is_link = ',is_link); 10 console.log('is_photos = ',is_photos); 11 12 if( is_link && ! is_photos ){ 13 const data = JSON.parse( $list.find('.item_link .box').attr('data-box') ); 14 const a = { 15 id : data.id, 16 name: data.name 17 }; 18 linkData.push( a ); 19 }else if( ! is_link && is_photos ){ 20 $list.find('.item_photos img').each(function(){ 21 const b = { 22 id : $(this).attr('data-photo_id'), 23 name: 'his' 24 }; 25 photoData.push( b ); 26 }); 27 } 28 29 console.log('linkData = ',linkData); 30 console.log('photoData = ',photoData); 31 32});
###試したこと
上記の通りですがis_link
とis_photo
での判定をコンソールに出すということを試しまして、これできちんと判定できているのに、なぜ?といった感じで、ほかに試すことが思いつきません。
あとはHTMLのコメントアウトを逆にしました↓が、すると逆の値が双方に入りました。
html
1<div class="list"> 2 <button type="button">button</button> 3 <div class="item_link"> 4 <div class="box" data-box='{"name":"taro","id":"1"}'></div> 5 </div> 6 <div class="item_photos"> 7 <!-- <img src="" data-photo_id="10"><img src="" data-photo_id="20"> --> 8 </div> 9</div>
わけがわからないです…
###jQeuryバージョン
上記は3.4.1の最新ですが、バージョンはあまり関係なく古いものでも同様でした。
###解決策?
無理やりもう一方を初期化すると解決しました↓が、そもそも初期化しないといけないことに納得できません。条件分岐を超えてしまうことが問題なので、その点での解決策を知りたいです。
アドバイス宜しくお願いいたします。
jQuery
1 if( is_link && ! is_photos ){ 2 const data = JSON.parse( $list.find('.item_link .box').attr('data-box') ); 3 const a = { 4 id : data.id, 5 name: data.name 6 }; 7 linkData.push( a ); 8 photoData= []; // もう一方を初期化 9 }else if( ! is_link && is_photos ){ 10 $list.find('.item_photos img').each(function(){ 11 const b = { 12 id : $(this).attr('data-photo_id'), 13 name: 'his' 14 }; 15 photoData.push( b ); 16 }); 17 linkData = []; // もう一方を初期化 18 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/19 22:49
2020/06/19 22:53
2020/06/19 22:53
2020/06/19 22:56
2020/06/19 22:59
2020/06/20 01:44
2020/06/22 20:22 編集