【问题标题】:jQuery - clearing an HTML table before loading new data on ajax post successjQuery - 在加载 ajax 发布成功的新数据之前清除 HTML 表
【发布时间】:2015-05-09 03:04:50
【问题描述】:
<select id="group" name="group" onchange="generateList(this.value);">
     <?php foreach ($userGroup as $item) { ?>
        <option value="<?= $item->appsGroupId ?>"><?= $item->userGroupName ?></option>
     <?php } ?>
</select>

这是一个下拉列表和更改事件,我正在调用以下 javascript 函数,该函数将 ajax 发布到 PHP 函数

function generateList(id)
{
    var packages = "";
    var groupId = {"group_id" : id};

    $.ajax({
        type: "POST",
        data: groupId,
        url: "<?= base_url() ?>apps_users/seeGroup",
        dataType: "json",
        success: function(data) {
            packages = jQuery.parseJSON(data.packages);
            var vm = function() {
                var self = this;
                self.records = ko.observableArray(packages);
                $.each(self.records(), function(i, record){
                    record.packageId = record.packageId;
                    record.packageName = record.packageName;
                })
            }
            ko.applyBindings(new vm());
        },
        error: function(error) {
          alert(error.status + "<--and--> " + error.statusText);
        }
    });
};

并且在 ajax 发布成功时(调用返回 json 响应的 PHP 函数)。通过响应,我正在填充一个简单的 HTML 表格,如下所示:

<div class="container" id="assignPackage">
    <table class="table table-striped table-bordered" id="packageTable">
        <thead>
            <tr>
            <th>ID</th>
            <th>Package Name</th>
            </tr>
      </thead>
      <tbody data-bind="foreach: records">
          <tr>
            <td data-bind="text:packageId" > </td>
            <td data-bind="text:packageName"> </td>                
         </tr>
    </tbody>
  </table>    
<br><br>
</div>

现在的问题是,当我更改下拉列表时,表格正在填充新数据,但旧数据仍然存在。在下拉更改我想要的是清除 HTML 表中的旧数据并在 ajax 发布后加载新数据。

【问题讨论】:

  • 该表是用静态 HTML 代码编写的,还是在 ko.applyBindings() 函数中创建的?
  • 表是用静态 html 代码编写的,我在 ajax 发布成功后将数据绑定到表。如您所见,我正在使用数据绑定到每个 td @WorldFS

标签: javascript php jquery html ajax


【解决方案1】:

好的。以这种方式操作 DOM 并不是最好的方式:

  success: function(data) {
                 $('#assignPackage').hide();
                console.log(packages); console.log(group);           
                ko.applyBindings({ 
                        records : JSON.parse(data.packages)
                    });
                  $('#assignPackage').show();
            },

如果表格数据很长,我建议你使用动态插件(如 jquery 数据表)。

【讨论】:

  • 不工作。使用您的解决方案,整个 assignPackage div 在下拉更改时被隐藏。
【解决方案2】:

尝试在成功函数中调用ko.applyBindings之前放置$('#packageTable tr').remove();

function generateList(id)
{
    var groupId = {"group_id" : id};

    $.ajax({
        type: "POST",
        data: groupId,
        url: "<?= base_url() ?>apps_users/seeGroup",
        dataType: "json",
        success: function(data) {
            console.log(packages); console.log(group);

            $('#packageTable tr').remove();

            ko.applyBindings({ 
                    records : JSON.parse(data.packages)
                });
        },
        error: function(error) {
          alert(error.status + "<--and--> " + error.statusText);
        }
    });
};

【讨论】:

  • 不工作。使用您的解决方案,表格的 tr 在下拉更改时被删除。
【解决方案3】:

根据您的评论,我认为您需要做的就是在设置新值之前清除所有文本。

在调用 ko.applyBindings 之前调用它:

$("#packageTable").find("td").html('');

这将清除 table#packageTable 下所有 td 的所有文本(也包括所有子元素)。

【讨论】:

  • 它不会清除任何东西......如果我更改下拉菜单,旧数据仍然存在
  • 我在 jsfiddle 中尝试过,它可以工作......所以我想可能有一些函数也可以控制该表?这可能吗?
  • 你能提供jsfiddle链接吗??
  • 不,它不起作用....实际上我在下拉更改中调用了一个 javascript 函数,并且该函数正在启动一个 ajax 帖子,并且在 ajax 帖子成功时,我正在将数据绑定到带有来自 ajax 发布响应的数据的 html 表。这就是整个场景。
  • 好吧,我不可能在 jsfiddle 中进行 ajax 调用...您可以将我的 jsfiddle 中的 $(function(){}) 视为 ajax 响应,并且该代码将清除文本td。也许您可以发布 applyBindings 函数的代码,我认为该函数可能存在问题。
【解决方案4】:

您正在使用 Knockout 绑定 Json。

你能发布你的淘汰码吗?

或用于身体负荷

 $(document).ready(function(){
      var records = {packageId:'',packageName'' }; 
       ko.applyBindings(records);
 });

在 ajax Success 事件上只需使用

 records = JSON.parse(data.packages);

其中 records 是 javascript 的全局变量。

【讨论】:

  • 是的,我正在使用淘汰赛 js 来绑定 json,我已经在上面发布了我的整个代码
  • 发生这种情况是因为您多次使用 ko.applyBindings,即每当您更改下拉选项时。
  • 我已经编辑了 ajax 帖子的成功功能.....现在我该如何解决这个问题。我的意思是在哪里放置 ko.applyBindings 以获得我想要的结果。
  • 更改的代码请检查。使用文档就绪代码,即 Body Load。
  • jsfiddle.net/code_psycho/6aqfr701/1 这是我的全部代码。你现在能推荐我吗
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 2023-03-03
  • 2014-11-28
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 2014-04-22
相关资源
最近更新 更多