【问题标题】:Jquery can't access Ajax-created ElementsJquery 无法访问 Ajax 创建的元素
【发布时间】:2017-05-24 18:41:56
【问题描述】:

我有一个

  1. html表格(里面有tbody)

  2. jquery function1: $.ajax - 从数据库中获取数据并用数据行填充表(每一行都是tr with tds)

  3. jquery function2:统计表的行数 ( $('tbody').find('tr').length )

所以 2 可以正常工作,用行填充 1,但 3 不起作用(尽管它适用于“手动”填充的表格,例如,不适用于 ajax 填充的表格)。

注意:当我 console.log($('table')[0]) 返回时:

<table>
<tbody> 
<tr> <td>1</td> </tr>
<tr> <td>2</td> </tr>**
</tbody> 
</table>

当 console.log($('tbody')[0]) 返回时:

<tbody></tbody>

(里面看不到 trs!)

我知道这与 Ajax 动态内容有关。

  • 我应该怎么做才能使 (3) 起作用?
  • 为什么console.log 显示“table”的trs,而不显示“tbody”的trs?
  • 我应该阅读什么来理解这一切而不是质疑它 来过这里吗?:)

提前谢谢大家!

PS。 Ajax 调用(真实):

            function load_tours () {

                    $.ajax({

                        type: 'get',
                        url: 'load_tours',
                        data: $('#search-form').serialize(),
                        success:function (data) {

                            $('#tours_table').empty();

                            tableCreate(data);

                            }           
                        });

        };

        function tableCreate (data) {

            $.each( data, function (i, item) {

            var tr = $('<tr>').append(
                $('<td>').text(item.id),
                $('<td>').text(item.name),
                $('<td>').text(item.lastName);
             $('#tours_table').append(tr);

            });
        };

行数计数器:

rowCount = $("#tours_table").find('tr').length;

这里的 PPS 是(临时)真实页面:

http://81b29c97.ngrok.io/test2 (HTML) http://81b29c97.ngrok.io/js/tours_load_filter.js (JS 1) http://81b29c97.ngrok.io/js/sort_paginate.js (JS 2)

【问题讨论】:

  • 你能把 Ajax 调用连同你的函数和 HTML 一起发布吗?
  • 没有看到代码,我猜这是由于竞争条件,您在返回之前检查信息。确保 Ajax 调用已完成,并且在检查行之前已填充行。
  • 好的,克里斯,但是为什么 console.log($('table')) 会在 tbody 中显示 ,而 console.log($('tbody')) 不会' t?
  • var count = $('#tours_table tr').length;alert(count);还有你在哪里调用计数器代码?
  • 同意这听起来像是一个竞争条件,您应该在修改 AJAX 请求中的表后执行此操作,查看 Promise 以便更好地了解异步和并行的工作原理:)跨度>

标签: javascript jquery ajax elements


【解决方案1】:

尝试使用.always() 事件来计算 Ajax 调用完成之后的行数。

此外,您应该从 success 更改为 done 事件,因为第一个已弃用。

弃用通知:jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调从 jQuery 3.0 开始被删除。您可以改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。

参考:jQuery API documentation

$.ajax({
    type: 'get',
    url: 'load_tours',
    data: $('#search-form').serialize()
    }).done(function(){
        $('#tours_table').empty();
        tableCreate(data);
    }).always(function(){
        alert($('#tours_table tr').length);
    });        
}); 

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签