CSS/JS Programmieren dass Link erst klickbar wenn?


06.08.2024, 19:57

Ergänzung: Ich verwende auch Jquery, nicht nur JS, vergessen zu schreiben. JS verstehe ich nicht so gut

3 Antworten

Hi Zebra321,

ersteinmal muss ich erwähnen das JQuery nichts anderes ist als JavaScript. JQuery ist ein JavaScript-Framework.

Ich würde das ganze mit JavaScript machen und nicht mit CSS. Und zwar kannst du mit JS abfragen ob ein bestimmtes Element ausgewählt wurde.

Hier Beispiele in JavaScript von mir:

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        let meinLink, meineCheckBox;
        document.addEventListener("DOMContentLoaded", init);
        function init() {
            meinLink = document.querySelector("#meinLink");
            meinLink.addEventListener("click", preventClick);
            meineCheckBox = document.querySelector("#meineCheckBox");
            meineCheckBox.addEventListener("change", changeLinkPrevent);
        }
        function changeLinkPrevent() {
            if(meineCheckBox.checked) {
                meinLink.removeEventListener("click", preventClick);
            } else {
                meinLink.addEventListener("click", preventClick);
            }
        }
        function preventClick(event) {
            event.preventDefault();
        }
    </script>
</head>
<body>
    <form id="meineForm">
        <input type="text" name="meinName" id="meinName" placeholder="Mein Name">
        <input type="checkbox" name="meineCheckBox" id="meineCheckBox">
    </form>
    <a href="seite2" id="meinLink">Weiter</a>
</body>
</html>

Im oberen Beispiel wird dem a-Element ein EventListener hinzufügt der eine Funktion Namens preventClick auslöst die wiederum verhindert das der Link weiterleitet. Wenn also die Checkbox aktiviert wurde, kann wird dieser EventListener für das a-Element entfernt und dadurch auch nicht die Aktion des Links unterdrückt. Fall zwischendurch wieder die checkbox das Häkchen entfernt wird, kommt auch wieder auf das a-Element der EventListener.

Viel Erfolg bei der Umsetzung.

Woher ich das weiß:Berufserfahrung – Ich bin gelernter Mediengestalter Digital und Print(IHK)

Alles was du dynamisch ändern willst, muss mit Javascript oder ähnlichem getan werden

Als Beispiel:

<form id="fragebogen">
     <label for="auswahl">Klick      etwas an:</label>
     <select id="auswahl"name="auswahl"> 
          <option value="">Bitte wählen...</option>
          <option value="option1">Option 1</option> 
          <option value="option2">Option 2</option>
     </select>
</form>
<a id="weiterLink" href="seite2.html" class="disabled"> 
     <div>Weiter</div>
</a>


<script>
     document.getElementById('auswahl').addEventListener('change', function() {
          var link = document.getElementById('weiterLink');
          if (this.value) {           link.classList.remove('disabled');
     } else { 
          link.classList.add('disabled');
     }
});
</script>

Und das hier wäre im Css:

.disabled { pointer-events: none; opacity: 0.5; }
Woher ich das weiß:Studium / Ausbildung – Offizielle Ausbildung im Bereich IT und Software

Zebra321 
Beitragsersteller
 06.08.2024, 19:54

Hallo vielen Dank für die Antwort. Leider habe ich Schwierigkeiten deine Antwort zu verstehen, weil ich 1.) keine Opacity verwenden will 2.) Jquery verwende und 3.) kein Formular erstelle, sondern nur div-Boxen - könntest du es entsprechen umschreiben, sodass ich verstehe, was du damit aussagen willst? Vielen Dank.

0
Glandorf  06.08.2024, 20:00
@Zebra321

Wie wärs damit?

<body>
     <div class="auswahl-box" data-wert="option1">Option 1</div>
     <divclass="auswahl-box" data-wert="option2">Option 2</div>

     <a id="weiterLink" href="seite2.html"class="disabled">
          <div>Weiter</div>
     </a>

     <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
     <script>     
          $(document).ready(function() {
               $('.auswahl-box').on('click', function() {
                    $('.auswahl-box').removeClass('selected'); 
                    $(this).addClass('selected');

                     $('#weiterLink').removeClass('disabled');
               });
          });
     </script>
</body>

Für den Style nimmst du das von oben.

1
Zebra321 
Beitragsersteller
 06.08.2024, 20:10
@Glandorf

Aahhh ok jetzt verstehe ich!!! Also ich kannte den Befehl: "pointer-events: none" ganz einfach nicht! Das ist ja mega cool! Jetzt habe ich es folgendermaßen geschrieben (der Knopf heißt "weiter" und "addClass continue" wenn if):

#weiter {pointer-events: none;}

.continue {pointer-events: all !important;}

Ist das so programmiertechnisch sauber?

Außerdem habe ich noch ein Problem. Vorher hatte ich

