ショッピングカート「MakeShop」の商品詳細ページをカスタマイズしています。
利用している「クリエイターモード」では商品オプションの選択項目がセレクトボックスで生成されるのですが、これをラジオボタンに変更したかった為
JavaScriptにて選択項目を取得 > ラジオボタン生成 > ラジオボタンに対応したoptionをselected=trueに
とすることで「インターフェイスはラジオボタンだけど実際に操作されているのはセレクトボックス」という状態にするところまでは実現できました。
選択自体は問題なくできているのですが、元々セレクトボックスに対して設定されているchangeイベントが発火せず、つまずいております。
該当のソースコード
html
1<!-- MakeShopによって自動生成された範囲ここから --> 2<div class="makeshop-option-wrap"> 3 <p class="makeshop-option-label">商品カラー選択</p> 4 <label class="makeshop-option-select-wrap"> 5 <select data-id="makeshop-item-option1" class="makeshop-option-select"> 6 <option value="0" class="makeshop-option-select-item makeshop-option-select-title">--選択してください</option> 7 <option value="1" class="makeshop-option-select-item">黒</option> 8 <option value="2" class="makeshop-option-select-item">白</option> 9 </select> 10 </label> 11</div> 12<!-- 自動生成ここまで --> 13 14<!-- インターフェイスとして作った範囲ここから --> 15<div id="radiobuttonwrap"> 16 <input type="radio" name="rb0" id="r00" value="0"> 17 <label for="r00">--選択してください</label> 18 <input type="radio" name="rb0" id="r01" value="1"> 19 <label for="r01">黒</label> 20 <input type="radio" name="rb0" id="r02" value="2"> 21 <label for="r02">白</label> 22</div> 23<!-- インターフェイスここまで -->
javascript
1window.onload = function(){ 2 document.querySelectorAll('label, input[type="radio"]').forEach(function(rb) { 3 rb.addEventListener('click', function() { 4 if (rb.checked === true) { 5 var rbValue = this.value; 6 var wrapIndex = this.name.slice(2); 7 //ラジオボタンを生成する時、name属性を「接頭辞rb+'.makeshop-option-wrap'のインデックス番号」で指定している為 8 //接頭辞をスライスして何番目のwrapに属すselectに反映させればいいかを取得しています 9 var wrap = document.querySelectorAll('.makeshop-option-wrap')[wrapIndex]; 10 var op = wrap.querySelectorAll('.makeshop-option-select option'); 11 op[rbValue].selected = true; 12 } 13 }, false); 14 }); 15}
発火できないchangeイベント
html
1<!-- MakeShopによる自動生成の為変更不可 --> 2<input type="hidden" id="makeshop-page-item-option-data" 3 data-brandcode="000000000002" 4 data-id-option-prefix="makeshop-item-option" 5 data-id-price="makeshop-item-price" 6 data-id-price-excluded-tax="makeshop-item-price-excluded-tax" 7 data-id-tax="makeshop-item-tax" 8 data-id-point="makeshop-item-point" 9>
javascript
1// MakeShopによる自動生成の為変更不可 2function initItemOption() 3{ 4 var optionData = $('#makeshop-page-item-option-data'); 5 var optionIdPrefix = optionData.attr('data-id-option-prefix'); 6 var priceId = optionData.attr('data-id-price'); 7 var priceExcludedTaxId = optionData.attr('data-id-price-excluded-tax'); 8 var taxId = optionData.attr('data-id-tax'); 9 var pointId = optionData.attr('data-id-point'); 10 11 $('[data-id^="' + optionIdPrefix + '"]').on('change', function() { 12 var index = $('[data-id="' + $(this).attr('data-id') + '"]').index(this); 13 14 var optionList = []; 15 $('[data-id^="' + optionIdPrefix + '"]').each(function() { 16 optionList.push($(this).val()); 17 }); 18 19 $.ajax({ 20 url: '/shop/item_info.html', 21 type: 'POST', 22 data: JSON.stringify({ 23 'element_index': index, 24 'item_code': optionData.attr('data-brandcode'), 25 'option_list': optionList 26 }), 27 contentType: 'application/json', 28 dataType: 'json' 29 }).done(function(data) { 30 $('[data-id="' + priceId + '"]').html(data.final_price); 31 $('[data-id="' + priceExcludedTaxId + '"]').html(data.final_price_exculuded_tax); 32 $('[data-id="' + taxId + '"]').html(data.final_tax); 33 $('[data-id="' + pointId + '"]').html(data.final_point); 34 35 if (typeof MakeShop_afterItemOptionChange === 'function') { 36 var hookData = { 37 elementIndex: data.element_index, 38 isSoldout: data.is_soldout, 39 method: { 40 modal: openModalMessage 41 } 42 }; 43 if (MakeShop_afterItemOptionChange(hookData) === false) { 44 return; 45 } 46 } 47 }); 48 49 return false; 50 }).eq(0).trigger('change'); 51}
input[type=hidden]にて設定されている「data-brandcode」は、商品ごとに自動生成されるユニークな番号ですが、他の属性については解らず固定の値かな?と思っています。
発火しないchangeイベントではjsonを使って選択肢ごとの在庫を調べているようなのですが
コピペ中心のJavaScript初心者であるのに加え、そもそもが変則的なことをしているので、なるべく色々な値を参照せずに表面的なカスタマイズに留めたく
セレクトボックスが変更された事を検知してさえくれれば、、と表題の質問とさせていただいた次第です。
ちなみに、changeイベントが発火したのは
セレクトボックスを直接操作して「選択肢が変更されたとき」のみでした。
例) 選択肢「黒」の商品が売り切れの場合
ラジオボタンで黒を選択してもsoldoutにならない
→ 黒と既に表示されたセレクトボックスをアクティブにして、そのまま黒を選択しなおしても変化なし
→ 白または「選択してください」が表示されている状態から、セレクトボックスで直接黒を選ぶとsoldoutになる
実際のページを提示できず大変恐縮ですが、お知恵を拝借できれば幸いです。
どうぞよろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/26 06:17
2019/08/26 07:03
2019/08/26 08:25
2019/08/28 06:42