初心者で難しい事解りませがよろしくお願いします。クリックイベントで<tbody>にtextnode <td><tr>を追加してテーブルを作成しました。想定していた数行が表示された、その下に同じ数行が表示されてしまいます。ちなみにチェックボックスをすべて外した時に出すアラートも二回出てしまいます。一回にしたいが#修正箇所が解りません。 javascript
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="UTF-8"/> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="stylesheet" href="style1.css" type="text/css"/> </head> <body> <div id="container"> <header> </header> <main> <form name="form"> <input type="button" id = "btn1" class="btn" value="挿入"></input> <input type="button" id = "btn2" class="btn" value="削除" disabled="true"></input> <input type="checkbox" value="all" name="all" checked>ALL</input><br> <input type="checkbox" value="scott" name="maker">SCOTT</input><br> <input type="checkbox" value="anchor" name="maker">ANCHOR</input><br> <input type="checkbox" value="kouta" name="maker">KOUTA</input><br> <input type="checkbox" value="pinarello" name="maker">PINARELLO</input><br> <input type="checkbox" value="bianchi" name="maker">BIANCHI</input><br> <input type="checkbox" value="trek" name="maker">TREK</input><br> <input type="checkbox" value="look" name="maker">LOOK</input><br> <input type="checkbox" value="ridley" name="maker">RIDLEY</input> </form> <table> <thead> <th>バイク名</th> <th>メーカー</th> <th>フレーム</th> <th>コンポ</th> <th>価格</th> </thead> <tbody> </tbody> </table> </main> <footer>©タコナキンジ</footer> </div> <script type="text/javascript" src="roadbike.js"></script> </body> </html> <script type="text/javascript" src="roadbike.js"></script> </body> </html>JS
window.onload = function(){
var all = document.form.all ;
var maker = document.form.maker ;
var allCheck = function(){
if( all.checked ){
for( var i = 0 ; i < maker.length ; i++){
maker[i].checked = false ;
}
}
}
var makerCheck = function(){
var j = 0 ;
for( var i = 0 ; i < maker.length ; i++){ if(maker[i].checked){
all.checked = false ;
j++ ;
}
}
if( j == 8 ){
all.checked = true ;
for( var i = 0 ; i < maker.length ; i++){
maker[i].checked = false ;
}
}
}
all.addEventListener( 'change' , allCheck , false ) ;
for( var i = 0 ; i < maker.length ; i++ ){maker[i].addEventListener( 'change' ,makerCheck , false ) ;
}
}//window.onload
var getJson = function(){
var all = document.form.all ;
var maker = document.form.maker ;
var j = 0 ;
for( var i = 0 ; i < maker.length ; i++){
if( maker[i].checked ){
continue ;
}else if( all.checked ){
continue ;
}
j++ ;
}
if( j == maker.length ){
alert( '何も選択されていません。' ) ;
}
else{
btn1.disabled = true ;
btn2.disabled = false ;
var xhr = new XMLHttpRequest ;
xhr.onreadystatechange = function(){
if ( xhr.readyState === 4 && xhr.status === 200 ){
var data = JSON.parse(xhr.responseText) ;
var tbody = document.getElementsByTagName( 'tbody' );
var flags = [] ;
for( var j = 0 ; j < data.length ; j++ ){
if( all.checked ){
flags[j] = false ;
}
else{
for( var i = 0 ; i < maker.length ; i++){
if( !maker[i].checked && maker[i].value == data[j]['maker']){
flags[j] = true ;
break ;
}
}
if( flags[j] !== true ){
flags[j] = false ;
}
}
if( flags[j] == true ){
continue ;
}
var tr = document.createElement( 'tr' ) ;
for( var key in data[j] ){
var textnode = document.createTextNode( data[j][key] ) ;
var td = document.createElement( 'td' ) ;
td.appendChild( textnode ) ;
tr.appendChild( td ) ;
}
tbody[0].appendChild( tr ) ;
}//行の挿入
}else{
}
}//onreadystatechange
xhr.open( 'GET' , 'data.json ') ;
xhr.send() ;
}//else
}//getJson
var btn1 = document.getElementById( 'btn1' ) ;
btn1.addEventListener( 'click' , getJson , false ) ;
var removeJson = function(){
btn2.disabled = true ;
btn1.disabled = false ;
var tbody = document.getElementsByTagName( 'tbody' ) ;
while( tbody[0].firstChild ){ tbody[0].removeChild( tbody[0].firstChild ) ;
}
for( var i = 0 ; i < maker.length ; i++){
maker[i].checked = false ;
}
}
var btn2 = document.getElementById( 'btn2' ) ;
btn2.addEventListener( 'click' , removeJson , false ) ;
CSS
body {
background : #FFFFFF;
height : 100vh ;
}
header {
background : #0ff ;
width: 100% ;
height : 100px ;
}
#container{
min-height : calc(100vh-32px) ;
}
main {
width : 100% ;
background : #ddd ;
}
table {
border-collapse : collapse ;
}
th , td {
border : solid #000 2px ;
width : 100vw ;
}
.btn{
font-size : 15px ;
}
footer {
height : 32px ;
background : pink ;
}
補足情報(FW/ツールのバージョンなど)
JSON
[
{
"name" : "foil30.1" ,
"maker" : "scott" ,
"frame" : "carbon" ,
"component" : "105" ,
"price" : "\360,000"
},
{
"name" : "addict rc10" ,
"maker" : "scott" ,
"frame" : "carbon" ,
"component" : "dura-ace" ,
"price" : "\569,000"
},
{
"name" : "speedstar 10" ,
"maker" : "scott" ,
"frame" : "aluminium" ,
"component" : "105" ,
"price" : "\149,000"
},
{
"name" : "rs8 elite" ,
"maker" : "anchor" ,
"frame" : "carbon" ,
"component" : "ultegra" ,
"price" : "\525,000"
},
{
"name" : "rnc3 equipe" ,
"maker" : "anchor" ,
"frame" : "Cr&Mo" ,
"component" : "105" ,
"price" : "\195,000"
},
{
"name" : "kouger" ,
"maker" : "kouta" ,
"frame" : "carbon" ,
"component" : "ultegra" ,
"price" : "\517,000"
},
{
"name" : "prince" ,
"maker" : "pinarello" ,
"frame" : "carbon" ,
"component" : "ultegra" ,
"price" : "\465,000"
},
{
"name" : "angliru" ,
"maker" : "pinarello" ,
"frame" : "carbon" ,
"component" : "105" ,
"price" : "\243,000"
},
{
"name" : "prima" ,
"maker" : "pinarello" ,
"frame" : "aluminium" ,
"component" : "sora" ,
"price" : "\149,000"
},
{
"name" : "aria" ,
"maker" : "bianchi" ,
"frame" : "carbon" ,
"component" : "105" ,
"price" : "\278,000"
},
{
"name" : "impulso" ,
"maker" : "bianchi" ,
"frame" : "aluminium" ,
"component" : "tiagra" ,
"price" : "\147,000"
},
{
"name" : "madone 9.0" ,
"maker" : "trek" ,
"frame" : "carbon" ,
"component" : "altegra" ,
"price" : "\510,000"
},
{
"name" : "emonda sl7" ,
"maker" : "trek" ,
"frame" : "carbon" ,
"component" : "ultegra" ,
"price" : "\482,000"
},
{
"name" : "765 optimum" ,
"maker" : "look" ,
"frame" : "carbon" ,
"component" : "ultegra" ,
"price" : "\349,800"
},
{
"name" : "fenix c" ,
"maker" : "ridley" ,
"frame" : "carbon" ,
"component" : "105" ,
"price" : "\260,000"
}
]
補足 作成、閲覧はAndroidスマホで行っています。
回答2件
あなたの回答
tips
プレビュー