wie ändert man die klasse eines elements mit javascript?
<p>wie kann ich eine klasse eines html-elements als reaktion auf ein <code>onclick</code>-ereignis mithilfe von javascript ändern?</p>
<h2>moderne html5-techniken zum ändern von klassen</h2><p>moderne browser haben <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist"><strong>classlist</strong></a> hinzugefügt, das methoden zur verfügung stellt, mit denen klassen leichter ohne bibliotheken bearbeitet werden können:</p><pre><code>document.getelementbyid("myelement").classlist.add('myclass'); document.getelementbyid("myelement").classlist.remove('myclass'); if ( document.getelementbyid("myelement").classlist.contains('myclass') ) document.getelementbyid("myelement").classlist.toggle('myclass'); </code></pre><p>leider funktionieren diese in internet explorer vor version 10 nicht, obwohl es ein <a href="http://en.wikipedia.org/wiki/shim\_(computing)">shim</a> gibt, um die unterstützung für ie8 und ie9 hinzuzufügen, die unter <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist">diese seite</a> verfügbar ist. es wird jedoch immer mehr <a href="http://caniuse.com/#feat=classlist">unterstützt</a> .</p><h2>einfache browserübergreifende lösung</h2><p>die standard-javascript-methode zur auswahl eines elements ist <a href="https://developer.mozilla.org/en-us/docs/dom/document.getelementbyid"><code>document.getelementbyid("id")</code></a> . dies wird in den folgenden beispielen verwendet. sie können elemente natürlich auch auf andere weise erhalten. in der richtigen situation können sie stattdessen einfach <code>this</code> verwenden ins detail geht dies nicht in den rahmen der antwort.</p><h3>so ändern sie alle klassen für ein element:</h3><p>um alle vorhandenen klassen durch eine oder mehrere neue klassen zu ersetzen, legen sie das classname-attribut fest:</p><pre><code>document.getelementbyid("myelement").classname = "myclass"; </code></pre><p>(sie können eine durch leerzeichen getrennte liste verwenden, um mehrere klassen anzuwenden.)</p><h3>so fügen sie einem element eine zusätzliche klasse hinzu:</h3><p>um einem element eine klasse hinzuzufügen, ohne vorhandene werte zu entfernen/zu beeinflussen, fügen sie ein leerzeichen und den neuen klassennamen wie folgt hinzu:</p><pre><code>document.getelementbyid("myelement").classname += " myclass"; </code></pre><h3>so entfernen sie eine klasse aus einem element:</h3><p>um eine einzelne klasse zu einem element zu entfernen, ohne andere potenzielle klassen zu beeinflussen, ist ein einfacher regex-ersetzen erforderlich:</p><pre><code>document.getelementbyid("myelement").classname = document.getelementbyid("myelement").classname.replace ( /(?:^|\s)myclass(?!\s)/g , '' ) /* code wrapped for readability - above is all one statement */ </code></pre><p>eine erklärung dieser regex lautet wie folgt:</p><pre><code>(?:^|\s) # match the start of the string, or any single whitespace character myclass # the literal text for the classname to remove (?!\s) # negative lookahead to verify the above is the whole classname # ensures there is no non-space character following # (i.e. must be end of string or a space) </code></pre><p>das flag <code>g</code> weist das ersetzen an, nach bedarf zu wiederholen, falls der klassenname mehrmals hinzugefügt wurde.</p><h3>so prüfen sie, ob eine klasse bereits auf ein element angewendet wurde:</h3><p>der gleiche reguläre ausdruck, der oben zum entfernen einer klasse verwendet wurde, kann auch zur überprüfung verwendet werden, ob eine bestimmte klasse vorhanden ist:</p><pre><code>if ( document.getelementbyid("myelement").classname.match(/(?:^|\s)myclass(?!\s)/) ) </code></pre><p><br/></p><h3>zuweisen dieser aktionen zu onclick-ereignissen:</h3><p>es ist zwar möglich, javascript direkt in die html-ereignisattribute (z. b. <code>onclick="this.classname+=' myclass'"</code>) zu schreiben, dies wird jedoch nicht empfohlen. insbesondere bei größeren anwendungen wird durch die trennung von html-markup von javascript-interaktionslogik ein wartungsfähigerer code erzielt.</p><p>der erste schritt dazu ist das erstellen einer funktion und das aufrufen der funktion im onclick-attribut. beispiel:</p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } &lt;/script&gt; ... &lt;button onclick="changeclass()"&gt;my button&lt;/button&gt; </code></pre><p><sub><em>(es ist nicht erforderlich, dass dieser code in skript-tags enthalten ist. dies ist lediglich der kürze halber als beispiel gedacht. das einschließen von javascript in eine andere datei ist möglicherweise geeigneter.)</em></sub></p><p>der zweite schritt besteht darin, das onclick-ereignis aus dem html-code in javascript zu verschieben, beispielsweise mit <a href="https://developer.mozilla.org/en-us/docs/dom/element.addeventlistener">addeventlistener</a> </p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } window.onload = function(){ document.getelementbyid("myelement").addeventlistener( 'click', changeclass); } &lt;/script&gt; ... &lt;button id="myelement"&gt;my button&lt;/button&gt; </code></pre><p>(beachten sie, dass der window.onload-teil erforderlich ist, damit der inhalt dieser funktion <em>ausgeführt wird, nachdem der html-code</em> vollständig geladen wurde. andernfalls ist das myelement möglicherweise nicht vorhanden, wenn der javascript-code aufgerufen wird, sodass die zeile fehlschlägt .)</p><p><br/></p><h2>javascript frameworks und bibliotheken</h2><p>der obige code ist alles in standard-javascript enthalten. es ist jedoch üblich, entweder ein framework oder eine bibliothek zu verwenden, um allgemeine aufgaben zu vereinfachen und von behobenen fehlern und edge-fällen zu profitieren, an die sie beim schreiben des codes nicht denken.</p><p>während einige leute es für übertrieben halten, ein ~ 50 kb-framework für das einfache ändern einer klasse hinzuzufügen, ist die überlegung, wenn sie umfangreiche javascript-arbeiten ausführen oder etwas, das ungewöhnliches cross-browser-verhalten hat, eine überlegung wert.</p><p><em>(in groben zügen handelt es sich bei einer bibliothek um eine reihe von werkzeugen, die für eine bestimmte aufgabe entwickelt wurden, während ein framework im allgemeinen mehrere bibliotheken enthält und eine reihe von aufgaben ausführt.)</em></p><p>die obigen beispiele wurden im folgenden mit <a href="http://jquery.com">jquery</a> wiedergegeben, wahrscheinlich der am häufigsten verwendeten javascript-bibliothek (obwohl es auch andere gibt, die es zu untersuchen gilt).</p><p>(beachten sie, dass <code>$</code> hier das jquery-objekt ist.)</p><h3>klassen mit jquery ändern:</h3><pre><code>$('#myelement').addclass('myclass'); $('#myelement').removeclass('myclass'); if ( $('#myelement').hasclass('myclass') ) </code></pre><p>darüber hinaus bietet jquery eine verknüpfung zum hinzufügen einer klasse, wenn sie nicht angewendet wird, oder zum entfernen einer klasse, die folgendes ausführt:</p><pre><code>$('#myelement').toggleclass('myclass'); </code></pre><p><br/></p><h3>zuweisen einer funktion zu einem klickereignis mit jquery:</h3><pre><code>$('#myelement').click(changeclass); </code></pre><p>oder, ohne eine id zu benötigen:</p><pre><code>$(':button:contains(my button)').click(changeclass); </code></pre><p><br/></p>
<p>geben sie dem element einen <code>display:block</code> oder ändern sie die <code>span</code> in ein blockelement wie <code>div</code>.</p> <p>sie können mit <code>response.redirect()</code> von einer seite zu einer anderen umleiten.</p> <ul> <li> <p><strong>wählen sie option 1, wenn</strong> die site enthält 'einfache' daten. zum beispiel einfacher text, ein kommentar oder etwas öffentliches</p> </li> <li> <p><strong>wählen sie option 3, wenn</strong> sie möchten nicht, dass der benutzer seitenelemente versehentlich ändert. zum beispiel würde ich in einem buchhaltungsprogramm definitiv option 3 verwenden, aber in einer einfachen notizblock-app (insbesondere auf mobilgeräten) würde ich definitiv option 1 wählen.</p> </li> </ul> <pre><code>obj = obj.getclass().getsuperclass().cast(obj); </code></pre><p>diese zeile entspricht nicht ihren erwartungen. das casting eines <code>object</code> ändert es nicht wirklich, es weist den compiler lediglich an, es als etwas anderes zu behandeln.</p><p>z.b. sie können ein <code>list</code> in ein <code>collection</code> umwandeln, es bleibt jedoch weiterhin ein <code>list</code>.</p><p>das durchlaufen der superklassen, um auf felder zuzugreifen, funktioniert jedoch ohne casting:</p><pre><code>class&lt;?&gt; current = yourclass; while(current.getsuperclass()!=null){ // we don't want to process object.class // do something with current's fields current = current.getsuperclass(); } </code></pre><p>übrigens, wenn sie zugriff auf das spring framework haben, gibt es eine praktische methode zum durchlaufen der felder einer klasse und aller übergeordneten klassen:<br> <a href="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/reflectionutils.html#dowithfields%28java.lang.class,%20org.springframework.util.reflectionutils.fieldcallback%29"><code>reflectionutils.dowithfields(baseclass, fieldcallback)</code></a> <br> (siehe auch meine vorherige antwort: <a href="https://stackoverflow.com/a/3567968/342852">zugriff auf private geerbte felder über reflection in java</a> )</p> <p> <a href="http://docs.oracle.com/javase/tutorial/java/javaoo/accesscontrol.html">das offizielle tutorial</a> kann für sie von nutzen sein.</p><pre> \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ | │ klasse │ paket │ unterklasse │ unterklasse │ welt | | │ │ │ (gleiche packung) │ (verschiedene packungen) │ | | ───────────┼───────┼─────────┼ ──────────┼──────────┼──────── | | public │ + │ + │ + │ + │ + | | ───────────┼───────┼─────────┼──────────┼─── ───────┼──────── | | protected │ + │ + │ + │ + │ | | ───────────┼───────┼─────────┼──────────┼─── ───────┼──────── | | kein modifikator│ + │ + │ + │ │ | | ───────────┼───────┼─────────┼──────────┼─── ───────┼──────── | | privat │ + │ │ │ │ | | \_\_\_\_\_\_\_\_\_\_\_ | \_\_\_\_\_\_\_ | \_\_\_\_\_\_\_\_\_ | \_\_\_\_\_\_\_\_\_\_ | \_\_\_\_\_\_\_\_\_\_ | \_\_\_\_\_\_\_\_ | +: zugänglich leer: nicht zugänglich </pre> <p>der von drupal 7) verwendete javascript-code lautet wie folgt:</p><pre><code>drupal.attachbehaviors = function (context, settings) { context = context || document; settings = settings || drupal.settings; // execute all of them. $.each(drupal.behaviors, function () { if ($.isfunction(this.attach)) { this.attach(context, settings); } }); }; </code></pre><p>drupal 6 verwendet einen ähnlichen code:</p><pre><code>drupal.attachbehaviors = function(context) { context = context || document; if (drupal.jsenabled) { // execute all of them. jquery.each(drupal.behaviors, function() { this(context); }); } }; </code></pre><p>wenn javascript garantieren würde, dass objekt-/array-eigenschaften immer in derselben reihenfolge durchlaufen werden, in der sie hinzugefügt werden, werden die werte von <code>jquery.each()</code> an die funktion übergeben, die als zweiter parameter in derselben reihenfolge verwendet wird, in der sie eingefügt werden das array wurde als erster parameter übergeben.<br> dies würde bedeuten, dass das erste in <code>drupal.behaviors</code> eingefügte verhalten zuerst ausgeführt wird.<br> in diesem fall können sie ein geringeres gewicht verwenden, damit die von ihrem modul definierten verhaltensweisen zuerst ausgeführt werden können. wenn sie möchten, dass sie vor den anderen ausgeführt werden, sollte das modulgewicht auf -50 eingestellt werden. andere werte können auch funktionieren. wenn sie drupal 7, <a href="https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal\_add\_js/7.x">drupal\_add\_js ()</a> verwenden, können sie dem javascript-code eine gewichtung zuordnen. javascript-code mit einer geringeren gewichtung wird zuerst in der html-ausgabe angezeigt ist nicht möglich mit drupal 6, dachte.</p><p>javascript garantiert nicht, dass eigenschaften in derselben reihenfolge durchlaufen werden, in der sie hinzugefügt wurden. dies bedeutet, dass verschiedene javascript-implementierungen dieselben eigenschaften in einer anderen reihenfolge aufweisen. dies bedeutet auch, dass sich dieselbe reihenfolge in verschiedenen versionen desselben browsers ändern kann.</p> <p>diese benutzeroberfläche muss folgendes unterstützen:</p><ol> <li>jetzt aktualisieren.</li> <li>countdown bis zur nächsten aktualisierung (falls automatisch).</li> <li>manuell/auto umschalten.</li> <li>intervall für auto einstellen.</li> </ol><p>ich denke, sie möchten die schaltfläche "aktualisieren" in ruhe lassen und ihre funktionalität nicht überlasten. aktualisieren bedeutet aktualisieren. benutzer bekommen das.</p><p>die anderen funktionen könnten in einer einzigen benutzeroberfläche zusammengefasst werden. der countdown-bereich zeigt entweder eine dekrementierungszeit (wenn automatisch) oder nichts (oder "aus"), wenn im manuellen modus. eine dropdown-steuerung oder gangsteuerung kann intervalloptionen bieten (wie bereits von patrick vorgeschlagen), wobei "keine" oder "manuell" eine option ist. wenn der benutzer "manuell" wählt, ist die automatische aktualisierung deaktiviert. wenn er einen numerischen wert wählt, ist die automatische aktualisierung in diesem intervall aktiviert.</p> <p>die funktion, die sie benötigen, wurde in joomla 3.3.x eingeführt. sie können jetzt showon = "show\_label: 1" verwenden.</p><p>den pr, der die funktionalität eingeführt hat, finden sie hier: <a href="https://github.com/joomla/joomla-cms/pull/3127">https://github.com/joomla/joomla-cms/pull/3127</a> </p> <ol> <li> <p>bearbeiten sie die ansicht und fügen sie der seite einen filter hinzu:</p> <ul> <li><strong>drupal 6 :</strong> dritte spalte, abschnitt heißt <em> filter </em></li> <li><strong>drupal 7 :</strong> erste spalte, abschnitt heißt <em> filterkriterien </em></li> </ul> </li> <li> <p>wenn sie den filter konfigurieren, möchten sie ihn verfügbar machen:</p> <ul> <li><strong>drupal 6 :</strong> klicken sie oben rechts im konfigurationsbereich auf die schaltfläche <em> expose </em></li> <li><strong>drupal 7 :</strong> check <em> setzen sie diesen filter den besuchern zur verfügung, damit sie ihn ändern können </em></li> </ul> </li> <li> <p>ajax aktivieren:</p> <ul> <li><strong>drupal 6 :</strong> <em> ajax verwenden </em> befindet sich unter <em> grundeinstellungen </em> in der ersten spalte</li> <li><strong>drupal 7 :</strong> <em> ajax verwenden </em> steht unter <em> erweitert </em> → <em> andere </em> in der dritten spalte</li> </ul> </li> </ol><p>wenn die ansicht gespeichert ist, gibt es jetzt ein formular, mit dem benutzer die ansicht dynamisch über ajax filtern können.</p> <p>wie speichern sie diese werte? scheint ein array zu sein, das wie folgt angezeigt werden sollte:</p><pre><code>&lt;?php foreach ($params-&gt;get('mylistvalue') as $value) : ?&gt; &lt;?php echo $value; ?&gt; &lt;?php endforeach; ?&gt; </code></pre>