【问题标题】:Table onclick rows jQuery表格点击行jQuery
【发布时间】:2013-12-18 19:53:49
【问题描述】:

我有一个表格,其内容是通过 AJAX 成功响应生成的。

HTML 代码

<table class="table table-hover" id="table_content"></table>

AJAX 代码

$.ajax({
        dataType: "json",
        type : "POST",
        url: "/configuration/",
        data : { 'selected_item' : selected_item_id },

        success : function(result){
                 var table_heading = "<tr>"
                 var table_content = ""
                 for (var heads in result[1]){
                     table_heading +="<th style='background-color:#f1f1f1;'>" + result[1][heads] + "</th>"
                 }

                 for (var region in result[0]){
                      table_content += "<tr>"
                      for (var details in result[0][region]){
                          table_content += "<td>" + result[0][region][details] + "</td>"
                      }
                 }

                 table_content = table_heading + table_content

                 $("#table_content").html(table_content)
       },
});

我想对其应用 onclick 功能。像这样:-

点击功能代码

$(function(){
    $('#table_content tr').click(function () {
        $('.test').slideUp(0)
        $(this).append(($('.test')).slideDown('slow'));
    });
});

我面临的问题是,如果我通过 AJAX 响应生成内容,我将无法单击该行。如果我在 HTML 本身中创建一个表格,它会起作用,但当表格是通过 AJAX 响应创建时则不行。

有什么问题?请建议。

已编辑

我想要实现的是,在单击该行时,一个 div 应该在该行的下方向下滑动。当数据通过 AJAX 生成时,我第一次工作。但是当我第一次生成数据时它不起作用,虽然触发了事件但$('.test').slideUp(0) $(this).append(($('.test')).slideDown('slow')); 在第一次之后不起作用。也没有弹出任何错误。见http://jsfiddle.net/fVz6D/5/

