![](/img/trans.png)
[英]Return / Get x Number of Items From an Array in Typescript/Javascript
[英]choose up to x number of items from a list in javascript
我有一个项目列表,希望用户可以选择最多三个项目。 我有下面的代码。
var listItems = document.querySelectorAll('li'); var clickcnt = 0; for(var i = 0; i < listItems.length; i++){ listItems[i].addEventListener('click', function(event) { if(this.hasAttribute('class')){ var test = document.getElementsByClassName('clicked'); this.classList.remove('clicked'); clickcnt--; } else if(clickcnt < 3) { this.classList.add('clicked'); clickcnt++; } console.log(clickcnt); }); }
.clicked { background-color:red; }
<p>select up to 3 of your favourite items below.</p> <ul id="mylist"> <li>item 1</li> <li>item 2</li> <li>item 3</li> <li>item 4</li> <li>item 5</li> </ul>
我遇到的问题是,我正在检查该项目是否具有一个类,如果这样做,我将减少点击次数。 但是它会不断减去项目,因此,例如,如果我连续四次单击项目1,则可以选择其他四个项目。
我该如何进行设置,以便用户可以继续单击某个项目,直到选择了最多3个项目,但是如果他们两次单击同一项目,它将删除该项目,使其处于初始状态?
var listItems = document.querySelectorAll('li'); var toggleClicked = function(event) { var _class = 'clicked'; if (-1 < this.className.indexOf(_class)) { this.classList.remove(_class); } else if (3 > document.getElementsByClassName(_class).length) { this.classList.add(_class); } else { console.warn('Oops !'); } console.log('No. elements:', document.getElementsByClassName(_class).length, 'with class:', _class); }; for (var i = 0; i < listItems.length; i++) { listItems[i].addEventListener('click', toggleClicked); }
.clicked { background-color: red; }
<p>select up to 3 of your favourite items below.</p> <ul id="mylist"> <li>item 1</li> <li>item 2</li> <li>item 3</li> <li>item 4</li> <li>item 5</li> </ul>
您可以使用clickcnt = Math.max(clickcnt - 1, 0);
-选择两个值中的最大值。 如果clickcnt - 1
低于0,则只会返回0。 请参阅MDN参考 。
添加一个类并将其删除后,检查是否存在一个类将失败,因为它不会删除属性,而只会删除该类。 如果使用classList
则可以使用this.classList.contains('clicked')
。
看到这个小提琴 。
var listItems = document.querySelectorAll('li');
var clickcnt = 0;
for (var i = 0; i < listItems.length; i++) {
listItems[i].addEventListener('click', function (event) {
if (this.classList.contains('clicked')) {
this.classList.remove('clicked');
clickcnt = Math.max(clickcnt - 1, 0);
} else if (clickcnt < 3) {
this.classList.add('clicked');
clickcnt++;
}
});
}
要清理一点,您可以只使用一个if
和classList
对象中的toggle
方法。 看到这个小提琴 :
var listItems = document.querySelectorAll('li');
for (var i = 0; i < listItems.length; i++) {
listItems[i].addEventListener('click', clicked);
}
function clicked() {
var clickCount = document.getElementsByClassName('clicked').length;
var el = this;
if (clickCount >= 3) {
this.classList.remove('clicked');
} else {
this.classList.toggle('clicked');
}
}
要拥有一个全局变量,您可以将其引用为其他函数中的点击计数,您可以将代码更改为:
var listItems = document.querySelectorAll('li');
var clickCount = 0;
for (var i = 0; i < listItems.length; i++) {
listItems[i].addEventListener('click', clicked);
}
function clicked() {
var el = this;
if (clickCount >= 3) {
this.classList.remove('clicked');
} else {
this.classList.toggle('clicked');
}
clickCount = document.getElementsByClassName('clicked').length;
}
试试这个-> http://jsfiddle.net/sumeetp1991/nybf6kk6/
var listItems = document.querySelectorAll('li');
var clickcnt = 0;
for(var i = 0; i < listItems.length; i++){
listItems[i].addEventListener('click', function(event) {
if(this.className){
this.className = "";
clickcnt--;
}
else if(clickcnt < 3) {
this.className = "clicked";
clickcnt++;
}
console.log(clickcnt);
});
}
像那样?
var listItems = document.querySelectorAll('li'); var clickcnt = 0; var myList = document.querySelector('#mylist'); myList.addEventListener('click', function(event) { var itemClassList, selected, canAdd; itemClassList = event.target.classList; canAdd = clickcnt < 3; if (itemClassList.contains('clicked')) { itemClassList.remove('clicked'); clickcnt -= 1; } else if (canAdd) { itemClassList.add('clicked'); clickcnt += 1; } });
.clicked { background-color:red; }
<p>select up to 3 of your favourite items below.</p> <ul id="mylist"> <li>item 1</li> <li>item 2</li> <li>item 3</li> <li>item 4</li> <li>item 5</li> </ul>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.