所以我有一些类元素:
<span class="show" onclick="show()">show</span>
<span class="show" onclick="show()">show</span>
<span class="show" onclick="show()">show</span>
当我点击其中一个元素时,由于某种原因我需要索引。我知道如何使用jQuery,但这不是我要求的,这里。
我的js函数应该是这样的:
function show() {
var index = document.getElementsByClassName('show')[??];
alert(index);
}
纯javascript怎么可能? 注意:我必须坚持使用无法更改的onclick =“show()”。
我希望有人能提供帮助,提前谢谢:)
答案 0 :(得分:1)
只需获取所有元素的数组,然后找到收到点击的当前元素
function show(el) {
var els = Array.prototype.slice.call( document.getElementsByClassName('show'), 0 );
console.log(els.indexOf(event.currentTarget));
}
<span class="show" onclick="show(this)">span 1</span>
<span class="show" onclick="show(this)">span 2</span>
<span class="show" onclick="show(this)">span 3</span>
答案 1 :(得分:0)
您可以尝试这样的事情:
addEventListener
绑定事件处理程序。这样您就可以使用this
了。 Array.indexOf
<强> ONCLICK 强>
function show(self){
var spans = document.querySelectorAll('.show');
console.log(Array.from(spans).indexOf(self))
}
&#13;
<span class="show" onclick="show(this)">show</span>
<span class="show" onclick="show(this)">show</span>
<span class="show" onclick="show(this)">show</span>
&#13;
<强>的addEventListener 强>
function show(){
var spans = document.querySelectorAll('.show');
console.log(Array.from(spans).indexOf(this))
}
function registerEvent(){
var spans = document.querySelectorAll('.show');
for(var i = 0; i< spans.length; i++){
spans[i].addEventListener("click", show)
}
}
registerEvent();
&#13;
<span class="show" >show</span>
<span class="show" >show</span>
<span class="show" >show</span>
&#13;
答案 2 :(得分:0)
如果你绝对坚持使用onclick
属性(即使你真的不需要):
// get live collection so you only need to call this once
var liveCollection = document.getElementsByClassName('show');
function show(event) {
// convert liveCollection to array for `.indexOf()`
// either ES6
var shows = [...liveCollection];
// or ES5
var shows = Array.prototype.slice.call(liveCollection);
var index = shows.indexOf(event.currentTarget);
alert(index);
}
&#13;
.show {
cursor: pointer;
}
&#13;
<span class="show" onclick="show(event)">show</span>
<span class="show" onclick="show(event)">show</span>
<span class="show" onclick="show(event)">show</span>
&#13;
但是,我建议您使用delegated events来处理动态添加的元素,因为使用onclick
属性被视为不良做法,but don't just take my word for it.
// see below for how to select the best container
var container = document.body;
// single event listener for all dynamically added elements
container.addEventListener('click', function (event) {
if (event.target.classList.contains('show')) {
show.call(event.target, event);
}
});
// get live collection so you only need to call this once
var liveCollection = container.getElementsByClassName('show');
function show(event) {
// convert liveCollection to array for `.indexOf()`
// either ES6
var shows = [...liveCollection];
// or ES5
var shows = Array.prototype.slice.call(liveCollection);
// this === event.target
var index = shows.indexOf(this);
alert(index);
}
&#13;
.show {
cursor: pointer;
}
&#13;
<span class="show">show</span>
<span class="show">show</span>
<span class="show">show</span>
&#13;
委派事件处理的好处是,您不需要onclick
属性来处理动态添加的元素,因此这将最适合您的特定用途。
建议(但不是必须)将委派事件的事件侦听器附加到所有动态添加的元素中的最直接container
,以便click
事件不会发生。我必须一直冒泡到document.body
。这使得处理更有效率。
答案 3 :(得分:-1)
如果您正在寻找索引,可以将其传递给show()方法。
<span class="show" onclick="show(0)">show</span>
<span class="show" onclick="show(1)">show</span>
<span class="show" onclick="show(2)">show</span>