显示具有相同ID但不同类的div?

时间:2015-07-14 13:13:26

标签: javascript

根据w3标准,不应该有具有相同ID(http://www.w3.org/TR/html401/struct/global.html#h-7.5.2)的div。但是,我正在尝试使用此叠加效果:http://tympanus.net/codrops/2014/02/06/fullscreen-overlay-effects/带有多个按钮。我搜索了网络(和堆栈),发现了很少有关该主题的主题。

使用

触发叠加层
<p><button id="trigger-overlay" type="button">Open Overlay</button></p>

那个js是var triggerBttn = document.getElementById( 'trigger-overlay' )

我的想法是从身份证到班级。所以我可以用

调用叠加层
<p><button class="trigger-overlay-1" type="button">Open Overlay</button></p>
<p><button class="trigger-overlay-2" type="button">Open Overlay</button></p>
<p><button class="trigger-overlay-3" type="button">Open Overlay</button></p>
...

这是当前的js

(function() {
            var triggerBttn = document.getElementById( 'trigger-overlay' ),
                overlay = document.querySelector( 'div.overlay' ),
                closeBttn = overlay.querySelector( 'button.overlay-close' );
                transEndEventNames = {
                    'WebkitTransition': 'webkitTransitionEnd',
                    'MozTransition': 'transitionend',
                    'OTransition': 'oTransitionEnd',
                    'msTransition': 'MSTransitionEnd',
                    'transition': 'transitionend'
                },
                transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ],
                support = { transitions : Modernizr.csstransitions };

            function toggleOverlay() {
                if( classie.has( overlay, 'open' ) ) {
                    classie.remove( overlay, 'open' );
                    classie.add( overlay, 'close' );
                    var onEndTransitionFn = function( ev ) {
                        if( support.transitions ) {
                            if( ev.propertyName !== 'visibility' ) return;
                            this.removeEventListener( transEndEventName, onEndTransitionFn );
                        }
                        classie.remove( overlay, 'close' );
                    };
                    if( support.transitions ) {
                        overlay.addEventListener( transEndEventName, onEndTransitionFn );
                    }
                    else {
                        onEndTransitionFn();
                    }
                }
                else if( !classie.has( overlay, 'close' ) ) {
                    classie.add( overlay, 'open' );
                }
            }

            triggerBttn.addEventListener( 'click', toggleOverlay );
            closeBttn.addEventListener( 'click', toggleOverlay );
        })()

    ;

我试图将其更改为var triggerBttn = document.getElementsByClassName( 'trigger-overlay-1, trigger-overlay-2' ),

但获得TypeError: undefined is not an object (evaluating 'triggerBttn.addEventListener')

Q更新

@davidnortonjr给出的答案就是我坚持的答案。但是,按钮不会触发正确的菜单。第一个按钮有效,但按钮2和3没有触发右div(触发第一个div /菜单)。

<!-- Should open first overlay menu -->
<p><button class="trigger-overlay" type="button">Open Overlay</button></p>
<!-- Should open second overlay menu -->
<p><button class="trigger-overlay" type="button">Open Overlay</button></p>

这是菜单HTML(很遗憾在第一个q中留下它

<!-- FIRST OVERLAY MENU -->
    <div class="overlay overlay-hugeinc">
        <button type="button" class="overlay-close">Close</button>
        <nav>
            <ul>
                <li><a class="menuitem1">Item1</a></li>
                <li><a class="menuitem2">Item2</a></li>
            </ul>
        </nav>
    </div>

    <!-- SECOND OVERLAY MENU -->
    <div class="overlay overlay-hugeinc">
        <button type="button" class="overlay-close">Close</button>
        <nav>
            <ul>
                <li><a class="menuitem1">Menu2</a></li>
                <li><a class="menuitem2">Item1</a></li>
            </ul>
        </nav>
    </div>

2 个答案:

答案 0 :(得分:0)

多个元素可以具有相同的名称,因此我将为它们分配所有相同的类名。您应该以这种方式创建按钮:

df = pandas.DataFrame({'A': [1,3,5,9], 'B': [2,3,4,7]})
new_rows = {}
for i in range(df.shape[0] - 1):
    new_rows[i] = df.irow(i)+df.irow(i+1)
new_df = pandas.DataFrame(new_rows).transpose()

然后分配triggerButtons(不需要删除元音):

<p><button class="trigger-overlay" type="button">Open Overlay</button></p>
<p><button class="trigger-overlay" type="button">Open Overlay</button></p>
<p><button class="trigger-overlay" type="button">Open Overlay</button></p>

这是一个数组,所以你可以遍历它:

var triggerButtons = document.getElementsByClassName( 'trigger-overlay' )

答案 1 :(得分:0)

您的CSS选择器不匹配任何元素,并返回undefined

如果我理解正确,您会尝试在每个可触发叠加层的元素上绑定点击处理程序。

您的CSS课程建议您应该使用ID。这样,每个按钮都可以被唯一标识,但它们也可以通过公共类名共享相同的行为或样式:

<button id="trigger-1" class="trigger">...</button>
<button id="trigger-2" class="trigger">...</button>
<button id="trigger-3" class="trigger">...</button>

这样可以更容易地查找和绑定触发器:

[].forEach.call(document.querySelectorAll('button.trigger'), function (trigger) {
  trigger.addEventListener('click', function () {
    //your code here
  });
});

请注意,如果您有很多这些元素,则可能需要调查事件委派。