Archiv für den Monat: Juli 2009

jQuery, bitte helfen Sie … nicht!

Wer bei jQuery ein Support Ticket aufgibt oder einen Bug via Trac meldet, dem sollte klar sein, dass die Menschen dort nicht gerade die nettesten sind, genauer gesagt sieht es so aus, als wäre z.B. ein gewisser „scott.gonzalez“ ein recht schroffer und unfreundlicher Typ.

Ich dachte einst, ich hätte einen Fehler in jQuery gefunden und meldete diesen auch. Ich beschrieb das Problem und lieferte Sourcecode mit, natürlich nur einen Teil (das nötigste) und auch mit anderen Funktionsnamen. Dabei können einem durchaus Fehler passieren, nicht aber „scott.gonzalez“, der ist nä(h)mlich perfekt, wie es scheint.
In meiner Beschreibung – genauer gesagt im Sourcecode – hatte sich ein Schreibfehler eingeschlichen.
Ich schrieb:

$(document).ready(function()
{
// Add some dynamic content here
$(‚div#mydiv‘).html(‚myLink“>Click me!‘);

// Try to make some event with it…
$(‚a#mylink‘).click(function(){
console.log(‚Hello World…‘);
});
};

Die betreffende Stelle habe ich mal hervorgehoben. Ich schrieb oben „myLink„, unten jedoch – Asche auf mein Haupt – nur „mylink„, also einmal großes L, einmal kleines l.
Das dies ein simpler Vertipper sein kann sollte eigentlich jemanden klar sein, der Support leistet. Aber „scott.gonzalez“ – mein Bearbeiter bei jQuery – ist da stur wie ein Roboter. Anstatt sowas zu sagen wie

„Hey, du hast da einen Tippfehler drin, kleines l statt großem L, aber ich gehe mal davon aus, dass das nicht das eigentlich Problem ist. Wenn ich da nämlich ein großes L reinmache sehe ich, dass es immer noch nicht geht und das liegt daran: ….“

Cool – wie „scott.gonzalez“ nun mal ist – schließt dieser das Supportticket und schreib kurz und knapp:

„Ids are case sensitive, you need to use ‚#myLink‘ not ‚#mylink‘.

Closing invalid; this has nothing to do with jQuery UI.“

Und damit ist der Fall erledigt.
Danke für den tollen Support…

Automatische Aktualisierungen mit jQuery

Wer mit jQuery arbeitet, der baut sich schnell viele Funktionen, die die Arbeit erleichtern sollen. Leider fehlt jQuery sowas wie ein Timer, der bestimmte Funktionen immer wieder aufruft … der JavaScript Erfahrene Entwickler weiß genau: „Da nehme ich doch setInterval()„.

Genau, und mit setInterval() kann ich auch jQuery Funktionen aufrufen.
Habe ich beispielsweise eine jQuery-Funktion zum AJAX nachladen von Daten wie

jQuery.fn.loadSomething = function()
{
…..// mach was, z.B. einen AJAX-POST oder sowas…
}

dann kann ich in in meiner ready Funktion sowas hier schreiben:

$(document).ready(function()
{
…..setInterval(„$(this).loadSomething();“,30000);
});

Das ruft mir nun alle 30 sekunden meine jQuery-Funktion loadSomething auf, in der ich allerhand Schabernack treiben kann.

Sehr praktisch…

Trillian: „Error logging into ICQ: Unknown code 27“

Wer derzeit Probleme mit dem Login bei ICQ hat, sollte beim IM Trillian mal die aim.dll austauschen.

Folgende Vorgehensweise:

  1. Neue aim.dll runterladen. Diese findet ihr hier.
  2. Trillian ausschalten
  3. Die dll aus dem Archiv auspacken.
  4. Die aim.dll in das plugin Verzeichnis von Trillian kopieren.
    Meist ist das sowas wie c:/programme/trillian/plugins
  5. Dort dann die alte mit der neuen aim.dll überschreiben.
  6. Trillian neu starten

Damit sollte die Fehlermeldung „Error logging into ICQ: Unknown code 27“ nicht mehr erscheinen.

Dynamischen Content mit jQuery an Events binden

Wow, was für ein komplizierter Titel, was?

Es geht um folgendes: Ich erstelle mit jQuery innerhalb eines Bereiches meiner Seite einen dynamischen Inhalt. Als Beispiel: Ich füge in einem Div ein paar Bilder ein, die ich via AJAX auf Knopfdruck lade.

HTML-Teil:

jQuery-Teil:

$(‚div#meinDiv‘).html(‚‚);

Diese Bilder sollen anschließend noch auf das Ereignis einen Klicks reagieren und dann einen neuen Dialog öffnen, wo es ein paar mehr Infos zu diesem Bild gibt … kann sich jeder was unter diesem Beispiel vorstellen? Okay!

Mein Problem war nun, dass ich mit einem simplen:

$(‚img.meineBilder‘).click(function()
{
console.log(‚*PING*‘);
});

Nicht an das gewünschte Ergebnis kam. Es geschah einfach gar nix 🙁

Nach langem stöbern im Netz nun endlich die Erlösung: Es geht doch, und zwar so (nachdem der dynamische Content eingefügt ist):
$(‚img.meineBilder‘).live(‚click‘, function()

{
console.log(‚*PING*‘);
});

Na also, geht doch …

json_encode wandelt Umlaute in null Werte um

Meine AJAX-Antwort enthält null-Daten. Nun, okay, nicht nur null-Daten, aber so ab und zu schon ein paar. Dumm nur, dass in der Abfrage, die hinter den Daten steht, eigentlich keine null-Reihen auftauchen; zumindest sehe ich an der passenden Stelle im phpMyAdmin sowas nicht. Woran liegt es nun?

Zum Ablauf meines AJAX-Requests:
1. Daten zum POST vorbereiten
2. Daten per jQuery.post zum Server POSTen
3. Daten werden auf dem Server verarbeitet, sprich, eine Abfrage an MySQL wird gestartet
4. Antwort wird per json_encode zurückgeschickt
5. Antwort wird per jQuery ausgewertet und angezeigt

Soweit, so gut. Nur in manchen Zeilen fehlen die Daten.
Okay, Firebug auf und den Request mal näher untersucht.
Meine POST Daten stimmen schon mal, also mal sehen, was der Server antwortet. Aha, in der Antwort liegen schon die null-Felder drin, also stimmt der php-Teil nicht.

Ein schnelles debug-printf auf dem Server kurz vor der Rückgabe zeigt mir an, dass die Abfrage und die Antwort stimmt. Na gut, dann habe ich den Fehler.

Die PHP-Funktion json_encode wandelt alle Strings mit Umlauten in null Daten um. In der Doku zu json_encode steht es ja auch:

Diese Funktion arbeitet nur mit UTF-8-kodierten Daten.

Ich muss also die Eingangsdaten der Funktion json_encode entsprechend UTF-8 konvertieren. Kein Problem, die Funktion utf8_encode hilft mir da weiter und siehe da: Nun funktioniert es wunderbar.

Wieder was gelernt.