用XML文件填充下拉菜单。

5
我有以下代码,它正在加载一个XML文件来填充下拉菜单。现在值等于选项文本,但我想让值等于来自同一XML文件的某个数字。有人可以告诉我如何格式化XML文件以实现此目的,并添加什么代码使该值出现在HTML代码中。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" media="all" href="style.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<title>Using jQuery and XML to populate a drop-down box demo</title>
<script>
$(document).ready(function(){
$.ajax({
type: "GET",
url: "make.xml",
dataType: "xml",
success: function(xml) {
var select = $('#mySelect');

$(xml).find('dropdown').each(function(){
$(this).find('make').each(function(){
var value = $(this).text();
select.append("<option class='ddindent' value='"+ value +"'>"+value+"</option>");
});
});
select.children(":first").text("Select Make").attr("selected",true);
} //sucess close
}); 
}); 
</script>
</head>
<body>
<div id="page-wrap">
<select id="mySelect">
<option>loading</option>
</select>
</div>
</body>
</html>

这是XML文件。
<?xml version="1.0" encoding="iso-8859-1"?>

<dropdown>
<make>Acura</make>
<make>Aston Martin</make>
<make>Audi</make>
<make>Bently</make>
<make>BMW</make>
<make>Buick</make>
<make>Cadillac</make>
<make>Chevrolet</make>
<make>Chrylser</make>
<make>Dodge</make>
<make>Eagle</make>
<make>Ferrari</make>
<make>Ford</make>
<make>Geo</make>
<make>GMC</make>
<make>Honda</make>
<make>Hummer</make>
<make>Hyundai</make>
<make>Infiniti</make>
<make>Isuzu</make>
<make>Jaguar</make>
<make>Jeep</make>
</dropdown>  

你的数字在 XML 文件中的哪里? - pixeline
这是我的问题,我该如何格式化它? - user357034
2个回答

7

首先,在您的xml文件中放置数字。 如果它们与下拉项相关,则建议作为属性。

例如:

<dropdown>
    <make value="1">Acura</make>
    <make value="4">Aston Martin</make>
    <make value="34">Audi</make>
...
</dropdown>

然后在您的jQuery循环中:

$(xml).find('dropdown').each(function(){
     $(this).find('make').each(function(){
          var value = $(this).attr('value');
          var label = $(this).text();
          select.append("<option class='ddindent' value='"+ value +"'>"+label+"</option>");
     });
});

请注意,您可以通过以下方式简化和加速您的jquery(未经测试):

请注意,您可以通过以下方式简化和加速您的jquery(未经测试):

$('make', xml).each(function(){
              var value = $(this).attr('value');
              var label = $(this).text();
              select.append("<option class='ddindent' value='"+ value +"'>"+label+"</option>");
    });

更新

为了获得另一个重要的性能提升,请只执行一个append(),而不是像你拥有“make”节点一样执行多个append()。

var optionsHtml = new Array();
    $('make', xml).each(function(){
                  var value = $(this).attr('value');
                  var label = $(this).text();
optionsHtml.push( "<option class='ddindent' value='"+ value +"'>"+label+"</option>");

        });
optionsHtml = optionsHtml.join('');
select.append(optionsHtml);

1
非常愉快。还有一个性能技巧:您在每个each()迭代中都会附加一个节点。由于您有许多节点,这在性能方面相当昂贵。建议您将html存储在数组中,在每个each之后连接数组并进行附加操作。 - pixeline
更新了答案,并附上了实现这种性能提升的代码。 - pixeline
是的,我能看出这样做会更好。比如说,在这种情况下,不需要22个附加操作(每个循环一个),只需要一个即可。因此,我的理解是每次“获取”节点时,它都将其放入数组中,然后在循环结束后,将完整的数组附加到目标中。太棒了! - user357034
唯一的问题是我无法让更新后的代码工作,也许我把它放错了地方?在这一行出现语法错误 optionsHtml[] = "<option class='ddindent' value='"+ value +"'>"+label+"</option>"; - user357034
1
我的错误:我混淆了PHP和JavaScript的语法。optionsHtml.push('<option>...'); 应该更好地工作。数组声明也应该像这样:var x = new Array(); - pixeline
工作得很好,感谢您所提供的教育。我还有另一个问题,但我会发布一个新的问题。再次感谢! - user357034

0

不太确定您的问题是什么,但您可以有两种选择。

在JavaScript中设置一个计数变量,并在每次添加选项时递增此变量。使用该数字作为“值”,它将对应于XML中的“点”。

或者在XML中像这样处理每个“制造商”:

<make>
    <id>1</id>
    <name>Ford</name>
</make>

并使用ID。

不确定您真正想要什么,所以不知道这是否有帮助。


我曾考虑过这个问题,但是数值不是连续的。例如,Dodge 可能有一个值为 300,而 Audi 可能只有一个值为 13,因此必须从 XML 文件中为每个品牌提取值。 - user357034
我仍然不确定你想要做什么。你是在不断更新和编辑XML吗? - Thomas Clayson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接