0

以下に貼り付けるコードがいくつかあります。コードが行うことは、XML ファイルの内容を読み取り、それを JSON に入れることです。次に、JSON からのデータを HTML テーブルに入れます。1つのことを除いて、すべて正常に動作します。テーブルが作成されると、最初の行 (列見出しの後) は、各セルで常に「未定義」として表示されます。私はこのコードを調べましたが、それを引き起こす原因は何も見つかりませんでしたが、私は専門家ではなく、新鮮な目が役立つと確信しています。

<html>
<head>
<h1><u>USA State Information</u></h1>
</head>
<body>
<p><b>Please select an area of the USA in the dropdown list below.</b></p>
<p><select name="area" onchange="findXML(this.value)">

<?php
//set directory and open it
$xmldir = 'XML';
$dir = opendir($xmldir);

//create array and read through files in directory
$xmlfiles = array();
while ($file = readdir($dir))
{
    //if the first char is not '.' then add to array
    if (substr($file,-1,1) !== ".")
    {
        $xmlfiles[] = $file;
    }
    else
    {
        //do nothing
    }
}

echo '<option value="select">Select</option>';

foreach($xmlfiles as $area){ 
    echo '<option value="'.$area.'">'.$area.'</option>'; 
}
echo '</select>';

//close directory
closedir($dir);
?>
</p>
<p>
<div id=tbl>
</div>
<table id="elems" border="1" cellspacing="1" cellpadding="5">
<tr>
<td><b>Name</></td>
<td><b>Number</></td>
<td><b>Joined</></td>
<td><b>Population</></td>
</tr>
</table>
<script>
function findXML($area) {
$area = "XML/" + $area;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET",$area,true);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
//find number of elements in the XML file
$length = xmlDoc.getElementsByTagName("name").length;

var JSONObject = [{}];
for (i=0; i!=$length; i++){
    //do something

    JSONObject.push(
    { "name":(xmlDoc.getElementsByTagName("name")[i].childNodes[0].nodeValue),
    "number":(xmlDoc.getElementsByTagName("number")[i].childNodes[0].nodeValue), 
    "joined":(xmlDoc.getElementsByTagName("joined")[i].childNodes[0].nodeValue),
    "population":(xmlDoc.getElementsByTagName("population")[i].childNodes[0].nodeValue) }
    );
}

r=1;
i=0;
for (i=0; i!=($length); i++){

    var tblr = document.getElementById("elems").insertRow(r);
    var cell1= tblr.insertCell(0);
    var cell2= tblr.insertCell(1);
    var cell3= tblr.insertCell(2);
    var cell4= tblr.insertCell(3);
    cell1.innerHTML = JSONObject[i].name;
    cell2.innerHTML = JSONObject[i].number;
    cell3.innerHTML = JSONObject[i].joined;
    cell4.innerHTML = JSONObject[i].population;
    r++;
}

}
</script>
</p>

</table>
</body>
</html>
4

2 に答える 2

2

私は問題を見つけたと思います:

var JSONObject = [{}];

する必要があります

var JSONObject = [];

これにより問題が修正される理由はJSONObject、最初のインデックスから始まる配列を反復処理しているためです。これは問題ありませんが、配列を初期化した方法では、最初のインデックスに空のオブジェクトが与えられます。プロパティnamenumberなどを取得しようとすると、空のオブジェクトにはそれらがなく、未定義として返されます。

于 2013-01-31T22:29:07.287 に答える
0

やってみました:

for(i = 1 ; i!=($ length); i ++){

インデックスが0ではなく1から始まっている可能性があります

于 2013-01-31T22:27:44.430 に答える