Opgelost Elementen tonen en verbergen via getElementById in Angular

Dit topic is als opgelost gemarkeerd

Wimpieoh

Gebruiker
Lid geworden
18 mrt 2008
Berichten
42
Met HTML en JavaScript heb ik onderstaand raamwerk voor een nieuwstoggle in mekaar gestoken. Bedoeling is dat klikken op een titel de inhoud toont en wanneer men op een andere titel klikt wordt de vorige inhoud weer verborgen en de nieuwe getoond. Hoe zou ik dit in Angular 17+ kunnen realiseren? Dank voor uw antwoord, Wim.

Code:
<script>
function maakLeeg() {
  for (var i = 1; i < 4; i++) {
    if (i < 10) {
      var id1 = "00" + i;
    } else if (i > 9 && i < 100) {
      var id1 = "0" + i;
    } else {
      var id1 = i.toString;
    }
    var x = document.getElementById(id1);
    x.style.display = "none";
  }
}
  
function toon(id2) {
  maakLeeg();
  var y = document.getElementById(id2);
  y.style.display = "block";  
}
</script>

<body onload="maakLeeg()">
<button id="btn1" onclick="maakLeeg()">Verberg nieuws</button>  
<article>
  <h2 onclick="toon('001')">tralala</h2>
  <div id="001">
  <p>Wij zullen er zijn zenne!</p>
  <img src="wimgoderis.jpg">
  </div>
</article>
<article>
  <h2 onclick="toon('002')">tralala</h2>
  <p id="002">Wij zullen er zijn zenne!</p>
</article>
<article>
  <h2 onclick="toon('003')">tralala</h2>
  <p id="003">Wij zullen er zijn zenne!</p>
</article>
</body>
 
Mogelijk helpt een door Copilot omgezet voorbeeld je verder. Zelf ken ik Angular niet. In de bijlage het antwoord van Copilot op jouw JS code.

edit. De ID mag officieel niet met een cijfer beginnen. Hier doen browsers in het algemeen niet zo moeilijk over maar het kan extra tijd kosten bij het debuggen (je hebt bijv. toString nodig).
 

Bijlagen

dit is een werkend in een totaal ander constructie maar je kan het extrageren

Code:
<div class="Callendar_month_item active" onmouseover="mytooltip_show('tooltip-25','item-25');" onmouseout="mytooltip_hide('tooltip-25');">
    <span class="status " id="item-25">
        <span class="bar">
            <a class="baritem" href="/plan/Week/?add&amp;year=2024&amp;month=12&amp;day=25">
                <img height="15" width="15" src="/layout/img/icons/a/add.svg" alt="add">
            </a>
            <br>
            <a class="baritem" href="/plan/Week/?view&amp;year=2024&amp;month=12&amp;day=25">
                <img height="15" width="15" src="/layout/img/icons/v/view.svg" alt="View this item">
            </a>
            <br>
        </span>
        <h2>25</h2>
    </span>
    <span class="items">  <span class="">X</span> </span>
    <div id="tooltip-25" class="mytooltip visible" style="top: 645px; left: 524px; visibility: hidden;"><!--visual hidden-->
         <li>
 <a class="baritem" href="./?edit&amp;id=279">
    <img height="15" width="15" src="/layout/img/icons/e/edit.svg" alt="Edit this item">
 </a>
 <a class="baritem" href="./?view&amp;id=279">
    <img height="15" width="15" src="/layout/img/icons/v/view.svg" alt="View this item">
 </a>
 <a class="baritem" href="./?delete&amp;id=279">
    <img height="15" width="15" src="/layout/img/icons/d/delete.svg" alt="Delete this item">
 </a>
 <a class="baritem" href="./?accound_id=00000000000000000004">
    <img height="15" width="15" src="/layout/img/icons/u/user.svg" alt="View profile.">
 </a>
  feestje  [ 2024-12-25-2024-12-25 ]
 [TYPE] =&gt; PUBLIC
</li>
    </div>
</div>

<script type="text/javascript" >
function mytooltip_show(tooltipId, parentId){
    it = document.getElementById(tooltipId);
    if ((it.style.top==''||it.style.top == 0)&&(it.style.left==''||it.style.left==0)){
        theSender=document.getElementById(parentId);
        it.style.top=(theSender.offsetHeight/18,5+theSender.offsetTop)+'px';
        it.style.left=(theSender.offsetWidth/1+theSender.offsetLeft)+'px';
    }
    it.style.visibility='visible';
}
function mytooltip_hide(id){
    document.getElementById(id).style.visibility='hidden';
}
</script>
Er zit nog één belangerijke fout in en dat is als je de pagina vergroot en verkleint dat de browser onterecht de positie onthoud en de tooltip op verkeerde plaats laat zien . ter info
 
tooltip bij onmouseover wordt door TS niet gevraagd 🤪
 
Bedankt Bron; na ietwat zoekwerk op internet heb ik de oplossing gevonden.
Vooreerst heb ik in home.component.css geplaatst:

Code:
article > div {
  display: none;
}
In home.component.html staat bijvoorbeeld:

Code:
<article>
  <h2 (click)="toon('n001')">tralala</h2>
  <div id="n001">
    <p>Wij zullen er zijn zenne!</p>
    <img src="../assets/img/kmsk4.jpeg">
  </div>
</article>
<article>
  <h2 (click)="toon('n002')">tralala</h2>
  <div id="n002">
    <p>Wij zullen er zijn zenne!</p>
  </div>
</article>
<article>
  <h2 (click)="toon('n003')">tralala</h2>
  <div id="n003">
    <p>Wij zullen er zijn zenne!</p>
  </div>
</article>

En in home.component.ts

Code:
import { Component, ElementRef } from '@angular/core';
...
export class HomeComponent {
  constructor(private elRef: ElementRef<HTMLElement>){}
 
  maakLeeg() {
    for (var i = 1; i < 4; i++) {
      let id1: string;
      if (i < 10) {
        id1 = "n00" + i;
      } else if (i > 9 && i < 100) {
        id1 = "n0" + i;
      } else {
        id1 = "n" + i;
      }
      let element = this.elRef.nativeElement.querySelector(`#${id1}`);
      if (element) {
        let fulID = document.getElementById(id1) as HTMLElement;
        fulID.style.display = 'none';
      }
    }
  }

  toon(id2: string) {
    this.maakLeeg();
    let element = this.elRef.nativeElement.querySelector(`#${id2}`);
    if (element) {
      let fulID = document.getElementById(id2) as HTMLElement;
      fulID.style.display = 'block';
    }
  }
}

En zo werkt het.
 
Als aantal articles (in de toekomst) kan veranderen:
JavaScript:
maakLeeg() {
  let eindeFor = document.querySelectorAll(`article > div`).length + 1;
  for (var i = 1; i < eindeFor; i++) {
 
Laatst bewerkt:
als je moet verbeteren kan je ook best ...
Code:
<h2  onclick="toon('n003')">tralala</h2>
werkt voor meerder browsers en meerdere versies
 
Terug
Bovenaan Onderaan