teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード追記、data-\* 属性に言及

2016/10/26 16:29

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,11 +1,57 @@
1
+ ### label 要素
2
+
1
3
  label要素を使う方法が良いと思います。
2
4
 
5
+ - [ラベル文を参照する - JSFiddle](https://jsfiddle.net/2ppu4vze/)
6
+
3
7
  ```HTML
8
+ <form id="phone">
4
- <label><input type="checkbox" name="mobile" value = "500">android</label>
9
+ <label><input type="checkbox" name="mobile" value = "500">Android</label>
10
+ <label><input type="checkbox" name="mobile" value = "800">iPhone</label>
11
+ <input type="submit" value="total">
12
+ </form>
13
+ <pre id="output"></pre>
14
+
5
15
  <script>
6
16
  'use strict';
17
+ (function () {
18
+ function handleSubmit (event) {
19
+ var inputs = event.target.elements['mobile'],
20
+ price = 0,
21
+ names = [];
22
+
23
+ for (var i = 0, l = inputs.length, input; i < l; ++i) {
24
+ input = inputs[i];
25
+ if (input.checked) {
26
+ price += Number(input.value);
27
+ names.push(input.labels[0].textContent);
28
+ }
29
+ }
30
+
31
+ event.preventDefault();
7
- console.log(document.querySelector('input').labels[0].lastChild.data);
32
+ input.ownerDocument.getElementById('output').textContent = [
33
+ '選択された商品は' + (names.length ? names : 'ない') + 'ですね。',
34
+ '合計は' + price + '円になります。'
35
+ ].join('\n');
36
+ }
37
+
38
+ function main () {
39
+ this.document.getElementById('phone').addEventListener('submit', handleSubmit, false);
40
+ }
41
+
42
+ main.call(this);
43
+ }.call(this));
8
44
  </script>
9
45
  ```
10
46
 
47
+ ### 代替案
48
+
49
+ 「checkbox に 2つのvalue を持たせる」という要件だけ考えると次の方法も考えられます。
50
+
51
+ - data-* 属性
52
+ - value属性値にCSV形式で格納する (ex: `500,Android`)
53
+ - value属性値にJSON形式(配列)で格納する (ex: `[500,"Android"]`)
54
+
55
+ 実質的にはラベル文と同じ文字列を格納する事になるので、label要素をお勧めしています。
56
+
11
57
  Re: margutta さん