#weiter {cursor: not-allowed;}

drin stehen. Das funktioniert nicht mehr sobald ich pointer-events: none; hinzufüge. Wie löse ich das Problem? LG

0
Glandorf  07.08.2024, 10:13
@Zebra321

Du meinst im CSS?

Ich hoff ich versteh richtig, was du meinst. Probier das mal im CSS:

#weiter {
     pointer-events: none;
     cursor: not-allowed;
     color: gray;
}

#weiter.continue {
     pointer-events: auto; 
     cursor: pointer;
     color: black;
}

Sorry für die späte Antwort.

1
Zebra321 
Beitragsersteller
 07.08.2024, 11:38
@Glandorf

Ja im CSS. Hast du den Code ausprobiert? Bei mir funktioniert das eben nicht, dass im Normalzustand cursor: not-allowed; angezeigt wird, sobald pointer-events: none; aktiv ist. LG

1
Glandorf  07.08.2024, 13:13
@Zebra321

Nein, sorry, ich schreib den Code am Handy, deswegen ist der auch so schlecht formatiert.

Meine Idee wär jetzt vielleicht noch dem Ding einen Wrapper zu geben, vielleicht wirds dann was.

<div id="weiter-wrapper" class="disabled-wrapper"> 
     <a id="weiter" href="seite2.html"> 
          <div>Weiter</div> 
     </a> 
</div>

Und im Script statt der letzten Zeile:

$('#weiter').addClass('continue');
$('#weiter-wrapper').removeClass('disabled-wrapper');

Und im CSS den Cursor Pointer auf den .disabled-wrapper zu verschieben

#weiter {
     pointer-events: none; 
     color: gray;
}

#weiter.disabled-wrapper { 
     cursor: not-allowed;
}

Das gibt deinem Element basically einen „wrapper“, den man entfernt, indem man eine Option anklickt.

Das einzige Problem wäre jetzt noch, dass wenn man die Box deselectet, der Wrapper nicht wieder hinzugefügt wird. Weiß nicht ob du das willst.

1
Zebra321 
Beitragsersteller
 07.08.2024, 13:44
@Glandorf

Ein Wrapper ist immer eine Cheap Option, das ist klar, aber ich will nich nur für einen Cursor einen ganzen Wrapper erstellen. Ich hoffe immer auf einfache Lösungen. Ich hab sowieso schon DIVeritis, wie ich es immer nenne - zu viele Kästchen ineinander.

0
Glandorf  07.08.2024, 13:50
@Zebra321

Verstehe. Dann kann mans mit Js versuchen.

Nimm den alten Code, und füg das mal in das document.ready hinzu:

$('#weiter').on('mouseenter', function() {
     if (!$(this).hasClass('continue')) { 
          $(this).css('cursor', 'not-allowed');
     }
});

Und update dein Css:

#weiter {
     pointer-events: none;
}
#weiter.continue {
     pointer-events: auto;
}
0

Das Problem lässt sich leicht lösen, indem du ein Formular verwendest. Für einen Fragebogen, der Nutzereingaben verlangt, solltest du das eh in Erwägung ziehen. Dafür sind die Formularelemente schließlich da. Eine Drumherum-Lösung mit div-Boxen und JavaScript ist kein guter Ersatz.

Beispiel:

<form action="seite2.html">
  <label for="auswahl">Auswahl:</label>
  <select id="auswahl" required>
    <option disabled selected></option>
    <option>Option 1</option>
    <option>Option 2</option>
    <option>Option 3</option>
  </select>
  <button>Weiter</button>
</form>

Das Formular leitet auf die nächste Seite weiter, sobald der Nutzer die Auswahlbox ausgefüllt hat und auf den Button klickt. Das required-Attribut gibt hierbei die Auswahlbox als Pflichtfeld vor.

Das Aussehen des Buttons kannst du mit CSS deinen Vorstellungen entsprechend ändern.


Zebra321 
Beitragsersteller
 06.08.2024, 21:53

Das Problem hat sich schon ohne dieses dämliche (!) Formular gelöst! Div-Boxen sind viel besser als diese Formulare.

0
regex9  06.08.2024, 22:04
@Zebra321

Formulare sind explizit für die Aufnahme von Nutzereingaben ausgerichtet. Sie sind für Nutzer daher besser bedienbar. Auch für Entwickler sind sie nicht sonderlich schwer nutzbar, immerhin bieten sie wie man oben sieht bereits viele Features, ohne dass man dafür selbst unbedingt etwas zusätzlich programmieren muss. Ich kann daher nur empfehlen, sich damit näher zu befassen.

0
Zebra321 
Beitragsersteller
 06.08.2024, 22:31
@regex9

Bei Nutzereingaben wie Wörtern ja, bei einer reinen Auswahl durch einen Klick kann ich keinen Vorteil erkennen.

0