【问题标题】:Javascript - Dynamic Expand/Collapse AllJavascript - 动态展开/折叠所有
【发布时间】:2015-07-03 02:51:10
【问题描述】:

我有一个 jQuery 树报告,我正在尝试为其创建“展开/折叠所有”按钮。

当相应的按钮被按下并且工作正常时,以下两段代码被触发:

    for (i = 1; i < 100; i++) {

var el = $('#dtt_2597807651112537_table tbody tr')[i - 1];
    // store current level
    var level = Number($(el).attr('dtt_level'));
    // change icon
    $(el).find('span.dtt_icon').removeClass('dtt_collapsed_span');
    $(el).find('span.dtt_icon').addClass('dtt_expanded_span');
    while ($($(el).next()).attr('dtt_level') != null) {
        var el = $(el).next();
        if ($(el).attr('dtt_level') == (level + 1)) {
            // change display
            el.removeClass('dtt_collapsed_tr');
            el.addClass('dtt_expanded_tr');
        } else if ($(el).attr('dtt_level')  == level) {
            break;
        }
    }
}

for (i = 1; i < 100; i++) {
// get related table row
    var el = $('#dtt_2597807651112537_table tbody tr')[i - 1];
    // store current level
    var level = Number($(el).attr('dtt_level'));
    // change icon
    $(el).find('span.dtt_icon').addClass('dtt_collapsed_span');
    $(el).find('span.dtt_icon').removeClass('dtt_expanded_span');
    while ($($(el).next()).attr('dtt_level') != null) {
        var el = $(el).next();
        if ($(el).attr('dtt_level') > level) {
            // change display
            el.addClass('dtt_collapsed_tr');
            el.removeClass('dtt_expanded_tr');
            // change icon
            $(el).find('span.dtt_icon').addClass('dtt_collapsed_span');
            $(el).find('span.dtt_icon').removeClass('dtt_expanded_span');
        } else if ($(el).attr('dtt_level')  == level) {
            break;
        }
    }
};

但是,我想知道是否有人有一个很好的方法:

1) 获取需要循环的行数 - 我只是将 100 作为一个大数字来证明我的代码有效,我不想将其增加到更大的数字。

2) 从页面源中获取类名 - “dtt_2597807651112537_table”中的大数字是应用程序生成的报告ID。这暂时是静态的,但如果它发生变化,我想消除任何问题。

谢谢。

【问题讨论】:

    标签: javascript jquery tree collapse expand


    【解决方案1】:

    这都是错误的。好吧,无论如何,它与 jQuery 的工作方式背道而驰。

    jQuery的信条是:

    1. 选择元素
    2. 对他们做事

    放下你的循环。你不需要它们。

    例如。要在文档中切换 all span.dtt_icon 上的图标,请执行

    var collapsed = true;
    
    $("#dtt_2597807651112537_table span.dtt_icon")   // select elements
    .toggleClass('dtt_collapsed_span', collapsed)    // do stuff to them
    .toggleClass('dtt_expanded_span', !collapsed);
    

    或者,作为一个既可以折叠又可以展开的函数:

    function toggleTree(tree, collapsed) {
        $(tree).find("span.dtt_icon")
        .toggleClass('dtt_collapsed_span', collapsed)
        .toggleClass('dtt_expanded_span', !collapsed);
    }
    

    仅折叠当前展开的...

    $("#dtt_2597807651112537_table span.dtt_icon.dtt_expanded_span")
    .toggleClass('dtt_collapsed_span', true)
    .toggleClass('dtt_expanded_span', false);
    

    等等。

    您可以通过这种方式将整个代码简化为几行,而无需编写单个循环:使用智能元素选择(通过 jQuery 选择器和任何 jQuery 查找、过滤和遍历函数)来单取出您想要操作的元素,然后一步操作它们。

    关于你的第二个问题。方法很多,选一个吧:

    • 使用已知的页面结构来确定正确的表(例如$("div.main &gt; table:first") 或类似的东西)
    • 使用已知的表格内容来确定正确的表格(例如$("table:has(span.dtt_icon)")
    • 使用表格的其他类($("table.treeReport") 可能吗?)或例如表格的 ID 和“开始于”选择器 ($("table[id^=dtt_]"))。

    同样,这一切都是为了巧妙地选择您的元素。建议深入了解 jQuery API 文档,在本例中为 the part about selectors

    【讨论】:

    • 谢谢,这看起来是朝着正确方向迈出的一大步。作为 PL/SQL 开发人员,我直接进入循环。所以,我在我的javascript中添加了$("#dtt_2597807651112537_table tbody tr") // select elements .toggleClass('dtt_collapsed_tr', collapsed) // do stuff to them .toggleClass('dtt_expanded_tr', !collapsed);,这一切都崩溃了——它消失了。有没有一种方法可以选择正确的,而无需像我的示例中那样循环并检查级别? (基本上所有 dtt_level 不为 1 的地方)
    • 这就是我现在正在尝试的:$("table[id^=dtt_] tbody tr dtt_level!=1") // select elements .toggleClass('dtt_collapsed_tr', collapsed) // do stuff to them .toggleClass('dtt_expanded_tr', !collapsed); 这不起作用 - 我在正确的路线上吗?
    • @ls_dev 差不多。 $("table[id^=dtt_] tbody tr[dtt_level!=1]") - 注意方括号以访问属性(如id 用于表格)。打开浏览器控制台并使用不同的 jQuery 选择器是了解它们的好方法。
    • @ls_dev 作为使用 jQuery 的一般提示 - 几乎所有内容都是 set 操作。例如$("div.foo").parent() 获取页面上任何div.fooall 父级。 $("div.foo").parent("div.bar") 获取页面上任何div.foo 的所有div.bar 的父母。避免手动循环,就像避免 SQL 中的游标一样。
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2014-02-26
    • 2014-03-26
    • 2016-04-29
    相关资源
    最近更新 更多