我已从源代码实现此代码。但是当我尝试使用firebug时,它捕获了这个错误:TypeError:response [idx]未定义。我试图在这里寻找类似的主题但是没有一个可以帮助我解决这个问题。因此,我希望有经验的用户能够查看这些代码行以找出问题所在。
此来源的作者尚未回复我的问题。所以我不知道在哪里寻找答案。
目的: 这使用json响应ajax成功来呈现区选项列表。这就是我的理解,但从技术上讲,我不知道为什么会出现这种错误?也许作者错误地遗漏了某些东西?
这是我的ajax功能:
function sortSubcat(str)
{
if (str=="")
{
document.getElementById("subcat").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var response = JSON.parse(xmlhttp.responseText);
var selectElement = document.getElementById('subcat');
for(var i = 0; i < response.length; i++)
{
var idx = i+1;
selectElement.options[idx] = new Option(response[idx].value, response[idx].name, false, false);
}
}
}
xmlhttp.open("GET","/member/sortsubcat.php?q="+str,true);
xmlhttp.send();
}
这是php文件:
<?php
require_once("../configs/dbconnect.php");
if (!empty($_GET['q'])){
$q = basename($_GET['q']);
$sql="SELECT * FROM subcat WHERE maincat=:q";
$result = $conn->prepare($sql);
$result->bindParam(':q', $q);
$result->execute();
$returned_string = '[';
foreach($result as $row)
{
//echo "<option value='$row[name]'>$row[name]</option>";
$returned_string .= '{"name" : "'. $row['name']. '", "value" : "'. $row['name']. '"},';
}
$returned_string = substr($returned_string, 0, -1); //remove trailing ','
$returned_string .= ']';
header("Content-type: application/json");
echo $returned_string;
exit;
}
else{
echo "<option value=''>Please select a district</option>";
}
$conn=null;
?>
以下是json的回复:
[{"name" : "District A", "value" : "District A"},{"name" : "District B", "value" : "District B"}]
答案 0 :(得分:1)
问题在于此代码:
for(var i = 0; i < response.length; i++)
{
var idx = i+1;
selectElement.options[idx] = new Option(response[idx].value, response[idx].name, false, false);
}
您在响应数组中只有两个项目。但是在for循环中,你有
var idx = i+1;
所以当i = 1时; idx将是2;
但是在索引2中,响应中没有可用的数据。这就是为什么它的&#39;给你错误。在您尝试访问undefined的value属性时。
您已删除idx = i+1
并直接引用i。
答案 1 :(得分:0)
您在此循环中访问数组的末尾:
for(var i = 0; i < response.length; i++)
{
var idx = i+1;
selectElement.options[idx] = new Option(response[idx].value, response[idx].name, false, false);
}
i
具有正确的循环索引值,从0
开始并经过length - 1
。你完全不想要idx
(除非我假设你是故意跳过第一个selectElement
选项;它是&#34;空白&#34;或者类似的),所以:
for(var i = 0; i < response.length; i++)
{
// vvv--- skip the first select option, so +1 here
selectElement.options[i+1] = new Option(response[i].value, response[i].name, false, false);
// But use i for accessing the array ------------^------------------^
}