Javascript 单击元素时,获取索引,然后传递该索引以触发另一个事件

Javascript 单击元素时,获取索引,然后传递该索引以触发另一个事件,javascript,jquery,Javascript,Jquery,我有很多复制的父母,每一个都有8个空的沙发。我试图在单击时获取子div的编号,该编号似乎有效,但随后我尝试传递索引编号,以便我可以向具有相同索引的每个第二个父级添加一个类 例如,我单击第三个子div。它应该绘制第二个父类,并添加一个类,同时突出显示该子类中的第三个子div 我希望这是有道理的 到目前为止,我只能做到这一点: $('.fader-empty').click( function(){ var index = $(this).index(); a

我有很多复制的父母,每一个都有8个空的沙发。我试图在单击时获取子div的编号,该编号似乎有效,但随后我尝试传递索引编号,以便我可以向具有相同索引的每个第二个父级添加一个类

例如,我单击第三个子div。它应该绘制第二个父类,并添加一个类,同时突出显示该子类中的第三个子div

我希望这是有道理的

到目前为止,我只能做到这一点:

$('.fader-empty').click(
    function(){
        var index = $(this).index();
        alert(index);
        $('.fader-section').find('.fader-empty:nth-child(3)').addClass('shoo');

});

这是一个。

只需在第一个选择器中添加:奇数即可选择第二个父项,即第二个、第四个等

我还将3替换为索引+1-注意,它是1索引而不是0索引

$('.fader-section:odd').find('.fader-empty:nth-child(' + (index + 1) + ')').addClass('shoo');
$'.fader为空。单击 函数{ var blockIndex=$this.index+1; $this.parents'.new layer'.find'.fader section'.find'.fader为空:第n个子项'+blockIndex+.addClass'shoo'; }; .新图层{ 明确:两者皆有; 空白:nowrap; 浮动:左; 背景:f1f1; 填充:10px 0px 10px 10px; 字号:0; } .子层{ 边缘顶部:10px; } .音量控制器部分{ 显示:内联块; 右边距:10px; } .音量控制器为空{ 背景色:e5e7ea; 左边框:1px实心A1A1; 边框顶部:1px实心A1A1; 边框底部:1px实心A1A1; 高度:240px; 宽度:44px; 显示:内联块; 位置:相对位置; 字体大小:12px; 光标:指针; -moz框大小:边框框; -webkit框大小:边框框; 框大小:边框框; } 萧先生{ 背景色:绿色!重要; }
您只需要将3替换为索引+1,因为索引从0开始,所以您的代码应该是这样的:

$('.fader-empty').click(

   function () {
        var index = $(this).index();
        $('.fader-section').find('.fader-empty:nth-child(' + (index + 1) + ')').addClass('shoo');

});
这是我的

编辑:

为了精确匹配单击元素上方的垂直部分,我使用了以下代码:

$('.fader-empty').click(function () {
    var faderIndex = $(this).index();
    var parent = $(this).parent().parent();
    var parentIndex = $(this).parent().index();
    $('.fader-section').each(function () {
        if ($(this).index() === parentIndex) {
            $(this).find('.fader-empty:nth-child(' + (faderIndex + 1) + ')').addClass('shoo');
        }
    });
});
你必须这样做:

获取单击的元素父节的索引

然后迭代相同的类部分,只更改具有相同索引的部分

又是这样。

你想要的是那种效果吗

片段:

var newLayers=$'。新层'; 变量子层=$'。子层'; var faderSections=$'。fadersection'; var faderEmpties=$'。fader empty'; faderEmpties.clickfunction{ var faderEmptyIndex=$this.index; var faderSectionIndex=$this.parent.index; var subLayerIndex=$this.parent.parent.index; var newLayerIndex=$this.parent.parent.parent.index; subLayers.eachfunction{ 美元这个 .find'.fader部分' .eqfaderSectionIndex .查找“.fader empty” .eqfaderEmptyIndex .toggleClass'shoo'; }; }; .新图层{ 明确:两者皆有; 空白:nowrap; 浮动:左; 背景:f1f1; 填充:10px 0px 10px 10px; 字号:0; } .子层{ 边缘顶部:10px; } .音量控制器部分{ 显示:内联块; 右边距:10px; } .音量控制器为空{ 背景色:e 5e7ea; 左边框:1px实心A1A1; 边框顶部:1px实心A1A1; 边框底部:1px实心A1A1; 高度:240px; 宽度:44px; 显示:内联块; 位置:相对位置; 字体大小:12px; 光标:指针; -moz框大小:边框框; -webkit框大小:边框框; 框大小:边框框; } 萧先生{ 背景色:绿色!重要; }
在阅读您的问题时,似乎要求突出显示.fader部分元素的.fader空单元格,这些元素出现在下面的“列”中,可能出现在您单击的.fader空元素上方

要做到这一点是有意义的,而且几乎是一个先决条件,除非您在一个非常封闭和受控的环境中操作,首先确定您单击的元素所在的列,然后在找到您单击的元素的索引后,将给定的类名应用于同一列中同一索引的所有其他元素

为此,我建议如下:

// first a simple jQuery plug-in to identify the columns:
(function ($) {
    $.fn.identifyColumn = function () {

        // initialising the column-count at 0:
        var column = 0,

        // finding the offset().top position of
        // the first element of the collection:
            topOffset = this.eq(0).offset().top;

        // iterating over each element in the collection
        // here 'this' is the jQuery object/collection,
        // itself, inside the each() loop 'this' refers
        //  to individual elements inside of that
        // jQuery object/collection:
        return this.each(function () {

            // setting the 'data-column' attribute using
            // attr() instead of data(), because I want
            // the column to be amongst the element's
            // attributes, not held in jQuery's data-store
            // (which is initialised by data-* attributes,
            // but the attributes are not updated by
            // setting new data properties with the data()
            // method):
            $(this).attr('data-column', function () {

                // caching the $(this):
                var self = $(this);

                // if the offset().top is the same as
                // the established topOffset then we
                // can infer that we're on the same 'row'
                // as a corollary, if the offset().top
                // is different we can infer we're on a
                // new row:
                if (topOffset !== self.offset().top) {

                    // updating the topOffset with the
                    // offset().top of the new 'row':
                    topOffset = self.offset().top;

                    // resetting the column counter:
                    column = 0;
                }

                // returning the column+<integer> string:
                return 'column' + ++column;
            });
        });
    };
})(jQuery);

// selecting the '.fader-section' elements, and
// applying the plugin:
$('.fader-section').identifyColumn()

    // finding the '.fader-empty' elements within
    // the '.fader-section' elements, and binding
    // an anonymous event-handler for the 'click'
    // event:
    .find('.fader-empty').on('click', function () {

    // caching '$(this)' for subsequent use:
    var self = $(this),

        // finding the index of the clicked element:
        index = self.index(),

        // finding the closest '.fader-section' ancestor,
        // and retrieving its 'data-column' attribute value:
        column = self.closest('.fader-section').attr('data-column');

    // selecting all '.fader-section' elements, and
    // filtering that collection to only those that share
    // the same 'data-column' attribute-value:
    $('.fader-section').filter(function () {
        return this.dataset.column === column;

    // looking within the retained '.fader-section' elements
    // for the '.fader-empty' descendant elements which
    // are also at the equivalent index, using the CSS
    // ':nth-child()' selector, which requires increasing
    // the found index number by 1 (JavaScript is zero-based,
    // CSS is 1-based); and then adding the 'shoo' class to
    // those elements:
    }).find('.fader-empty:nth-child(' + (index + 1) + ')').addClass('shoo');

});
.新图层{ 明确:两者皆有; 空白:nowrap; 浮动:左; 背景:f1f1; 填充:10px 0px 10px 10px; 字号:0; } .子层{ 边缘顶部:10px; } .音量控制器部分{ 显示:内联块; 右边距:10px; } .音量控制器为空{ 背景色:e5e7ea; 左边框:1px实心A1A1; 边框顶部:1px实心A1A1; 边框底部:1px实心A1A1; 高度:100px; 宽度:44px; 显示:内联块; 位置:相对位置; 字体大小:12px; 光标:指针; -moz框大小:边框框; -webkit框大小:边框框; 框大小:边框框; } 萧先生{ 背景色:绿色!重要; }
有点难以想象,至少对我来说,如果不查看HTML,您将尝试做什么。可以分享吗?抱歉是的,用html显示我的意思可能更容易。我已经做了一个演示,因为html必须被复制以准确显示我需要做什么。我想做的是,当你点击其中一个单独的块时,我希望它下面的所有块都高亮显示。当前,当我单击时,我只能使每个块中的第三个块高亮显示,但它正在每个块中高亮显示第三个块。因此,简而言之,我只希望能够单击一个块,并使下面的所有块高亮显示。不过,我真的不知道该怎么做。@SuziLarsen仍然无法理解如果我点击第一个区块的第一列会发生什么。?@Suzi Larsen请查看答案是什么。除非你点击其中一个,否则它应该突出显示你点击的那一个,而不是突出显示向左和向右,它应该抓住正上方和正下方的一个,并在垂直线上突出显示。@SuziLarsen嘿,你想在每一个新层的元素上突出显示还是什么。?在条带中显示突出显示。理想情况下,当你点击某个东西时,它会突出显示音量控制器上方和下方的每个块空块,但在右边和左边都没有。我应该说,上面和下面我指的是视觉效果。这可能有点混淆,因为它可以被解释为上面和下面的html。只是视觉效果好得多是的!!还有一件事吗?是否有办法隔离您单击的音量控制器部分,使其忽略其他音量控制器部分?所以,如果我在第二或第四音量控制器部分div中按下,比如说一个音量控制器为空,它只会高亮显示t
很抱歉,这是一个冗长的希望,它让唤醒已经设法做了一些事情,通过使用相同的想法,你开始了。我不确定它是否合适,但它似乎起了作用。我使用了你的想法,并将其应用于此。它起作用了@SuziLarsen是的,这是一个很好的方法,我使用了另一个代码,但使用了相同的逻辑,它也在工作,看看我的编辑。