html5から使用できるようになったdatalistタグによるサジェストリストですが、optionタグに仕込んだ自作の属性fidをgetAttributeできません。
select タグを使った場合はvalue部分とテキスト部分に分けられたので見せたくない情報はvalue=に入れればよかったんですがdatalistの場合はそれができないので自分で属性を作ってgetAttributeで取得、と思ってやったのですが得られません。
ご存知のかた、よろしくお願い致します。
ブラウザはchrome バージョン 44.0.2403.125 (64-bit)
<html> <head> <meta charset="utf-8"> <script type="text/javascript"> function show() { // var fid = document.getElementById("fruits").getAttribute("fid"); // var fid = document.getElementById("keywords").childNodes[0].getAttribute("fid"); // var fid = document.querySelector("fid"); // fidの値を取得したいがうまくいかない・・ alert(fid); } </script> </head> <body> <input type="search" autocomplete="on" list="keywords" id="fruits"> <datalist id="keywords"> <option fid="1" value="みかん"> <option fid="2" value="ぶどう"> <option fid="3" value="ばなな"> </datalist> <input type="button" onclick="show();" value="表示"> </body> </html>
補足:用途はたくさんある候補からひとつ選ばせ、たとえばそれを削除したり、何かしらの登録をやるといった具合です。その際、DB上でユニークなのはidだけという設定です(no や nameは重複の余地を残している)。
test.php
1<?php 2$db = new PDO("sqlite:test.db"); 3/* 初期設定 */ 4$sql = "CREATE TABLE IF NOT EXISTS fruits (id INTEGER PRIMARY KEY AUTOINCREMENT, no INTEGER, name TEXT)"; 5$stmt = $db->prepare($sql); 6$stmt->execute(); 7$stmt = $db->query("SELECT COUNT(*) FROM fruits"); 8/* サンプルデータ投入 */ 9$count = $stmt->fetchColumn(); 10if ($count == 0) { 11 $fruits = ["みかん", "ぶどう", "ばなな"]; 12 $i = 1; 13 $db->beginTransaction(); 14 foreach ($fruits as $fruit) { 15 $db->exec("INSERT INTO fruits (no, name) VALUES ($i, '$fruit')"); 16 $i++; 17 } 18 $db->commit(); 19} 20/* 初期表示 */ 21if (isset($_GET["func"]) && $_GET["func"] == "init") { 22 $stmt = $db->query("SELECT * FROM fruits ORDER BY no"); 23 $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 24 $json = json_encode($rows); 25 echo $json; 26 $db = null; 27 exit(); 28/* たとえば削除 */ 29} else if (isset($_POST["func"]) && $_POST["func"] == "postDB") { 30 $id = $_POST['id']; 31 $no = $_POST['no']; 32 $sql = "DELETE FROM fruits WHERE no = $no"; 33 $stmt = $db->prepare($sql); 34 $stmt->execute(); 35} 36$db = null; 37?> 38<html> 39<head> 40<meta charset="utf-8"> 41<script type="text/javascript"> 42 43Ajax = new XMLHttpRequest(); 44 45window.onload = init(); 46 47function init() { 48 var url = "test.php" + "?dummy=" + new Date().getTime() + "&func=" + "init"; 49 Ajax.open("GET", url, true); 50 Ajax.send(null); 51 Ajax.onreadystatechange = function() { 52 if (Ajax.readyState == 4 && Ajax.status == 200) { 53 var rows = JSON.parse(Ajax.responseText); 54 var out = "<input type='search' autocomplete='on' list='keywords' id='fruits'>"; 55 out += "<datalist id='keywords'>"; 56 /* 本来このなかにrows[i]['id']があって、それを拾えるようにしたいが表示させたくはない */ 57 for (var i in rows) { 58 out += "<option value='"+rows[i]['no']+"/"+rows[i]['name']+"'>"; 59 } 60 out += "</datalist>"; 61 out += "<input type='button' onclick='postDB();' value='送信'>"; 62 document.getElementById("result").innerHTML = out; 63 } 64 } 65} 66/* idをDBへ投げる */ 67function postDB() { 68 var name = document.getElementById('fruits').value; 69 var i = name.indexOf("/"); 70 var no = name.substr(0,i); 71 // var id = "" 本来これを取得して投げたいができないので代わりにほかのものを投げる 72 var id = 0; // エラー回避のためのダミー 73 var url = "test.php"; 74 Ajax.open("POST", url, true); 75 Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 76 Ajax.send("func=" + "postDB" + "&id=" + id + "&no=" + no); 77 Ajax.onreadystatechange = function() { 78 if (Ajax.readyState == 4 && Ajax.status == 200) { 79 init(); 80 } 81 } 82} 83</script> 84</head> 85<body> 86<div id="result"></div> 87</body> 88</html> 89

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/17 14:11
2015/08/17 14:33
2015/08/17 14:55
2015/08/17 16:33 編集
2015/08/17 23:38