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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JavaScript

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

Ajax

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

Q&A

解決済

3回答

1647閲覧

Ajax通信で指定のデータが存在する場合まとめて送信したい

sk-sora--ypi

総合スコア535

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

JavaScript

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

Ajax

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

0グッド

0クリップ

投稿2020/11/05 18:16

編集2020/11/06 03:04

質問内容

Djangoを使用しているんですが、
ajaxを使用してAPIもどきを作成しています。

ボタン1、ボタン2、ボタン3
とそれぞれ押したら通信するというものなのですが、
ボタン2だけ、input[type=hidden]の値も送りたい や、
ボタン3は、input[type=hidden]が2つ存在し、どちらも送りたい
ボタン1にはそのinput[type=hidden]は存在しない

html

1<div class="buttons"> 2 <div class="action"> 3 <button>button1</button> 4 </div> 5 <div class="action"> 6 <button>button2</button> 7 <input type="hidden" value="foo" data-name="foo"> 8 </div> 9 <div class="action"> 10 <button>button3</button> 11 <input type="hidden" value="foo" data-name="foo"> 12 <input type="hidden" value="example" data-name="val"> 13 </div> 14</div>

.action input[data-name]data-nameが同一でもvalueは違うことがあります。
また、今回はtype=hiddenにしていますが、textnumberも使用するので、動的に取得する必要があります。
最終的に取得する要素には同一classを付与して取得します。(例には入れてませんのでお気遣いなく)

その状況でまとめて、

JS

