jQuery不能从JavaScript对象中获得正确的下拉菜单值


jQuery can not get correct drop down menu values from a JavaScript object

我使用了这个例子https://stackoverflow.com/a/7601415/2118559

但是我不能让它正常工作

首先在外部php文件中有这样的数组$fetch_child_topic

Array
(
   [TopicName] => A
   [TopicUrl] => a
)
在外部PHP文件中,我将其转换为JSON
echo json_encode($fetch_child_topic, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS);

在"主文件"中,JavaScript看起来像这样{"TopicName":"A","TopicUrl":"a"},它的名字是data

这里尝试创建下拉菜单

 for (var text in data) {
    alert( 'text ' + text + ' data' + data );
    var val = data[text];
    $('<option/>').val(val).text(text).appendTo($('#first_subcat_id'))
 };

下拉菜单得到长列表的数字,如0,1,2…但我希望看到字母A

在警告中我看到

text 0 data{"TopicName":"A","TopicUrl":"a"}
text 1 data{"TopicName":"A","TopicUrl":"a"}
....
text 31 data{"TopicName":"A","TopicUrl":"a"}

有问题…但我不明白。

有什么想法吗?

编辑PHP文件中的

代码是这样的(代码稍微修改,只有一列)

从mysql获取数据

try {
$stmt = $db->prepare("SELECT TopicName FROM $table_name WHERE UpperTopicName = ?"); 
$stmt->execute( array($_POST['main_topic']) );
$fetch_child_topic = $stmt->fetchAll(PDO::FETCH_COLUMN);
}//try {
catch (PDOException $e){
echo "<br> Url DataBase Error: " .htmlspecialchars( $e->getMessage() , ENT_QUOTES, "UTF-8").'<br>';
}
catch (Exception $e) {
echo "  Url General Error: ".htmlspecialchars( $e->getMessage() ).'<br>';
}

echo json_encode($fetch_child_topic, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS);
<<p> 解决方案/strong>

从外部php文件(jquery变量的名称是data)获取数据后,执行

var data = $.parseJSON( data );
$.map( data, function( val, i ) {
$('<option/>').val(i).html(val).appendTo('#first_subcat_id');
});

在下拉菜单中得到字母A, B(如预期)

你的JavaScript在源代码中应该是这样的:

var data = {"TopicName":"A","TopicUrl":"a"};  // <== this is a javascript object literal assigned to the variable "data"
var text, val;
for (text in data) {
    val = data[text];
    alert( 'text ' + text + ', val' + val);
    $('<option/>').val(val).text(text).appendTo($('#first_subcat_id'));
}

如果你有像

这样的HTML
<select id="first_subcat_id"></select>

如果你的var data =行不是这样的结构,那么你的PHP有问题。

如果你的PHP文件正在生成整个文档,你可以将json_encode的输出嵌入到JavaScript中,就像这样。

<script type="text/javascript">
var data = <?= json_encode($fetch_child_topic, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>;
var text, val;
for (text in data) {
    val = data[text];
    alert( 'text ' + text + ', val' + val);
    $('<option/>').val(val).text(text).appendTo($('#first_subcat_id'));
}
</script>

我不认为fetchAll会返回数组的格式,你已经在你的例子的顶部显示。它返回一个由关联数组组成的数组大概是

Array
(
   [0] => Array
      (
         [TopicName] => A
         [TopicUrl] => a
      )
)

你需要去掉外部数组。所以就像这样做……这取决于SQL查询返回的实际输出。

$fetch_child_topic = $fetch_child_topic[0];