如何组合多个onclick events/elements
How to combine multiple onclick events/elements
我有这个有多个按钮的切换功能。
var button1 = document.querySelector('#button1');
var button2 = document.querySelector('#button2');
var button3 = document.querySelector('#button3');
var toggleState = function (elem, one, two) {
var elem = document.querySelector(elem);
elem.setAttribute('data-state', elem.getAttribute('data-state') === one ? two : one); //ternary operator
};
button1.onclick = function (e) {
toggleState('#div1', 'open', 'closed');
e.preventDefault();
};
button2.onclick = function (e) {
toggleState('#div2', 'open', 'closed');
e.preventDefault();
};
button3.onclick = function (e) {
toggleState('#div3', 'open', 'closed');
e.preventDefault();
};
我试过 querySelectorAll 来组合变量,但它不起作用。我想我知道为什么。但我想不出更雄辩地编写脚本的方法。 (雄辩地刮擦。可敬是一个更好的词)
如何组合变量和onclicks,使代码不那么冗余?
考虑类似于下面的解决方案。您可以循环处理每个元素,而不是为每个元素复制事件处理程序。
如果元素 ID 一致,您可以通过仅指定切换次数并动态生成 ID 来使其更简洁。
var toggles = {
'#button1': '#div1',
'#button2': '#div2',
'#button3': '#div3'
};
Object.keys(toggles).forEach(function(toggle) {
document.querySelector(toggle).onclick = function (e) {
toggleState(toggles[toggle], 'open', 'closed');
e.preventDefault();
};
});
function toggleState(elem, one, two) {
var elem = document.querySelector(elem);
elem.setAttribute('data-state', elem.getAttribute('data-state') === one ? two : one);
};
这是一种解决方案:
您需要获取 button
个元素并为它们触发 onclick
事件。
您可以使用循环来代替每个按钮触发 onclick
事件处理程序。
阅读更多关于 bind function
var buttons=document.getElementsByTagName('button');
var toggleState = function (elem, one, two) {
var elem = document.querySelector(elem);
elem.setAttribute('data-state', elem.getAttribute('data-state') === one ? two : one); //ternary operator
};
for(var i=0;i<buttons.length;i++){
var button=document.querySelector('#button'+(i+1));
button.onclick=(function(index){;
toggleState('#div'+index,'open','closed');
}).bind(this,i+1);
}
我有这个有多个按钮的切换功能。
var button1 = document.querySelector('#button1');
var button2 = document.querySelector('#button2');
var button3 = document.querySelector('#button3');
var toggleState = function (elem, one, two) {
var elem = document.querySelector(elem);
elem.setAttribute('data-state', elem.getAttribute('data-state') === one ? two : one); //ternary operator
};
button1.onclick = function (e) {
toggleState('#div1', 'open', 'closed');
e.preventDefault();
};
button2.onclick = function (e) {
toggleState('#div2', 'open', 'closed');
e.preventDefault();
};
button3.onclick = function (e) {
toggleState('#div3', 'open', 'closed');
e.preventDefault();
};
我试过 querySelectorAll 来组合变量,但它不起作用。我想我知道为什么。但我想不出更雄辩地编写脚本的方法。 (雄辩地刮擦。可敬是一个更好的词)
如何组合变量和onclicks,使代码不那么冗余?
考虑类似于下面的解决方案。您可以循环处理每个元素,而不是为每个元素复制事件处理程序。
如果元素 ID 一致,您可以通过仅指定切换次数并动态生成 ID 来使其更简洁。
var toggles = {
'#button1': '#div1',
'#button2': '#div2',
'#button3': '#div3'
};
Object.keys(toggles).forEach(function(toggle) {
document.querySelector(toggle).onclick = function (e) {
toggleState(toggles[toggle], 'open', 'closed');
e.preventDefault();
};
});
function toggleState(elem, one, two) {
var elem = document.querySelector(elem);
elem.setAttribute('data-state', elem.getAttribute('data-state') === one ? two : one);
};
这是一种解决方案:
您需要获取 button
个元素并为它们触发 onclick
事件。
您可以使用循环来代替每个按钮触发 onclick
事件处理程序。
阅读更多关于 bind function
var buttons=document.getElementsByTagName('button');
var toggleState = function (elem, one, two) {
var elem = document.querySelector(elem);
elem.setAttribute('data-state', elem.getAttribute('data-state') === one ? two : one); //ternary operator
};
for(var i=0;i<buttons.length;i++){
var button=document.querySelector('#button'+(i+1));
button.onclick=(function(index){;
toggleState('#div'+index,'open','closed');
}).bind(this,i+1);
}