从XML填充jquery表单

时间:2013-09-20 17:16:26

标签: javascript jquery xml xml-parsing

我正在尝试使用来自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这不起作用,我不知道为什么。任何人都可以帮助我

2 个答案:

答案 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中更容易演示,但它们不一定与最终代码匹配:

  • 我伪造了AJAX请求(这里的另一个答案为您提供了如何正确使用jQuery优秀的AJAX辅助方法的清晰解释)。将此答案推送到您的答案中时,您可以假设所有这些都包含在远程提取XML的$.get()中。
  • 我还将JavaScript中处理的click绑定到$('#btnxml')(这更干净,但也因为JSFiddle不喜欢指向命名函数的onclick属性),这不是严格错误它只是清洁剂。

现在进行实质性改变:

  • 你真的想做两件事,填充你的$('#ID')选择器(原来是<input type='text'>不正确,在此代码中我更新为<select>,然后在填充之后,您正在尝试绑定change事件处理程序。您在彼此内部执行了这些步骤,并将它们分离出来。另外,以编程方式更改<select>不会自动触发更改事件,所以我最后添加了.trigger('change')
  • 您似乎还在尝试获取所选计划的子节点,并使用相同的名称更新相应的input。您可以使用.childNodes属性,但这将包括TextNodes用于XML节点之间的所有空白区域,而不是尝试过滤它们,我认为单独映射它们会更清晰。如果您的HTML和XML不断更新,这可能对您不起作用,但是我要做的下一点可能会阻止完全自动化的方法。
  • 根据值选择选项会带来一些挑战。 jQuery很聪明。如果您的<select>元素包含一组没有value属性的选项,并且您尝试将<select>元素的.val()设置为其中一个元素的字符串<option>在该元素内部,它将做正确的事情。但是,如果没有与该值匹配的元素,则它将以静默方式传递它。您的XML包含未在HTML中显示的代码和县值。我添加了缺少的代码值以向您显示它正在工作,但我没有将它们添加到县<select>。如果您知道所有可能的代码和县,并且您可以更新您的HTML,那么这不会是一个问题,如果您希望在刚刚选择旧值时添加新值,那么您的代码将变得有点棘手。