Home > Enterprise >  is there a way to handle a click event whithout assigning id?
is there a way to handle a click event whithout assigning id?

Time:09-07

i have a webpage full of buttons , for opening a modal with a description related to the button.. the webpage is for mobile repair service requests...

<button id="myBtn">Open Modal</button>
    <div id="myModal" >
        <div >
            <div >
                <div >
                    <img src="#" />
                </div>
                <div >
                    <h3 >
                        Breakge
                    </h3>
                    <div >
                        <div >Udskiftning af Skærm
                            <div >
                                <div >
                                    <p>Original Kvalitet </p><p >2299.99,-</p>
                                </div>
                                <div >
                                    <p>TopKvalitet </p><p >1199.99,-</p>
                                </div>
                                <div >
                                    <p>KobiKvalitet  </p><p >799.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Udskiftning af Batteri
                            <div >
                                <div >
                                    <p>Batteri </p><p >549,99,-</p>
                                </div>
                                <div >
                                    <p>TopKvakitet Batteri </p><p >649.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Udskiftning af Bagglas
                            <div >
                                <div >
                                    <p>Bagglas </p><p >999.99,-</p>
                                </div>
                                <div >
                                    <p>Bagglas og Ramme </p><p >1699.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Udskiftning af Højtaler
                            <div >
                                <div >
                                    <p>Ørehøjtaler </p><p >599.99,-</p>
                                </div>
                                <div >
                                    <p>Højtaler (Musik) </p><p >749.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Udskiftning af Kamera
                            <div >
                                <div >
                                    <p>FrontKamera </p><p >899.99,-</p>
                                </div>
                                <div >
                                    <p>Bagkamera </p><p >1299.99,-</p>
                                </div>
                                <div >
                                    <p>Lins </p><p >349.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Udskiftning af Ladestik
                            <div >
                                <div >
                                    <p>Ladestik </p><p >749.99,-</p>
                                </div>
                                <div >
                                    <p>Vibrator </p><p >749.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Udskiftning af knapper
                            <div >
                                <div >
                                    <p>Tænd/Sluk funktion </p><p >749.99,-</p>
                                </div>
                                <div >
                                    <p>Volume/Lydløs knapper </p><p >749.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Udskiftning af Vibrator
                            <div >
                                <div >
                                    <p>Vibrator </p><p >749.99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Ander
                            <div >
                                <div >
                                    <p>Fejlfinding </p><p >349.99,-</p>
                                </div>
                                <div >
                                    <p>Softwer / Gendannekse </p><p >349.99,-</p>
                                </div>
                                <div >
                                    <p> Microchip </p><p >fra 799,99,-</p>
                                </div>
                            </div>
                        </div>
                        <div >Tilbehør
                            <div >
                                <div >
                                    <p>PanserGlas </p><p >249.99,-</p>
                                </div>
                                <div >
                                    <p>Cover </p><p >249.99,-</p>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div  id="right">
                    <h3 >
                        Prices
                    </h3>
                    <div >
                        <div >
                            Place Description Title Here
                        </div>
                        <div >
                        </div>
                    </div>
                    <div >
                        <div >
                            <input type="button" id="btnClose"  value="Close">
                        </div>
                    </div>
                </div>
            </div>
            <div >
            </div>
        </div>
        </div>

there is ten sectors , and for each of them it will show another div with description and details

<div  id="sector1">
                <div >
                    
                    <p>Original Kvalitet </p><p >2299.99,-</p>
                    </div>              
                <div >
            <p>TopKvalitet </p><p >1199.99,-</p>
                    </div>
                    <div >
            <p>KobiKvalitet  </p><p >799.99,-</p>
                    </div>
                    
            </div>

i'm using this code to show and hide each div(sector)

var modal = document.getElementById("myModal");
var btn = document.getElementById("myBtn");
var btnClose = document.getElementById("btnClose");

var divState = {};
function showhidesector(id,id2) {
    if (document.getElementById) {
        var divid = document.getElementById(id);
        divState[id] = (divState[id]) ? false : true;
        for (var div in divState){
            if (divState[div] && div != id){ 
                document.getElementById(div).style.display = 'none'; // hide
                divState[div] = false; 
            }
        }
        divid.style.display = (divid.style.display == 'block' ? 'none' : 'block');
    }
}

so my question is , is there anyway to achieve this without assigning id's for each element ? because i have to create a modal for every mobile device (about 120 devices)

CodePudding user response:

Nest div.sector within div.click. Use event delegation. If div.click is clicked add a class that hides all non hidden div.sector within div.hyperclicks. Then remove that hidden class from div.sector from the clicked element.

document.addEventListener(`click`, handle);

function handle(evt) {
  if (evt.target.matches(`.click`)) {
    evt.target.closest(`.hyperclicks`).querySelectorAll(`div .sector:not(.hidden)`)
      .forEach(d => d.classList.add(`hidden`));
    evt.target.querySelector(`.sector`).classList.remove(`hidden`);
  }
}
.hidden {
  display: none;
}

.sector {
  margin-left: 2rem;
  color: green;
}

.click {
  margin: 0.8rem 0;
  cursor: pointer;
}
<div >
  <div >Udskiftning af Skærm
    <div >
      <div >
        <div>Original Kvalitet </div>
        <div >2299.99,-</div>
      </div>
      <div >
        <div>TopKvalitet </div>
        <div >1199.99,-</div>
      </div>
      <div >
        <div>KobiKvalitet </div>
        <div >799.99,-</div>
      </div>
    </div>
  </div>

  <div >Udskiftning af Batteri
    <div >
      <div >
        <div>Original Kvalitet </div>
        <div >2199.99,-</div>
      </div>
      <div >
        <div>TopKvalitet </div>
        <div >1299.99,-</div>
      </div>
      <div >
        <div>KobiKvalitet </div>
        <div >699.99,-</div>
      </div>
    </div>
  </div>
</div>

CodePudding user response:

You can simplify your code by using querySelectorAll() to retrieve all the p.click elements, then looping through them to add the same event handler to each one.

The related sector can targeted by using a data attribute to store the selector for each element. Try this:

document.querySelectorAll('p.click').forEach(el => {
  el.addEventListener('click', e => {
    let sectorId = e.target.dataset.sectorid;
    document.querySelector(sectorId).classList.toggle('show');
  });
});
.sector { display: none; }
.sector.show { display: block; }
<div >
  <p  id="click1" data-sectorid="#sector1">Udskiftning af Skærm</p>
  <p  id="click2" data-sectorid="#sector2">Udskiftning af Batteri</p>
  <!-- other p elements here... -->
</div>

<div  id="sector1">
  <div >
    <p>Original Kvalitet (SECTOR 1)</p>
    <p >2299.99,-</p>
  </div>
  <div >
    <p>TopKvalitet </p>
    <p >1199.99,-</p>
  </div>
  <div >
    <p>KobiKvalitet </p>
    <p >799.99,-</p>
  </div>
</div>

<div  id="sector2">
  <div >
    <p>Original Kvalitet (SECTOR 2)</p>
    <p >199.99,-</p>
  </div>
  <div >
    <p>TopKvalitet </p>
    <p >299.99,-</p>
  </div>
  <div >
    <p>KobiKvalitet </p>
    <p >399.99,-</p>
  </div>
</div>

  • Related