1document.querySelectorAll(".action button").forEach(function(element){ 2 element.addEventListener("click",function(e){ 3 /* if(element.querySelectorAll("input[type=hidden]").length > 0) */ 4 /* 連想配列を作りたい {data-name:value} */ 5 $.ajax({ 6 'url': '{% url "api" %}', 7 'method': 'POST', 8 'data':{ 9 'action':e.dataset.action, 10 'csrfmiddlewaretoken': document.querySelector("input[type=hidden]").value, 11 /* 連想配列があったときだけ挿入 もしくはない場合はダミーの連想配列を送信 */ 12 }, 13//省略

のようにまとめてボタンアクションを作成することはできるでしょうか?

要約すると
.action内のボタンが押され、
input[type=hidden]が存在するとき、
ajaxのdataにその値が存在すればそのデータをまとめて送りたいと言うことです
(実際は送信するデータは同じclassを付与して処理します(type=textとかも送信したいので))

可能であればdata-nameの値とvalueの値を連想配列のような形にできるとありがたいです(Djangoからその形でアクセスできるかは確認してません)

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

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

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

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

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

hentaiman

2020/11/05 20:40

重複’するdata-nameは必ず同じvalueを持つという隠れ前提条件あったりしますか? 質問文からだとそういった部分が不明瞭なため
sk-sora--ypi

2020/11/05 21:05 編集

異なるactionでdata-nameが重複する場合valueは異なる場合があります 同じaction内でdata-nameが被ることはありません 情報不足ですみません。
hentaiman

2020/11/05 21:20

押したボタンのclosestの配下のinputを送るだけいいんですか? 送信時のmethodとcontenttypeはなんですか? jqueryは$.ajaxを使う為だけに使っていて本当は使いたくないとか?
sk-sora--ypi

2020/11/05 22:12

そうですね、inputの値を送るだけです。 methodはPOST、contenttypeはjsonです。 まさにその通りで、Ajax自体あまり使った事がなかったのでひとまず簡単に使えるjqueryでやってるというところです。
yambejp

2020/11/06 00:37

button1は何も送るものがないですが、何を送る想定でしょうか?
sk-sora--ypi

2020/11/06 01:34

実際には別のところから送るデータがあるんですが、ボタン直下のデータ群はオプションのようなものです!
guest

回答3

0

こんな感じでやるとよいのでは?

投稿2020/11/06 01:17

yambejp

総合スコア116724

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

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

yambejp

2020/11/06 01:18

<script> window.addEventListener('DOMContentLoaded', ()=>{ document.querySelectorAll('button').forEach(x=>{ x.addEventListener('click',e=>{ const url="send.php"; const method="post"; const body=new FormData; x.closest('.action').querySelectorAll('input[data-name]').forEach(y=>{ body.append(y.dataset["name"],y.value); });; fetch(url,{method,body}).then(res=>res.text()).then(console.log); }); }); }); </script> <div class="buttons"> <div class="action"> <button>button1</button> </div> <div class="action"> <button>button2</button> <input type="hidden" value="foo" data-name="foo"> </div> <div class="action"> <button>button3</button> <input type="hidden" value="foo" data-name="foo"> <input type="hidden" value="example" data-name="val"> </div> </div>
sk-sora--ypi

2020/11/06 02:45

回答ありがとうございます。 試したことのないアクセスの方法だったので勉強になります。 試させていただきます、ありがとうございました。
guest

0

ベストアンサー

今のhtmlに対して回答
動くかどうか知らないけど、動かなかったら適当に直してください

htmlをあまり汚さずにjavascriptで何とかしたいという考えが見て取れます。(気のせいかもしれませんが)
個人的にはhtmlにあれこれ属性やクラス追加する事でjavascriptが簡単になるならhtmlに属性追加するなりformを複数作って分けるなりした方が良いとは思います。
jsかhtmlどちらかを複雑にする必要があるなら、技術のいらない方を複雑にした方が後々ソース読む時も楽です。

async function usosubmit(data){ const response = await fetch('https://localhost', {'method': 'post', body: JSON.stringify(data), headers:{ 'Content-Type': 'application/json' }, } ); } (()=>{ document.querySelectorAll('.action').forEach((elm)=>{ elm.querySelector('button').addEventListener('click', ()=>{ const sendData = {}; elm.querySelectorAll('input[type="hidden"]').forEach((input)=>{ sendData[input.dataset.name] = input.value; }) usosubmit(sendData); }) }) })()

投稿2020/11/05 23:50

編集2020/11/05 23:55
hentaiman

総合スコア6426

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

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

sk-sora--ypi

2020/11/06 02:33

回答ありがとうございます。 HTML汚しても構わないんですが、ボタンのアクションを一括で済ませたかったというのが本音ですw これ以上の変更がある場合はそれぞれのHTML&JSを作成してincludeする方が見栄えはいいのかなと感じましたw 記述していただいたプログラムも試させていただきます、回答ありがとうございました。
hentaiman

2020/11/06 02:44

じゃあclass名つけて送信対象Input特定出来るようにした方が楽ですよ <input type='button' class='data3'> <input type='hidden' class='data3' data-name='nm1' value='v1'> <input type='hidden' class='data3'<input type='hidden' class='data3'> で、押したボタンの持つclassと同じ[type='hidden']を選ぶだけなので それ以前にそのhiddenのinput群はinputタグにする必要があるのかすら検討しても良いと思いますよ。 FormDataである必要が無いのなら送信パラメータ群を最初からjavascriptの変数として最初から用意してしまえばいいのだし。 経緯と求める仕様を知らないのでその辺はこちらには判断つきませんが
sk-sora--ypi

2020/11/06 03:02 編集

最終的にはclassで取得する予定です(こちらについては記述済みですが) なのでボタンの親要素から子あるいは孫のclassからアクセスするという感じですね。 今回は例だったのと手法自体は知っていたので、省かせていただきました。 データはtype=text,numberなどユーザーが編集できるデータも含めるので、JS内での処理は不向きだと考えてます
hentaiman

2020/11/06 02:53

その辺の情報は全て適切な回答を得るには必須の情報なので、修正依頼でのやり取りも含めて質問文を修正する事をおすすめします。
sk-sora--ypi

2020/11/06 02:55

すみません、修正依頼きたら、質問文編集ですよね。 そのまま受け答えしてました、ありがとうございます。
guest

0

まだ考え中(と言うかそのHTMLすら未完成)ですが
こんな形でできそうな気がしてきました

JS

1document.querySelectorAll(".action button").forEach(function(element){ 2 element.addEventListener("click",function(e){ 3 if(element.parentElement.querySelectorAll("input[type=hidden]").length > 0){ 4 let data_set = {}; 5 element.parentElement.querySelectorAll("input[type=hidden]").forEach(function(e){ 6 data_set[e.dataset.name] = e.value; 7 }) 8 } 9 /* 連想配列を作りたい {data-name:value} */ 10 $.ajax({ 11 'url': 'api/', 12 'data':{ 13 /* 連想配列があったときだけ挿入 もしくはない場合はダミーの連想配列を送信 */ 14 if(data_set) 'data_set':data_set 15 }, 16//省略

実践していない事もあり、
できるかは不明かつもっとスマートな書き方があるかもしれませんので引き続き回答は募集させていただきます

投稿2020/11/05 18:29

sk-sora--ypi

総合スコア535

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問