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

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

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

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1782閲覧

JavaScriptで選択したセレクトボックスのchangeイベントを発火させたい

t8pda

総合スコア9

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/08/25 04:13

ショッピングカート「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になる

実際のページを提示できず大変恐縮ですが、お知恵を拝借できれば幸いです。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ラジオボタンのon('change')のなかで、所定のセレクトボックスをtrigger('change')してみては?

sample

javascript

1<script> 2$(function(){ 3 $('select').on('change',function(){ 4 console.log('select change:'+$(this).val()); 5 }); 6 $('#radiobuttonwrap').on('change',':radio',function(){ 7 $('select').val($(this).val()).trigger('change'); 8 }); 9}); 10</script> 11 12<select data-id="makeshop-item-option1"> 13<option value="0">--選択してください</option> 14<option value="1"></option> 15<option value="2"></option> 16</select> 17 18<div id="radiobuttonwrap"> 19<label><input type="radio" name="rb0" id="r00" value="0">--選択してください</label> 20<label><input type="radio" name="rb0" id="r01" value="1"></label> 21<label><input type="radio" name="rb0" id="r02" value="2"></label> 22</div>

投稿2019/08/26 03:17

編集2019/08/26 07:03
yambejp

総合スコア114843

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

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

t8pda

2019/08/26 06:17

ご回答ありがとうございます! $('#radiobuttonwrap').on('change', 'input[type="radio"]', function() { $('select').trigger('change'); }); と書いてみましたが、うまくいきませんでした。 記述順のせいかと思い順番を色々と変えてみましたが変化がなかったので、 もう少し頂いたアドバイスについてしっかり調べた上で、再度チャレンジしてみようと思います。 この後2日程手を付けられないので間が空いてしまい恐縮ですが、後日改めてご報告させて頂きます!
yambejp

2019/08/26 07:03

一応sampleつけておきました。動作確認してみてください
t8pda

2019/08/26 08:25

sample本当にありがとうございます! 後日動作確認し改めてご報告いたしますので、取り急ぎお礼のみにて失礼いたします。
t8pda

2019/08/28 06:42

頂いたsampleの動作確認をしてみました! 結果は「コンソールに "select change: (value)"は表示されるが、最終的に求めている(soldout表示)は出てこない」というものでした。 selectはちゃんとchangeしているので、問題は他のところにあるということですね... おかげさまで一歩進むことができたのと、これ以上は何をご相談していいのやらという状況なので、 これにて閉じさせていただこうと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問