Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

jQuery: Verständnisproblem mit bind Events und bindBehaviors() [gelöst]

Eingetragen von quiptime (4972)
am 09.12.2008 - 15:19 Uhr in
  • Allgemeines zu Drupal

An folgendem Problem hänge ich gerade fest und suche die Lösung:

Mehrere Select Listen sollen mittels Ajax angezeigt werden. Eine Folge-Liste soll durch Auswahl in der aktuellen Liste zur Anzeige kommen. Die 1. Liste ladet eine 2. Liste. Das funktioniert. Das Problem ist nun, wenn durch eine Auswahl in der 2. Liste eine 3. Liste geladen werden soll so versagt die jQuery Funktion den Dienst.

Das ist der Code:

if (Drupal.jsEnabled) {
$(document).ready(function() {
 
  $("#tree-block-wrapper select").change(function() {
    var val = $("#tree-block option[@selected]").attr("class");
    var tid = val.substr(5);
    $.getJSON(base_path + "taxonomy/term/block_ajax/" + tid, function(data) {
      $("#block-ajax-content").html(data['mymenu']);
    });
  });
 
});
 
}

Durch meine jQuery Recherchen bin ich zu dem Ergebnis gekommen das ich Events binden muss um in mittels jQuery geladenem HTML Code Events ausführen zu können.

Erste Frage ist, liege ich mit meiner Erkenntnis richtig?

Wenn dem so ist taucht mein eigentliches Problem auf. Ich kapiere die Anwendung des "binden von Events" nicht und demzufolge gelingt mir das Eingangs Beschriebene nicht.

 
Mein 1. Verständnis-Versuch hat mich bei meinem Code zu dieser Version geführt:

if (Drupal.jsEnabled) {
$(document).ready(function() {
 
  var bindBehaviors = function() {
 
   $("#tree-block-wrapper select").change(function() {
    var val = $("#tree-block option[@selected]").attr("class");
    var tid = val.substr(5);
    $.getJSON(base_path + "taxonomy/term/block_ajax/" + tid, function(data) {
     $("#block-ajax-content").html(data['mymenu']);
    });
   });
 
  }
 
  bindBehaviors();
 
  $("#block-ajax-content select").change( function() {
   bindBehaviors();
  });
 
});

}

Dieser Code funktioniert im oberen Teil. D. h., die bisherige Funktionalität bleibt bestehen aber die gewünschte jQuery Funktionalität an nachgeladenen Listen tritt nicht ein. Ein change Event an nachgeladenen Listen wird ignoriert, produziert aber auch keinen Fehler.

Also ist mein Code zur Anwendung von bindBehaviors() nicht richtig.

Der Grund ist weil ich in der Doku dies nicht verstehe:

Tutorials:AJAX_and_Events schrieb

A first pass at solving this problem is to factor the binding out into a function, and call that function both at the time the document is ready and after the AJAX call:

Zweite Frage ist,

was bedeutet "nach dem AJAX call" und wann ist das bzw. wie ist das hinsichtlich des durch Ajax geladenen Inhalt zu verstehen?

Danke für Tipps und Loesungsansätze.

 
PS
Aus der grundlegenden Lösung dieser Aufgabe ergeben sich an vielen weiteren Stellen Lösungen. So auch beispielsweise wie man in Ajax geladenen Inhalten Bilder mit Lightbox anzeigen kann.

‹ Automatische Textmanipulation Blog 2 Sprachig ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

jQuery: Events

Eingetragen von Frank Ralf (2135)
am 10.12.2008 - 10:22 Uhr

Hallo quiptime,

ich bin mit jQuery zwar auch nicht so sattelfest, aber vielleicht findest du hier die entsprechenden Infos:
http://www.learningjquery.com/2008/03/working-with-events-part-1
http://www.learningjquery.com/2008/05/working-with-events-part-2

Und dein Problem klingt so ähnlich wie das in http://www.drupalcenter.de/node/13881 beschriebene, vielleicht da nochmal nachfragen.

hth
Frank

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

dynamische selects

Eingetragen von stBorchert (6003)
am 10.12.2008 - 10:37 Uhr

Moin.

quiptime schrieb

...Erste Frage ist, liege ich mit meiner Erkenntnis richtig?

Ja.

quiptime schrieb

...Dieser Code funktioniert im oberen Teil. D. h., die bisherige Funktionalität bleibt bestehen aber die gewünschte jQuery Funktionalität an nachgeladenen Listen tritt nicht ein. Ein change Event an nachgeladenen Listen wird ignoriert, produziert aber auch keinen Fehler.

Also ist mein Code zur Anwendung von bindBehaviors() nicht richtig.

Genau. Es sollte eigentlich nur eine Zeile fehlen.

quiptime schrieb

