【问题标题】:Triggering an ajax call from a newly added row using jquery to the existing table使用 jquery 从新添加的行触发对现有表的 ajax 调用
【发布时间】:2015-12-12 16:17:48
【问题描述】:

我正在尝试在表格中查看学生详细信息。最初,我的表只有一行,其中存在 3 列 University、Department 和 Names。当我从大学下拉列表中选择一所大学时,会触发一个 ajax 调用,它会在部门下拉列表中填充该大学可用的相应部门。当我选择部门时,会触发第二个 ajax 调用,它会根据大学和部门下拉列表中的值填充名称下拉列表。

当我想搜索下一个学生时,我单击添加按钮,它会呈现下一行。但是,在这个新添加的行中,当我从下拉列表中选择一所大学时,不会触发 ajax 调用。

你能帮我实现吗?

学生.html

<div>
    <input type="button" value="Add" class="plusbtn1" />
</div>
<table border="0" width="80%" id="mytable">
    <tr>
        <td class="lightGrayedTD">University</td>
        <td class="lightGrayedTD">Department</td>
        <td class="lightGrayedTD">Student Names</td>
    </tr>
    <tr>
        <td>
            <select id="University">
                <option value="IT" >NYU</option>
                <option value="CSC">NYU Poly</option>
                <option value="EEE">Business School</option>
            </select>
        </td>
        <td>
            <select id="year">
                <option value=""> --Select Year-- </option>
            </select>
        </td>
        <td>
            <select id="names">
                <option value="" label=""> --Select Name-- </option>        
            </select>
        </td>
    </tr>
</table>

添加.js

$('.plusbtn1').click(function(){
    $('#mytable tr').last().after(
        '<tr>
            <td>
                <select id="University">
                    <option value="IT" >NYU</option>
                    <option value="CSC">NYU Poly</option>
                    <option value="EEE">Business School</option>
                </select>
            </td>
            <td>
                <select id="year">
                    <option value=""> --Select Year-- </option>
                </select>
            </td>
            <td>
                <select id="names">
                    <option value="" label=""> --Select Name-- </option>
            </select>
        </td>
    </tr>'
    );
});

ajax.js

//populating Department dropdown
$('#dept').change(function(event) {
    var dept = $('#dept :selected').text();       
    $.get("ajax.html", {
        deptName : dept
    }, function(response) {
        var select = $('#year');
        select.find('option').remove();
        $.each(response, function(index, value) {
            $('<option>').val(value).text(value).appendTo(select);
        });
    });
});

//populating names dropdown
$('#year').change(function(event) {
    var dept = $('#dept :selected').text();
    var year = $('#year :selected').text();      
    $.get("ajax1.html", {
        dept : dept,
        year : year
    }, function(response) {
        var select = $('#names');
        select.find('option').remove();
        $.each(response, function(index, value) {
            $('<option>').val(value).text(value).appendTo(select);
        });
    });
});

ajax 和 ajax1

@RequestMapping(value = "/ajax", method = RequestMethod.GET)
@ResponseBody   
public void ajax(HttpServletRequest request, HttpServletResponse  response) 
throws IOException {
    String uni = request.getParameter("universityName");
    List<Integer> list = new ArrayList<Integer>();
    list=cheDao1.retrievedept(uni);
    String json = new Gson().toJson(list);
    response.setContentType("application/json");
    response.getWriter().write(json);
}

@RequestMapping(value = "/ajax1", method = RequestMethod.GET)
@ResponseBody
public void ajax1(HttpServletRequest request, HttpServletResponse
    response) throws IOException {
    String uni = request.getParameter("universityName");
    String dept = request.getParameter("deptName");
    List<Integer> list = new ArrayList<Integer>();
    list=cheDao1.retrievenames(uni,dept );
    String json = new Gson().toJson(list);
    response.setContentType("application/json");
    response.getWriter().write(json);
}