【问题讨论】:

    标签: javascript jquery html ajax


    【解决方案1】:

    更新: 查看工作演示: http://jsfiddle.net/c5FgG/1/

    您的问题是您将测试 div 元素附加到表格行,重新填充表格后消失了。相反,当您更改表格内容时,请在每次单击时克隆测试 div,并使用克隆而不是原始 div。

    旧答案: 在ajax成功函数内添加onclick函数代码。这样对我有用:

    ...
    $("#table_content").html(table_content);
    
    $('#table_content tr').click(function () {
      alert("Clicked");
      //your code
    });
    ...
    

    别忘了关闭表格行:

    table_content += "</tr>";
    

    【讨论】:

    • 我想要实现的是,在单击该行时,一个 div 应该在该行的下方向下滑动。当数据通过 AJAX 生成时,我第一次工作。但是当我第一次生成数据时它不起作用,虽然触发了事件但$('.test').slideUp(0) $(this).append(($('.test')).slideDown('slow')); 在第一次之后不起作用。也没有弹出任何错误。见jsfiddle.net/fVz6D/5
    • 在这种情况下,我知道你的问题是什么。您正在将带有 class="test" 的 div 添加到 dom 的另一个位置(每个 tr 内),然后,当您第二次获取数据时,将不再有要附加的 div。要解决它,请克隆您的测试 div,并将其附加到每一行。别管原来的了。
    • 谢谢。但是,如果我对每个不同的项目列表都有不同的 div 呢?
    • 您的意思是 div 的数据来自 json 结果?即使您需要向下滑动不同的内容,我也看不到问题。
    • 我的意思是它是这样的。对于第 1 项 - &lt;div id = '1'&gt;abc&lt;/div&gt;。对于第 2 项 - &lt;div id = '2'&gt;def&lt;/div&gt;。对于第 3 项 - &lt;div id = '3'&gt;aghi&lt;/div&gt; 等等。
    【解决方案2】:

    您使用click 绑定事件的方式仅将事件绑定到在执行绑定代码时DOM 中存在的元素。您需要使用on() 将事件与动态生成的 html 元素绑定的事件委托。

    $(function(){
        $('#table_content').on('click', 'tr', function () {
            $('.test').slideUp(0)
            $(this).append(($('.test')).slideDown('slow'));
        });
    });
    

    委托活动

    委托事件的优势在于它们可以处理来自 以后添加到文档中的后代元素。经过 选择一个保证在该时间存在的元素 附加了委托事件处理程序,您可以使用委托事件 避免频繁附加和删除事件处理程序的需要,reference

    【讨论】:

    • 是否触发了点击事件?
    • 没有。当表已经存在时,它第一次触发。但是当表格通过 ajax 响应生成时,它就不起作用了。
    • 没有。等待它的工作,但我想要实现的是没有生成。不管怎么说,多谢拉。 :)
    • 应该触发点击事件,请检查您的代码以确保一切正常并且您没有错误
    • 我想要实现的是,在单击该行时,一个 div 应该在该行的下方向下滑动。当数据通过 AJAX 生成时,我第一次工作。但是当我第一次生成数据时它不起作用,虽然触发了事件但$('.test').slideUp(0) $(this).append(($('.test')).slideDown('slow')); 在第一次之后不起作用。也没有弹出任何错误。
    【解决方案3】:

    试试

    $(function(){
        $('#table_content').on('click', 'tr', function () {
            $('.test').slideUp(0)
            $(this).append(($('.test')).slideDown('slow'));
        });
    });
    

    on() 处理程序也应该适用于新创建的元素。

    【讨论】:

    • 我想要实现的是,在单击该行时,一个 div 应该在该行的下方向下滑动。当数据通过 AJAX 生成时,我第一次工作。但是当我在第一次之后生成数据时它不起作用,虽然触发了事件但$('.test').slideUp(0) $(this).append(($('.test')).slideDown('slow')); 在第一次之后不起作用。也没有弹出任何错误。见jsfiddle.net/fVz6D/5
    【解决方案4】:
    $(function(){
        $('#table_content').on('click', 'tr', function () {
            $('.test').slideUp(0)
            $(this).append(($('.test')).slideDown('slow'));
        });
    });
    

    这里是小提琴列表:

    fiddle1

    fiddle2

    fiddle3

    fiddle4

    您可以根据需要使用它。

    【讨论】:

    • 我想要实现的是,在单击该行时,一个 div 应该在该行的下方向下滑动。当数据通过 AJAX 生成时,我第一次工作。但是当我第一次生成数据时它不起作用,虽然触发了事件但$('.test').slideUp(0) $(this).append(($('.test')).slideDown('slow')); 在第一次之后不起作用。也没有弹出任何错误。见jsfiddle.net/fVz6D/5
    • 你能告诉我,你到底想做什么?
    • 我希望一个 div 应该在被点击的行的正下方向下滑动。它确实有效,但仅在我第一次通过 Ajax 生成数据时有效。第一次生成表格后,div 不会向下滑动。例如:- 当我单击 li 项目时,将出现一个表格。单击任何行时,将出现一个 div,上面写着You slide down a row with content xyz。但是当我再次从列表中单击一个项目,然后单击相应表中的行时,div 不显示。
    • 查看更新我添加了fiddles,你可以随意使用。
    【解决方案5】:

    on() 用于动态添加的元素,例如,

    $('#table_content').on('click',' tr', function () {
        $('.test').slideUp(0)
        $(this).append(($('.test')).slideDown('slow'));
    });
    

    更新您的div 将移动到您的clicked 上的tr,因此当您在listclick 时,它会在generate new contenttable 所以您的@987654334 @ 将从 HTML 中删除,这就是为什么您不再获得 desc div 的原因。

    要解决此问题,您必须在clicking of list 中再次添加div.desc

    if(!$('body > div.test').length){
       $("body").append('<div class="test">You slide down a row with content xyz</div>');
    }
    

    完整代码

     $('#list').on('click', 'li', function () {
        var id = this.id;
        var table_content = "";
        // IF id=1,2,3,4,5 Code        
    
        $("#table_content").html(table_content);
    
        // add below code foe div.desc
        if (!$('body > div.test').length) {
            $("body").append('<div class="test">You slide down a row with content xyz</div>');
        }
    });
    

    Demo

    或者,您可以使用clone() 喜欢,

    $(function () {
        $('#table_content').on('click', 'tr', function () {
            $clone=$('.test:not(.new-test)').clone();// clone the first test class element
            $('.new-test').remove();// remove the cloned elements
            $clone.addClass('new-test').appendTo('body');// add the clone to body
            $clone.slideUp(0);// playing with clone now
            $(this).append($clone.slideDown('slow'));
        });
    });
    

    Working demo

    【讨论】:

    • 我想要实现的是,在单击该行时,一个 div 应该在该行的下方向下滑动。当数据通过 AJAX 生成时,我第一次工作。但是当我第一次生成数据时它不起作用,虽然触发了事件但$('.test').slideUp(0) $(this).append(($('.test')).slideDown('slow')); 在第一次之后不起作用。也没有弹出任何错误。见jsfiddle.net/fVz6D/5
    • 不,不是。请参阅下面的说明,了解我到底面临什么问题。
    • 我希望一个 div 应该在被点击的行的正下方向下滑动。它确实有效,但仅在我第一次通过 Ajax 生成数据时有效。第一次生成表格后,div 不会向下滑动。例如:- 当我单击 li 项目时,将出现一个表格。单击任何行时,将出现一个 div,上面写着You slide down a row with content xyz。但是当我再次从列表中单击一个项目,然后单击相应表中的行时,div 不显示。
    • 它的工作,但我不明白if (!$('body &gt; div.test').length) { $("body").append('&lt;div class="test"&gt;You slide down a row with content xyz&lt;/div&gt;'); } 做什么?
    • 当您点击任何table-row 时,您的div.desc 在该行中移动,它会正常工作,但是当您再次点击list-li 时,您的table-tr 中的div.desc将是 removedtable body 因为 new contents 发生在 table. So, I checked the length of div.desc` 如果它是零然后我再次将它附加到 body
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2012-07-04
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多