突发奇想,想给UL下面的每个li绑定一个点击事件;
HTML:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
<script>
var lis = document.querySelector('ul').querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
lis[i].onclick(function(){
console.log(i);
});
}
</script>
结果当然也是理所当然的用不了,因为里面是事件是委托了,但是没有没有触发,肯定没有回调函数;可以利用闭包(立即函数)来调用;
HTML:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
<script>
<script>
var lis = document.querySelector('ul').querySelectorAll('li');
for (var i = 0; i < lis.length; o++) {
(function(j){
lis[j].onclick(function(j){
console.log(j);
};
})(i);
}
</script>
虽然事件不被触发,但里面的i一直都会增加,最后面的结果会是lis.length+1;只要在里面加上立即函数()()就可以得到解决;在ES6中其实也有另外的方法解决:
<script>
var lis = document.querySelector('ul').querySelectorAll('li');
for (let i = 0; i < lis.length; i++) {
lis[i].onclick=function(){
console.log(i);
};
</script>
原文
<script>
var lis = document.querySelector('ul').querySelectorAll('li');
arrnodes = Array.prototype.slice.call(lis);
nodeUls = document.queryselector('ul');
nodeUls[0].addEventListener('click',function(){
var event = event||window.event;
var target = event.target || event.scrElement;
console.log(arrNodes.indexOf(targer));
})
</script>
今天学ES6的时候也看到了一条类似的面试题目:
var arr=[];
for(var i = 0;i<2;i++){
arr[i] = function(){
console.log(i);
}
}
arr[0];
arr[1];
|