【问题讨论】:

  • 请提供一个 JSFiddle,其中包含您的错误代码。如果我们无法重新创建错误,我们将无能为力。

标签: jquery html ajax


【解决方案1】:

这是一个常见问题解答。

  1. ID 必须是唯一的,所以使用类。
  2. 使用委托:

$("#mytable").on("change",".year",function{ .... } $("#mytable").on("change",".dept",function{ .... }

  1. 请注意,使用不同的参数调用一个服务器进程会使代码更简单 - 特别是如果您将上下文和 select 名称传递给它,但我没有更改主要逻辑。

WORKING DEMO

假设返回的数据在表单上

{"1":"dept1","2":"dept2","3":"dept3"}

$(function() { 
  var $clonerow = $("#mytable tr").clone();
  $('.plusbtn1').on("click",function() {
    $('#mytable tr').last().after($clonerow);
  });

  //populating Department dropdown
  $(document).on("change",'.University',function(event) {
    var $row = $(this).closest("tr");
    var uni = $(':selected',this).text();
    if (uni.indexOf("--") !=-1) return;
    $.ajax({
        url: "ajax.html",
        context: $row,
        data: {universityName:uni},
        success: function(response) {
          console.log($(this),response);
          var $select = $(this).find('.dept').empty();
          $('<option>').val("").text(" --Please select dept.--").appendTo($select);
          $.each(response, function(index, value) {
            $('<option>').val(value).text(value).appendTo($select);
          });
          $select.append(response);
        }  
    });
  }); 
  $(document).on("change",'.dept',function(event) {
    var $row = $(this).closest("tr");
    var uni = $row.find('.University :selected').text();
    if (uni.indexOf("--") !=-1) return; // please select
    var dept = $(':selected',this).text();
    if (dept.indexOf("--") !=-1) return;
    $.ajax({
        url: "ajax1.html",
        context: $row,
        data: {universityName: uni,
               deptName: dept},
        success: function(response) {
          console.log($(this),response);
          var $select = $(this).find('.year').empty();
          $('<option>').val("").text(" --Please select year.--").appendTo($select);
          $.each(response, function(index, value) {
            $('<option>').val(value).text(value).appendTo($select);
          });
         $select.append(response);
        }  
    });
  });

  //populating names dropdown
  $(document).on("change",'.year',function(event) {
    var $row = $(this).closest("tr");
    var uni = $row.find('.University :selected').text();
    if (uni.indexOf("--") !=-1) return; // please select
    var dept = $row.find('.dept :selected').text();
    if (dept.indexOf("--") !=-1) return; // please select
    var year = $(':selected',this).text();
    if (year.indexOf("--") !=-1) return; // please select
    $.ajax({
        url: "ajax2.html",
        context: $row,
        data:{universityName: uni,
              deptName: dept,
              year: year},
        success: function(response) {
          var $select = $(this).find('.names').empty();
          $('<option>').val("").text(" --Please select name --").appendTo($select);
          $.each(response, function(index, value) {
            $('<option>').val(value).text(value).appendTo($select);
          });
          $select.append(response);
        }  
    });
  });
});

【讨论】:

  • 请查看更新。我也在 html 中从 ID 更改为 CLASS。我无法测试,因为我没有可用的后端
  • 您好,非常感谢,触发了 ajax 调用,但不幸的是下拉列表没有被填充。响应函数中存在一些错误。你能帮我解决这个问题吗?
  • 没有控制台错误,是的,ajax.html 返回一个列表。我实际上用我的替换了您的响应功能,并且填充了下拉列表,我面临的问题是所有行的部门都根据我最后一行的大学进行了更新,因为我们正在使用类。我不知道如何使它成为特定行。你能帮帮我吗?
  • 您能否发布一个虚构但语法正确的 ajax.html 示例?
  • 代码应该是var $select = $row.find('.year'); $select.empty();
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2021-06-24
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多