我正在尝试使用来自XML的数据填充jquery表单,其中XML具有将填充表单中的下拉列表的id,并且在选择id时将填充其他表单字段。顺便说一下,我不会使用PHP
我的XML
<XMLReview>
<plan>
<planNumber>773</planNumber>
<Area>Upper Missouri</Area>
<ID>MISSOURI-NUT</ID>
<Name>Missouri River</Name>
<code>10030101</code>
<County>Broadwater</County>
<Station_ID>M09MISSR05</Station_ID>
</plan>
<plan>
<planNumber>774</planNumber>
<Area>Columbia</Area>
<ID>FLAT-STILL-TPA-2013</ID>
<Name>Sheppard Creek</Name>
<Description>- 3A</Description>
<code>17010210</code>
<County>Flathead</County>
<Station_ID>C09SHEPC04</Station_ID>
</plan>
</XMLReview>
HTML
<form>
<input type="button" id="btnxml" value="XML" onclick="getXML()" />
ID <input type="text" name="ID" id="ID">
planNumber<input type="text" name="Name" id="planNumber">
area<input type="text" name="Area" id="Area">
Name: <input type="text" name="Name" id="Name">
Description: <input type="text" name="Description" id="Description">
Station ID <input type="text" name="Station_ID" id="Station_ID">
<label class="Code-label" for="code">HUC</label>
<select class="select_code" id="code" name="code" data-iconpos="left" data-icon="grid">
<option></option>
<option> 10010001</option>
<option> 10010002</option>
<option> 10020001</option>
</select>
<label class="county-label" for="County">County</label>
<select class="select_county" id="County" name="County" data-iconpos="left" data-icon="grid">
<option></option>
<option> Beaverhead </option>
<option> Big Horn </option>
<option> Blaine </option>
</select>
</form>
脚本
<script>
function getXML()
{
$.get("XMLReview.xml", function(data) {
$.ajax({
type: "GET",
url: "XMLReview.xml",
dataType: "xml",
success: function (xml) {
var select = $('#ID');
$(xml).find('plan').each(function () {
var ID = $(this).find('ID').text();
select.append("<option>" + ID + "</option>");
$("#ID").change(function () {
var selectedIndex = $('#ID option').index($('#ID option:selected'));
var newOpt = $(xml).find("values").eq(selectedIndex).find('value').each(function () {
var value = $(this).text();
});
});
}
});
alert(data);});
}
</script>
Unfortunataly这不起作用,我不知道为什么。任何人都可以帮助我
答案 0 :(得分:0)
一两件事:
您正在内联指定onclick事件:
<input type="button" id="btnxml" value="XML" onclick="getXML()" />
为什么不把所有东西放在一个地方 - 因为你已经使用了相当多的jQuery。只需将其添加到javascript块中,如下所示:
<input type="button" id="btnxml" value="XML" />
和
$('#btnxml').click(function() {
getXML();
});
不检查你的javascript / ajax代码,这种结构是错误的:
function getXML(){
$.get("XMLReview.xml", function(data) { <<======= REMOVE
$.ajax({
type: "GET",
url: "XMLReview.xml",
dataType: "xml",
success: function (xml) {
var select = $('#ID');
$(xml).find('plan').each(function () {
var ID = $(this).find('ID').text();
select.append("<option>" + ID + "</option>");
$("#ID").change(function () {
var selectedIndex = $('#ID option').index($('#ID option:selected'));
var newOpt = $(xml).find("values").eq(selectedIndex).find('value').each(function () {
var value = $(this).text();
}); //END $(xml).find.eq.find.each
}); //END #ID.change
}); //END $(xml).find.each
alert(data);
} //END AJAX.success fn
}); //END $.ajax
}); //END $.get <<=================================== REMOVE
}
它应该是这样的:
function getXML(){
$.ajax({
type: "GET",
url: "XMLReview.xml",
dataType: "xml",
success: function (xml) {
var select = $('#ID');
$(xml).find('plan').each(function () {
var ID = $(this).find('ID').text();
select.append("<option>" + ID + "</option>");
$("#ID").change(function () {
var selectedIndex = $('#ID option').index($('#ID option:selected'));
var newOpt = $(xml).find("values").eq(selectedIndex).find('value').each(function () {
var value = $(this).text();
}); //END $(xml).find.eq.find.each
}); //END #ID.change
}); //END $(xml).find.each
alert(data);
} //END AJAX.success fn
}); //END $.ajax
}
额外的$ .get()包装是不必要的。
请注意,$.ajax()
和$.get()
以及$.post()
执行相同的操作。您正在使用结构更为$.ajax()
的结构,这是(恕我直言)更容易保持正确。
$.get()
只需硬编码type="GET"
和$.post()
硬编码type="POST"
另外,我还没有对XML dataType做过多少工作,但我强烈怀疑xml
- 在你的AJAX代码块的成功函数中,在这种情况下:
success: function (xml) {
//post ajax code here, for eg.
alert(xml);
}
是否包含来自服务器端脚本的ECHOed / print / etc的变量?我不相信它是XML object
...
答案 1 :(得分:0)
好的,这里有很多东西,所以我认为一个新的实现比一系列更正更容易理解(我会尝试并注意你对JavaScript的理解可能需要一些工作的地方)一个demo。现在是JavaScript:
$('#btnxml').on('click', function() {
var select = $('#ID'),
xml = $($.parseXML($('#XMLData').text())),
plans = xml.find('plan');
plans.each(function () {
var ID = $(this).find('ID').text();
select.append("<option>" + ID + "</option>");
});
$("#ID").change(function () {
var selectedIndex = $('#ID option').index($('#ID option:selected')),
plan = $(plans[selectedIndex]);
$('#planNumber').val(plan.find('planNumber').text());
$('#Area').val(plan.find('Area').text());
$('#Name').val(plan.find('Name').text());
$('#Description').val(plan.find('Description').text());
$('#Station_ID').val(plan.find('Station_ID').text());
$('#code').val(plan.find('code').text());
$('#County').val(plan.find('County').text());
}).trigger('change');
});
然后是HTML
<script type='text/xml' id='XMLData'>
<XMLReview>
<plan>
<planNumber>773</planNumber>
<Area>Upper Missouri</Area>
<ID>MISSOURI-NUT</ID>
<Name>Missouri River</Name>
<code>10030101</code>
<County>Broadwater</County>
<Station_ID>M09MISSR05</Station_ID>
</plan>
<plan>
<planNumber>774</planNumber>
<Area>Columbia</Area>
<ID>FLAT-STILL-TPA-2013</ID>
<Name>Sheppard Creek</Name>
<Description>- 3A</Description>
<code>17010210</code>
<County>Flathead</County>
<Station_ID>C09SHEPC04</Station_ID>
</plan>
</XMLReview>
</script>
<form>
<input type="button" id="btnxml" value="XML" /><br/>
ID <select type="text" name="ID" id="ID"></select><br/>
planNumber<input type="text" name="Name" id="planNumber"><br/>
area<input type="text" name="Area" id="Area"><br/>
Name: <input type="text" name="Name" id="Name"><br/>
Description: <input type="text" name="Description" id="Description"><br/>
Station ID <input type="text" name="Station_ID" id="Station_ID"><br/>
<label class="Code-label" for="code">HUC</label>
<select class="select_code" id="code" name="code" data-iconpos="left" data-icon="grid">
<option></option>
<option>10010001</option>
<option>10010002</option>
<option>10020001</option>
<option>10030101</option>
<option>17010210</option>
</select>
<br/>
<label class="county-label" for="County">County</label>
<select class="select_county" id="County" name="County" data-iconpos="left" data-icon="grid">
<option></option>
<option>Beaverhead</option>
<option>Big Horn</option>
<option>Blaine</option>
</select>
</form>
首先,我进行了这些更改,以便在JSFiddle中更容易演示,但它们不一定与最终代码匹配:
$.get()
中。click
绑定到$('#btnxml')
(这更干净,但也因为JSFiddle不喜欢指向命名函数的onclick属性),这不是严格错误它只是清洁剂。现在进行实质性改变:
$('#ID')
选择器(原来是<input type='text'>
不正确,在此代码中我更新为<select>
,然后在填充之后,您正在尝试绑定change
事件处理程序。您在彼此内部执行了这些步骤,并将它们分离出来。另外,以编程方式更改<select>
不会自动触发更改事件,所以我最后添加了.trigger('change')
。input
。您可以使用.childNodes
属性,但这将包括TextNodes
用于XML节点之间的所有空白区域,而不是尝试过滤它们,我认为单独映射它们会更清晰。如果您的HTML和XML不断更新,这可能对您不起作用,但是我要做的下一点可能会阻止完全自动化的方法。<select>
元素包含一组没有value
属性的选项,并且您尝试将<select>
元素的.val()
设置为其中一个元素的字符串<option>
在该元素内部,它将做正确的事情。但是,如果没有与该值匹配的元素,则它将以静默方式传递它。您的XML包含未在HTML中显示的代码和县值。我添加了缺少的代码值以向您显示它正在工作,但我没有将它们添加到县<select>
。如果您知道所有可能的代码和县,并且您可以更新您的HTML,那么这不会是一个问题,如果您希望在刚刚选择旧值时添加新值,那么您的代码将变得有点棘手。