我正在努力弄清楚为什么我的代码无效。这是JS的一部分:
function init() {
var showMenu = document.getElementsByClassName('showMenu'),
perspectiveWrapper = document.getElementById( 'perspective' ),
container = perspectiveWrapper.querySelector( '.container' ),
contentWrapper = container.querySelector( '.wrapper' );
showMenu.addEventListener( clickevent, function( ev ) {
ev.stopPropagation();
ev.preventDefault();
docscroll = scrollY();
// change top of contentWrapper
contentWrapper.style.top = docscroll * -1 + 'px';
// mac chrome issue:
document.body.scrollTop = document.documentElement.scrollTop = 0;
// add modalview class
classie.add( perspectiveWrapper, 'modalview' );
// animate..
setTimeout( function() { classie.add( perspectiveWrapper, 'animate' ); }, 25 );
});
}
以下是HTML的一部分:
<div id="topBar">
<h1>Company</h1>
<a href="#" class="entypo-menu showMenu"></a>
</div>
<div class="line"></div>
<div id="fixedBar">
<h1>Company</h1>
<a href="#" class="entypo-menu showMenu"></a>
</div>
由于某种原因,当我加载页面时,我收到此错误:
TypeError: undefined is not a function (evaluating 'showMenu.addEventListener')
我不明白这一点,因为如果我改变这一行:
var showMenu = document.getElementsByClassName('showMenu'),
为:
var showMenu = document.getElementById( 'showMenu' ),
确实有效!
为什么类选择器不起作用,但id会不会?我正在尝试使用类showMenu
获取两个链接来执行JS。
答案 0 :(得分:5)
document.getElementsByClassName
会返回与类名匹配的所有元素的类似数组的列表(确切地说是HTMLCollection
)。您可能关心第一个元素,因此请尝试使用以下内容:
var showMenu = document.getElementsByClassName( 'showMenu' )[0],
如果您关心所有元素,那么您需要遍历这些元素:
var showMenu = document.getElementsByClassName( 'showMenu' ),
// ...
for ( var i = 0; i < showMenu.length; ++i ) {
showMenu[i].addEventListener( clickevt, function( ev ) {
// Your code here
});
}
答案 1 :(得分:3)
那是因为document.getElementsByClassName()
返回node list,类似于数组。
因此,如果您希望定位多个元素,则必须使用for循环或.forEach()
循环遍历它们,但如果您只是使用此类查找第n个元素,则可以指定它是带括号表示法的索引:
var showMenu = document.getElementsByClassName('showMenu')[0],
答案 2 :(得分:2)
这是因为getElementsByClassName
return an array-like object of DOM elements。
您需要访问每个元素并单独附加事件侦听器:
for (var i = 0; i < showmenu.length; i++ ) {
showMenu[i].addEventListener( clickevent, function( ev ) {
// ...
});
}
..或:
Array.prototype.forEach.call(showMenu, function(el, i) {
el.addEventListener( clickevent, function( ev ) {
// ...
});
});