【问题标题】:Javascript DOM TrickinessJavascript DOM 技巧
【发布时间】:2011-08-30 00:09:33
【问题描述】:

我在弄清楚如何在 Javascript 中自引用表格行时遇到了一些麻烦。

这是精简的代码:

$( "#listitems tbody" ).append( "<tr onclick=\"editListItem(this)\">" +
        "<td>" + id.val() + "</td>" +  
        "<td>" + title.val() + "</td>" + 
        "<td>" + description.val() + "</td>" + 
        "<td>" + TF + "</td>" + 
        "<td style=\"visibility: hidden;\">" + id.val() + "</td>" + 
"</tr>" );

如您所见,我正在动态设置此表格行和单元格的内容。但是,我需要将对该表行的引用传递给它的 onClick 函数,该函数调用这个 Javascript 方法:

function editListItem(obj) {
    var id = obj.cells[4].innerHTML;
    var cells = document.getElementById('listitems').rows[id].cells;
    DATA[0] = cells[0].innerHTML;
    DATA[1] = cells[1].innerHTML;
    DATA[2] = cells[2].innerHTML;
    DATA[3] = cells[3].innerHTML;
}

在这种方法中,我需要访问被点击的表格行的第 4 个“隐藏”单元格内部中包含的值。我通常只是将 ID 变量传递给 onClick 方法,但是该表的内容可以排序和重新排列,因此 ID 变量不一定与行的内容相对应。

过去四个小时我一直在谷歌上搜索,但找不到任何关于这种情况的具体示例;我尝试过的所有操作都会触发一个 Javascript 错误,声明 obj.cells、obj[4]、obj.childNodes 等不存在,具体取决于我尝试的是哪一个。

有谁知道如何通过将“this”传递给表格行的 onClick 来访问表格行元素内表格单元格元素的 innerHTML?

如果其中任何部分令人困惑,请告诉我,我正在努力在今天离开之前完成这件事,否则我知道我会忘记这一切而必须重新开始。

【问题讨论】:

    标签: javascript jquery dom html-table


    【解决方案1】:

    怎么样:

    $( "#listitems tbody" ).append(
        $('<tr>....</tr>')
            .bind('click', function(){
                var tds = $(this).find('td'),
                     id = tds.eq(4).text();
            })
    );
    

    如果这不是你的意思,请告诉我。我不是 100% 确定我理解你的要求:)

    【讨论】:

    • 我明白你的意思,但我不知道使用什么语法来实际引用行的子元素;我相信使用绑定与将“this”传递给 onClick 方法相同,如果我错了,请纠正我。 A.k.a.,如果“this”是表格行,我如何实际引用它的单元格? this.cells好像不行,this.childNodes也不行,直接用this[#]也不行。
    【解决方案2】:

    先自己创建&lt;tr&gt;元素,并使用合适的JS来注册处理程序,而不是将处理程序嵌入到元素的属性中:

    var tr = $('<tr>').click(editListItem);
    $("#listitems tbody").append(tr);
    $(tr).append( ... );
    

    editListItem中,this会自动应用到整个行元素:

    function editListItem(row) {
        var cells = $(this).children('td');
        var id = $cells.eq(4).text();
        var data = [];
        data[0] = cells.eq(0).html();
    }
    

    【讨论】:

    • 关闭,虽然我不明白为什么注册处理程序与嵌​​入处理程序有任何区别;只要表行拥有事件处理程序,“this”引用仍应适用于这两种情况,对吗?无论如何,我在您的解决方案中遇到了一些问题,但感谢您的帮助! :)
    【解决方案3】:

    从您的代码的外观来看,您使用 jQuery,因此您可以使用

    轻松获取第 5 个 td
    $(this).children('td').eq(4)
    

    然后用那个 jQuery 元素做任何你想做的事情

    结帐jQuery eq selector了解更多信息

    【讨论】:

    • 先生,您是一位绅士和一位学者,尽管我不得不使用我传递的“obj”参数而不是“this”,因为简单的内联 onClick 无法正确注册拥有函数,它只是一个函数调用。我必须将“this”引用传递给事件处理程序并通过 $(obj) 而不是隐式使用 $(this) 访问它。谢谢! :)
    • 很好,尽管在最佳实践中,您应该避免内联事件并将它们注册到 javascript 中的 dom 元素上
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多