...was bedeutet "nach dem AJAX call" und wann ist das bzw. wie ist das hinsichtlich des durch Ajax geladenen Inhalt zu verstehen?

In der Funktion bindBehaviors() musst Du nach .getJSON() wieder bindBehaviors() aufrufen. Das sieht erstmal seltsam aus, macht aber durchaus Sinn:

if (Drupal.jsEnabled) {
  $(function() {
    var bindBehaviors = function() {
      $("#tree-block-wrapper select").change(function() {
        var val = $("#tree-block option[@selected]").attr("class");
        var tid = val.substr(5);
        $.getJSON(base_path + "taxonomy/term/block_ajax/" + tid, function(data) {
          $("#block-ajax-content").html(data['mymenu']);
          bindBehaviors(); /* <-- hier muss das nochmal aufgerufen werden */
        });
      });
    }
    bindBehaviors();
    $("#block-ajax-content select").change( function() {
      bindBehaviors();
    });
  });
}

Zur Erklärung: nach dem Laden des Dokuments rufst Du bindBehaviors() auf. Dies bindet eine Funktion an sämtliche *zu diesem Zeitpunkt* bestehende select Elemente. Wenn Du jetzt über jQuery ein select aufbaust, war das nach dem Laden des Dokuments noch nicht da, kann also die Funktion nicht mitbekommen haben.
Aus diesem Grund muss bindBehaviors() nach dem Erstellen des Elementes nochmal aufgerufen werden. Also "after the AJAX call".

Ich hatte diese Funktionalität übrigens schonmal in ein Modul eingebaut: linktocontent. Allerdings mit etwas anderen Mitteln, da ich das select Element dort quasi per Hand aufbaue. Hier ist mal der Quelltext dazu.

hth,

 Stefan

  • Anmelden oder Registrieren um Kommentare zu schreiben

jQuery Events binden - Lösung

Eingetragen von quiptime (4972)
am 10.12.2008 - 16:37 Uhr

@Stefan,

Danke Deinem Feedback.

Habe nun eine Lösung für das Binden der Events gefunden.

Hier mein obiger Code modifiziert:

<?php
if (Drupal.jsEnabled) {
$(
document).ready(function() {
 
  $(
"option[@id*=item-select]").livequery('click', function(event) {
    var
val = $(this).attr("class");
    var
tid = val.substr(5);
    $.
getJSON(base_path + "taxonomy/term/block_ajax/" + tid, function(data) {
      $(
"#block-ajax-content").html(data['mymenu']);
    });
  });
 
});
 
}
?>

Das ist alles.

So ganz nebenbei habe ich feststellen dürfen das man Events auf Select-Listen nicht nur mit change() sondern auch mit dem click() Event realisieren kann.

 
======================================== Tags ========================================

jquery change event after ajax select option

-------------
quiptime

Nur tote Fische schwimmen mit dem Strom.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Best Practices for Plain Text Notes
  • gepatchte PHP Version 7.4 für Windows
  • Canvas Palette: Eine fertige Komponentenbibliothek für Drupal Canvas
  • Hilfe zu Updates oder Composer
  • Vergleich Drupal und Contao
  • [geloest] Blocks in Bootstrap nebeneinander darstellen und nicht untereinander
  • DrupalCamp Frankfurt 27-28 November 2026
  • Bitte mein Bentzerkonto löschen
  • Beim Aufruf einiger Inhalte erhalte ich folgende Fehlermeldung
  • Neuinstallation: vermutlich ein rewrite-Problem
  • Drupal CMS installieren
  • [erledigt]MP3 in Drupal 10 einbinden
Weiter

Neue Kommentare

  • Muss ja nicht genau php 8.3 sein
    vor 1 Tag 17 Stunden
  • Guten morgen und Danke
    vor 1 Tag 23 Stunden
  • Evtl. versuchen auf PHP 8 zu wechseln
    vor 2 Tagen 6 Stunden
  • Danke Schmittrich. Die Frage
    vor 3 Tagen 21 Stunden
  • Keine Antwort auf die Frage nach dem Woher
    vor 4 Tagen 31 Minuten
  • Danke ich werde mir die
    vor 6 Wochen 1 Tag
  • Vielen Dank für Ihren
    vor 6 Wochen 4 Tagen
  • Composer ist sehr ratsam
    vor 6 Wochen 6 Tagen
  • Vielen Dank für den
    vor 7 Wochen 1 Tag
  • Die alten CMS Vergleiche von contentmanager.de
    vor 7 Wochen 2 Tagen

Statistik

Beiträge im Forum: 250324
Registrierte User: 20572

Neue User:

  • alxshell
  • FesObsemo
  • AnthonyhoF

» Alle User anzeigen

User nach Punkten sortiert:
wla9466
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 7 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