如何在不使用按钮或 tbody 的情况下从动态生成的表中单击一行来获取 HTML 表中单元格的值

Posted

技术标签:

【中文标题】如何在不使用按钮或 tbody 的情况下从动态生成的表中单击一行来获取 HTML 表中单元格的值【英文标题】:How do I get the value of a cell in an HTML table on click of a row from a dynamically generated table without using buttons or tbody 【发布时间】:2018-10-13 01:58:16 【问题描述】:

我希望能够单击一行上的anywhere 并获取其第一个单元格的内容,而不管我在哪里单击。请注意,这是一个动态生成的表,仅由<th><tr><td>元素组成(没有<tbody>,因此没有所述表中的行有一个id。注释部分自行工作,为什么我不能从第一个单元格中获取文本?或者甚至只是该行的内容将是一个好的开始。我在//trying to get the contents 的函数中的任何地方的选择器有问题吗?我不知道这有什么问题。

//  Build html Table
function buildHtmlTable(portalData, tablename) 
    var columns = [];
    var headerTr$ = $('<tr/>');
    var n = 0;
    if (tablename == "order-table") 
        document.getElementById("dist-name").innerText = JSON.parse(JSON.stringify(portalData[0], null, 2))["Company Name"];
        n = 1;
    
    for (var i = 0 ; i < portalData.length ; i++) 
        var rowHash = portalData[i];
        for (var key in rowHash) 
            if ($.inArray(key, columns) == -1) 
                columns.push(key);
                headerTr$.append($('<th/>').html(key));
            
        
    
    $('#' + tablename).append(headerTr$);
    for (i = 0 ; i < portalData.length ; i++) 
        var row$ = $('<tr/>');
        for (var colIndex = n ; colIndex < columns.length ; colIndex++)   // n is how many columns to drop, based on table name
            var cellValue = portalData[i][columns[colIndex]];
            if (cellValue == null) 
                cellValue = "";
            
            row$.append($('<td/>').html(cellValue));
        
        $('#' + tablename).append(row$);
    

    // Drop unnecessary columns
    for(i = 0 ; i<n; i++) 
        $("#order-table").find('td,th').first().remove();
    

    //Trying to get the contents
    $(function()
        $("#order-table td").click(function()      

            // var column_num = parseInt( $(this).index() ) + 1;
            // var row_num = parseInt( $(this).parent().index() );    

            // alert( "Row_num = " + row_num);   
            var column = $(this);
            var row = ($(this).parent());

            alert(row.innerText);
            alert(column.innerText);
        );
    );

【问题讨论】:

【参考方案1】:

您可以将点击事件绑定到页面上的现有元素,并使用 DOM 导航获取第一个单元格的值。因此,例如,如果您的表格已经存在于页面上,并且您希望将点击事件绑定到动态添加的行,则可以引用 table 元素:

$(document).ready(function() 
  $('table').on('click', 'tr', function() 
    var value = $(this).find('td:first-child').text();
   //do something with value
  );
);

Demo

在您的情况下,您似乎正在将表格本身动态添加到页面中。在这种情况下,您可以绑定到document 并引用动态添加的表的 id:

$(document).ready(function() 
  $('document').on('click', '#order-table tr', function() 
    var value = $(this).find('td:first-child').text();
   //do something with value
  );
);

如果您希望在所有表格上都有此点击事件,您可以这样做:

$(document).ready(function() 
  $('document').on('click', 'table tr', function() 
    var value = $(this).find('td:first-child').text();
   //do something with value
  );
);

【讨论】:

虽然是的,我正在动态添加它,但它是一个单独的页面,其中 div 被隐藏和取消隐藏。事实上,在用户登录之前不会生成表。因此 $(document).ready 函数将不起作用......换句话说,如果它从服务器获得 OK 响应,那么它会构建表.然后它需要添加监听器。换句话说,您的第二个解决方案听起来是正确的。但它甚至不让我发出警报。你的第一个例子有一个 tbody,这个表没有。 @cryophoenix 表是否是动态的并不重要。文档元素不是动态的(DOM 中的元素是动态的,但文档本身不是动态的),因此,您可以将其用作侦听器的锚点。更多信息:***.com/questions/203198/… 我是否需要将此逻辑作为匿名放置在现有的表创建函数中,还是需要将其设为在表创建过程中调用的命名函数?请记住,当文档加载时,表格标签被创建并且表格是空的(没有thtr,什么都没有)。只是一个&lt;table id="order-table"&gt;&lt;/table&gt; 点。所以当文档准备好时,这会在创建行之前将所有这些应用到那个空表,不是吗? @cryophoenix:查看delegate event:learn.jquery.com/events/event-delegation。我会制作一个演示给你看。 @cryophoenix :我已经用一个显示动态行的示例更新了我的答案中指向演示的链接。

以上是关于如何在不使用按钮或 tbody 的情况下从动态生成的表中单击一行来获取 HTML 表中单元格的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用表单的情况下从 jsp 调用 servlet

如何在不使用 ImageView 的情况下从 API 端点下载图像或位图?

如何在不使用表单的情况下从 Rails 应用程序发布到外部 url

如何让 Json.Net 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?

如何在不重置其当前状态的情况下从一个视图控制器到自身进行转场?

如何在不使用提交的情况下从下拉列表中选择值