简体   繁体   English

我可以以更有效的方式编写这些事件侦听器吗?

[英]Could I write these event listeners in a more efficient way?

Hi I have created 9 event listeners that are very similar and I would like to write them in a more efficient manner if possible.嗨,我创建了 9 个非常相似的事件侦听器,如果可能的话,我想以更有效的方式编写它们。 each button opens up the same hidden form and populates the dropdown menu with a different value.每个按钮都会打开相同的隐藏表单并使用不同的值填充下拉菜单。

const ordermulch = document.getElementById('Mulch');
ordermulch.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 1;
});
const orderptopsoil = document.getElementById('prem-topsoil');
orderptopsoil.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 2;
});
const orderstopsoil = document.getElementById('screened-topsoil');
orderstopsoil.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 3;
});
const ordercgravel = document.getElementById('crushed-gravel');
ordercgravel.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 4;
});
const orderpgravel = document.getElementById('pea-gravel');
orderpgravel.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 5;
});
const orderrrock = document.getElementById('river-rock');
orderrrock.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 6;
});
const orderhpbed = document.getElementById('bedding');
orderhpbed.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 7;
});
const ordersand = document.getElementById('sand');
ordersand.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 8;
});
const ordergseed = document.getElementById('grass-seed');
ordergseed.addEventListener('click', () => {
    document.getElementById('order-form').style.display = "block";
    document.getElementById("input_9_11").selectedIndex = 9;
});

<select> boxes come pre-built with this functionality without you having to manually set the selectedindex each time an item is selected. <select>框预先构建了此功能,而无需在每次选择项目时手动设置selectedindex Instead of attaching the event to the click event of the individual selection items (stuff in the list), you can bind it to the <select> element's "change" listener and pull the selectedindex with much less code.无需将事件附加到单个选择项(列表中的内容)的单击事件,您可以将其绑定到<select>元素的“更改”侦听器并使用更少的代码拉取selectedindex

Example: assuming your html looks something like this...示例:假设您的 html 看起来像这样......

 var products = document.getElementById('select'); products.addEventListener('change', function(e) { var index = products.selectedIndex; console.log("Index: " + index + ' - ' + e.target.options[index].getAttribute('id')); document.getElementById('input_9_11').value = e.target.options[index].getAttribute('id'); })
 <form id="order-form"> <select id="select"> <option id="mulch">Mulch</option> <option id="prem-topsoil">Premium Topsoil</option> <option id="screened-topsoil">Screened Topsoil</option> <option id="crushed-gravel">Crushed Gravel</option> <option id="pea-gravel">Pea Gravel</option> <option id="river-rock">River Rock</option> <option id="bedding">Bedding</option> <option id="sand">Sand</option> <option id="grass-seed">Grass Seed</option> </select> <input type="text" id="input_9_11"> </form>

https://jsfiddle.net/0b8vz9fq/ https://jsfiddle.net/0b8vz9fq/

Make an array of all your IDs and then iterate it to add the event listeners:创建一个包含所有 ID 的数组,然后对其进行迭代以添加事件侦听器:

const ids = ['Mulch', 'prem-topsoil', 'screened-topsoil']; // ...rest of IDs

ids.forEach((id, index) => {
    const elem = document.getElementById(id);

    elem.addEventListener('click', () => {
        document.getElementById('order-form').style.display = "block";
        document.getElementById("input_9_11").selectedIndex = index + 1;
    });
})

You should also store order-form and input_9_11 in a variable instead of finding them on every iteration.您还应该将order-forminput_9_11存储在一个变量中,而不是在每次迭代时都找到它们。

This is simple, use loops!这很简单,使用循环!

Collect all your IDs in an array:将您的所有 ID 收集到一个数组中:

const ids = ['Mulch', 'prem-topsoil', 'screened-topsoil']; // and so on...

Loop through this array:循环遍历这个数组:

ids.forEach((value, i) => {
    // todo
});

For each iteration you have to get the element first:对于每次迭代,您必须首先获取元素:

const element = document.getElementById(value);

And now you can add the EventListener to this element:现在您可以将 EventListener 添加到此元素:

element.addEventListener('click', () => {
    document.getElementById('order-form').style.display = 'block';
    document.getElementById('input_9_11').selectedIndex = i+1;
});

All together:全部一起:

const ids = ['Mulch', 'prem-topsoil', 'screened-topsoil']; // and so on...
ids.forEach((value, i) => {
    const element = document.getElementById(value);
    element.addEventListener('click', () => {
        document.getElementById('order-form').style.display = 'block';
        document.getElementById('input_9_11').selectedIndex = i+1;
    });
});

Small side note: It's great that you're looking for optimizations and don't want to use redudant code.小旁注:您正在寻找优化并且不想使用冗余代码,这很好。 That's the only way to get better!只有这样才能变得更好!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM