Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Themes & Theming ›

[gelöst] Checkbox values als body-Klasse

Eingetragen von stixer2 (113)
am 21.12.2015 - 16:06 Uhr in
  • Themes & Theming
  • Drupal 7.x

Hi.

Ich habe ein Problem mit jQuery… vielleicht kann mir jemand helfen.
Ich habe eine checkbox und möchte den jeweils aktiven value als body-Klasse ausgeben.
Ich habe das getestet in einer einfachen html-Seite, klappt wunderbar. Siehe hier:

<script type="text/javascript">
    $(function () {
      $('input[name="some"]').change(function () {
        if ($('input:checked').length) {
          var chkId = '';
          $('input:checked').each(function () {
            chkId += $(this).val() + ",";
          });
          chkId = chkId.slice(0, -1);
  $('body').addClass('radio-class-' + $(this).attr("value"));
        }
        else {
          $('body').removeClass('radio-class-' + $(this).attr("value"));
        }
      });

    });
  </script>
  <div>
    <input type="checkbox" class="chkNumber" name="some" value="1" />One<br />
    <input type="checkbox" class="chkNumber" name="some" value="2" />Two<br />
    <input type="checkbox" class="chkNumber" name="some" value="3" />Three<br />
    <input type="checkbox" class="chkNumber" name="some" value="4" />Four<br />
    <input type="checkbox" class="chkNumber" name="some" value="5" />Five<br /><br />
  </div>

Jetzt wollte ich das analog in Drupal einbauen, mit folgenden Problemen:
* Es wird immer nur der erste Klick – also der Wert des zuerst angeklickten inputs – in die body-Klasse übernommen.
* Bei erneutem Klick wird die Klasse nicht gelöscht.

Kann das an Ajax liegen? Ist irgendwas nicht kompatibel mit Drupals jQuery-Syntax?

Hier noch das Script in Drupal:

<script>
(function ($) {

$(function () {
$('input[name="field_landkreis_e__tid[]"]').change(function () {
if ($('input:checked').length) {
var chkId = '';
$('input:checked').each(function () {
chkId += $(this).val() + ",";
});
chkId = chkId.slice(0, -1);
$('body').addClass('kreis-' + $(this).attr("value"));
}
else {
$('body').removeClass('kreis-' + $(this).attr("value"));
}
});
});

})(jQuery);
</script>

Ich wäre sehr dankbar für Hilfe!

‹ [gelöst] Haupt-Seiteninhalt erscheint nicht [gelöst] Checkbox values als body-Klasse ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat:Kann das an Ajax

Eingetragen von Ionit (1802)
am 21.12.2015 - 16:58 Uhr
Zitat:

Kann das an Ajax liegen?

Ja - das liegt an Ajax! Du musst hier mit .on arbeiten (http://api.jquery.com/on/)

http://stackoverflow.com/questions/9344306/jquery-click-doesnt-work-on-a...

Oder alternativ (über einen Umweg) mit .ajaxSuccess() (http://api.jquery.com/ajaxsuccess/)

  • Anmelden oder Registrieren um Kommentare zu schreiben

Also damit bekomme ich

Eingetragen von stixer2 (113)
am 21.12.2015 - 17:49 Uhr

Also damit bekomme ich dasselbe Ergebnis:

<script>
jQuery(document).ready(function($){

$('input[name="field_landkreis_e__tid[]"]').on('click', function() {
if ($('input:checked').length) {
var chkId = '';
$('input:checked').each(function () {
chkId += $(this).val() + ",";
});
chkId = chkId.slice(0, -1);
$('body').addClass('kreis-' + $(this).attr("value"));
}
else {
$('body').removeClass('kreis-' + $(this).attr("value"));
}
});
});

</script>

Bin noch totaler Anfänger, kann mir wer genauer sagen, wie ich das schreiben muss?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo, ich bin auch kein

Eingetragen von Ionit (1802)
am 21.12.2015 - 18:25 Uhr

Hallo,

ich bin auch kein jQuery-Geek und brauche auch immer ewiglang um das alles zum laufen zu bringen.

Probiere das doch erstmal ganz einfach mit Alert (und dann hangele dich durch). Verwende auch Firebug - dort kannst Du Dir unter "Konsole" eventuell auftretende Fehler anzeigen lassen.

<script>
jQuery(document).ready(function($) {
$('input[name="field_landkreis_e__tid[]"]').on('click', function() {
alert('Test!');
});
});
</script>

Aus der Ferne kann ich dazu nichts weiter sagen da ich mir andernfalls jetzt extra ein View mit Checkboxen anlegen und selbst testen müsste. Dazu fehlt mir aber momentan die Zeit.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Probier es mal so. Gesetzt

Eingetragen von Stefan.Korn (286)
am 22.12.2015 - 08:25 Uhr

Probier es mal so. Gesetzt der Code funktioniert auf einer Plain-HTML-Seite, sollte er so auch in Drupal funktionieren.

(function ($) {
$(document).ready(function() {


      $('input[name="some"]').change(function () {
        if ($('input:checked').length) {
          var chkId = '';
          $('input:checked').each(function () {
            chkId += $(this).val() + ",";
          });
          chkId = chkId.slice(0, -1);
  $('body').addClass('radio-class-' + $(this).attr("value"));
        }
        else {
          $('body').removeClass('radio-class-' + $(this).attr("value"));
        }
      });



})
})(jQuery);

Was Ajax angeht: Du aktualisiert in Drupal nicht irgendwie den Content per Ajax, also z. B. die Checkboxen? Nur dann, wäre das Thema (http://stackoverflow.com/questions/9344306/jquery-click-doesnt-work-on-a...) relevant. Im Normalfall nicht.

  • Anmelden oder Registrieren um Kommentare zu schreiben

brauche auch immer

Eingetragen von stixer2 (113)
am 22.12.2015 - 09:35 Uhr
Zitat:

brauche auch immer ewiglang

Das kommt mir sehr bekannt vor… ;)

Zitat:

unter "Konsole" eventuell auftretende Fehler anzeigen

Guter Tipp, bislang hatte ich FireBug nur für CSS im Fokus.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: Probier es mal so. Das

Eingetragen von stixer2 (113)
am 22.12.2015 - 09:44 Uhr
Zitat:

Probier es mal so.

Das skript ist doch genau so, wie ich das zusammengebastelt hatte, oder? Im Prinzip funktioniert das, nur wird nur die erste Klasse übergeben – removeClass funktioniert aber auch nicht.

Zitat:

Du aktualisiert in Drupal nicht irgendwie den Content per Ajax, also z. B. die Checkboxen?

Doch, Ajax brauche ich auch, wegen dem schönen loader-icon… und weil die Filter direkt nach Eingabe übergeben werden. Ohne so ein icon, klicken die user mglw. wie wild und löschen unbeabsichtigt vorige Filter.

Aber auch ohne Ajax… bei Klick übergibt das script eine Klasse, dann lädt die Seite und die Klasse ist wieder verschwunden. Ohne Ajax kann ich auch nicht testen, ob überhaupt mehrere Klassen übergeben werden.
Ich habe schon event.preventDefault probiert, dann wird der zweite Klick aber gar nicht übergeben…

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: $('input[name="field_l

Eingetragen von stixer2 (113)
am 22.12.2015 - 09:46 Uhr
Zitat:

$('input[name="field_landkreis_e__tid[]"]').on('click', function() {

Verstehe ich richtig, dass .on nur in dieser Zeile so stehen muss,

Zitat:

$('body').addClass('kreis-' + $(this).attr("value"));

kann so bleiben, oder muss das auch umgeschrieben werden?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Probiere das mal aus (mit

Eingetragen von Ionit (1802)
am 22.12.2015 - 12:41 Uhr

Probiere das mal aus (mit .ajaxSuccess)!

<script type='text/javascript'>
jQuery(document).ajaxSuccess(function() {

jQuery('input[name="field_landkreis_e__tid[]"]').on('click', function() {
if (jQuery('input:checked').length) {
var chkId = '';
jQuery('input:checked').each(function () {
chkId += jQuery(this).val() + ",";
});
chkId = chkId.slice(0, -1);
jQuery('body').addClass('kreis-' + jQuery(this).attr("value"));
}
else {
jQuery('body').removeClass('kreis-' + jQuery(this).attr("value"));
}
});
});
</script>

Wofür nutzt/definierst Du eigentlich "chkId"? Wenn Du "body" eine weitere Klasse hinzufügst (oder sie entfernst) verwendest Du "chkId" doch gar nicht? Oder sehe ich das falsch?

Teste das ansonsten mal mit "Alert" .... ob der Code in .ajaxSuccess funktioniert (nach dem Ajax-Call).

  • Anmelden oder Registrieren um Kommentare zu schreiben

Stark! Jetzt werden zumindest

Eingetragen von stixer2 (113)
am 22.12.2015 - 13:20 Uhr

Stark! Jetzt werden zumindest schon mal die Klassen übernommen. Leider funzt removeClass noch nicht. Aber das ist doch schon mal ein Ansatz. Merci!

"chkId" brauche ich wohl tatsächlich nicht, ist ein Rest von dem Script, aus dem ich meins gebastelt habe. So funktioniert es genauso:

<script type='text/javascript'>
jQuery(document).ajaxSuccess(function() {
jQuery('input[name="field_landkreis_e__tid[]"]').on('click', function() {
if (jQuery('input:checked').length) {
jQuery('input:checked').each(function () {
});
jQuery('body').addClass('kreis-' + jQuery(this).attr("value"));
}
else {
jQuery('body').removeClass('kreis-' + jQuery(this).attr("value"));
}
});
});
</script>

  • Anmelden oder Registrieren um Kommentare zu schreiben

.removeClass könntest Du mit

Eingetragen von Ionit (1802)
am 22.12.2015 - 14:08 Uhr

.removeClass könntest Du mit .ajaxStart einbinden - sprich - eine bestehende Klasse wird beim Ajax-Start entfernt - bei .ajaxsucess bekommt body die neue Klasse hinzugefügt.

<script type='text/javascript'>
jQuery(document).ajaxStart(function() {
//hier musst Du Deinen remove-Code einfügen
});
</script>

Da musst Du vorher noch irgendwie abragen ob schon eine Klasse existiert!

Edit:
Mit folgendem Code kannst Du ALLE vorhanden Klassen entfernen (ohne dass Du prüfen musst ob schon welche vorhanden sind).

<script type='text/javascript'>
jQuery(document).ajaxStart(function() {
jQuery( 'body' ).removeClass();
});
</script>

Bitte mal testen!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich habe nochmal ein bisschen

Eingetragen von stixer2 (113)
am 23.12.2015 - 12:12 Uhr

Ich habe nochmal ein bisschen geforscht, und mit dem script funktioniert das mit Ajax ohne ajaxSucces o.ä.
Bei der letzten Variante hat der auch nie den ersten Klick übernommen, das funzt jetzt.

Nur das removeClass läuft noch nicht.

(function($) {
   Drupal.behaviors.myModuleBehavior = {
      attach: function (context, settings) {
         $('input[name="field_landkreis_e__tid[]"]').change(function () {
            if ($('input:checked')) {
               $('input:checked').each(function () {
               });
               $('body').addClass('kreis-' + $(this).attr("value"));
               }
            else {
               $('body').removeClass('kreis-' + $(this).attr("value"));
               }
            });
         }
};
})(jQuery);

Vielleicht könnte man das auch ganz anders machen: prüfen, ob die Checkbox aktiv ist, und dann automatisch die Klasse geben, also ohne .click oder .change.
Das hätte den Vorteil, falls eine aktive checkbox im cache aktiv ist, dann ebenfalls berücksichtigt wird?

LG!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Nochmal vereinfacht,

Eingetragen von stixer2 (113)
am 23.12.2015 - 12:59 Uhr

Nochmal vereinfacht, removeClass funktioniert, allerdings nicht immer, seltsam:

(function($) {
Drupal.behaviors.myModuleBehavior = {
      attach: function (context, settings) {

            //start
            $('input[name="field_landkreis_e__tid[]"]').on('change', function () {
                  check = $('input[name="field_landkreis_e__tid[]"]').is(':checked');
                        if(check) {
                              $('body').addClass('kreis-' + $(this).attr("value"));
                        } else {
                              $('body').removeClass('kreis-' + $(this).attr("value"));
                        }
            });
            // end

      }
};
})(jQuery);

Ich glaube, ich muss das neu denken, und lieber abfragen, ob die chekcbox aktiv ist oder nicht. Mit dem .click wird ja ignoriert, ob schon was aktiv…

LG!

  • Anmelden oder Registrieren um Kommentare zu schreiben

sollte mit toggle function

Eingetragen von caw (2762)
am 24.12.2015 - 06:36 Uhr

sollte mit toggle function von jquery gehen

  • Anmelden oder Registrieren um Kommentare zu schreiben

Mit toggle habe ich es nicht

Eingetragen von stixer2 (113)
am 24.12.2015 - 10:02 Uhr

Mit toggle habe ich es nicht hinbekommen, damit wird irgendwie immer nur eine Klasse geladen, das ist aber eine Multi-Checkbox.

Allerdings hiermit funzt es jetzt (wie es geschrumpft ist ;):

(function($) {
    Drupal.behaviors.myModuleBehavior = {
        attach: function (context, settings) {

            //start
            $('input[name="field_landkreis_e__tid[]"]').on('change', function () {    
            if(this.checked)
                $('body').addClass('kreis-' + $(this).attr("value"));
              else
                $('body').removeClass('kreis-' + $(this).attr("value"));
            });
            // end
        }
    };
})(jQuery);

Mein einziges Problem ist jetzt nur noch, dass ich eine Abfrage bräuchte, ob eine Box aktiv ist… durch den cache bei einem user z.B.
aber die Basis steht erst mal.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ohne Ajax funktioniert es

Eingetragen von stixer2 (113)
am 11.01.2016 - 21:09 Uhr

Ohne Ajax funktioniert es jetzt so:

$(document).ready(function() {
$('input[name="field_landkreis_e__tid[]"][checked]').each(function() {
           $('body').addClass('kreis-' + $(this).attr("value"));
          });
            $('input[name="field_landkreis_e__tid[]"]').on('change', function () {    
            if(this.checked)
                $('body').addClass('kreis-' + $(this).attr("value"));
              else
                $('body').removeClass('kreis-' + $(this).attr("value"));
            });
});

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 3 Tagen 19 Stunden
  • Hey danke
    vor 4 Tagen 14 Stunden
  • Update: jetzt gibt's ein
    vor 5 Tagen 8 Stunden
  • Hallo, im Prinzip habe ich
    vor 1 Woche 2 Tagen
  • Da scheint die Terminologie
    vor 1 Woche 2 Tagen
  • Kannst doch auch alles direkt
    vor 2 Wochen 3 Stunden
  • In der entsprechenden View
    vor 2 Wochen 3 Stunden
  • Dazu müsstest Du vermutlich
    vor 2 Wochen 3 Stunden
  • gelöst
    vor 4 Wochen 3 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 4 Wochen 4 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20449

Neue User:

  • Mroppoofpaync
  • 4aficiona2
  • AppBuilder

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 15 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association