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.

Pimp your Firefox – Firefox beschleunigen

Firefox ist ein sehr guter Browser, grade für Leute wie mich, die damit mehr machen (müssen) wie nur surfen. Und damit Firefox auch richtig schnell rennen kann, sammele ich Tips und Tricks wie man den Browser noch schneller einstellt.

ACHTUNG: Alle Tips gebe ich ohne Garantie und ich weise expliziet darauf hin, dass falsche Einstellungen euren Browser auch beschädigen können!

Generell: Die Änderungen werden nicht über ein Menü durchgeführt, vielmehr liegen diese Eisstellungen in den „versteckten“ Optionen von Firefox, die so direkt nicht zugänglich sind. Um diese Optionen anzuzeigen macht ihr ein neuen Tab auf und tipps als Adresse ein: about:config
Dann kommt noch eine Sicherheitsabfrage, nach dem Motto: „Bist du dir sicher was du tust?“ und ihr sagt dort „Ich werde vorsichtig sein, versprochen“. Somit kommt ihr dann in die Optionen.

dKGbMEYIUUw[1]

Dieser Tab hat ganz oben noch eine Separate Eingabeleiste. Dorthin tippt oder kopiert ihr die Kommandos, die unten stehen.

JqxEnyPOlzE[1]

Kommen wir zu den einzelnen Einstellungen:
Ihr gebt den „Wertname“ in die Eingabezeile ein und drückt oder , existiert dieser Wert schon, wird dieser angezeigt. Dann könnt ihr den Wert per Doppelklick eintragen. Exisitiert der Wert nicht, könnt ihr einen neuen Wert anlegen, indem ihr irgendwo im Fenster mit der Rechten Maustaste klickt und dann auf „Neu“ und dann „String“, „Integer“ oder „Boolean“ wählt, der Wert steht immer mit bei den Einstellungen.

Bei den meisten Einstellungen müsst ihr den Browser komplett neu starten, damit diese wirksam werden.

Einstellen, wie viel RAM Firefox für den Cache benutzt
Wertname: browser.sessionhistory.max_total_viewer
Wert: 0 (Null)
Typ: Integer
Wertname: browser.sessionstore.max_windows_undo
Wert: 1
Typ: Integer
Wertname: browser.sessionstore.max_tabs_undo
Wert: 3
Typ: Integer
Wertname: browser.sessionhistory.max_entries
Wert: 8
Typ: Integer

Die Ladezeit für Webseiten erhöhen
Wertname: network.http.pipelining
Wert: true
Typ: boolean
Wertname: network.http.proxy.pipelining
Wert: true
Typ: boolean
Wertname: network.http.pipelining.maxrequests
Wert: 8 (bei DSL ab 6000, darunter auf 6 stellen)
Typ: Integer
(Bei manchen Seiten steht eine 10 für diesen Wert, Firefox bis Version 3.5 kann aber intern nur 8 Verbindungen aufbauen…das reicht aber auch).

Zeitverzögerung bei Antworten minimieren
Wertname: nglayout.initialpaint.delay
Wert: 0 (Null)
Typ: ineteger
IPV6 aktivieren
Wertname: network.dns.disableIPv6
Wert: false
Typ: boolean
Das Frontend beschleunigen
Wertname: content.notify.backoffcount
Wert: 5
Typ: integer
Wertname: plugin.expose_full_path
Wert: true
Typ: boolean
Wertname: ui.submenuDelay
Wert: 0 (Null)
Typ: integer

Größe des RAM während der Minimierung runtersetzen
Wertname: config.trim_on_minimize
Wert: true
Typ: boolean

Einen externen Editor für die Quelltexte verwenden
Wertname: view_source.editor.path
Wert: Kompletter Pfad zum Editor
Typ: string
Wertname: view_source.editor.external
Wert: true (oder false, wenn das ganze deaktiviert werden soll)
Typ: boolean

Versionsprüfung der Firefox-Addons (Extensions) deaktivieren
Wertname: extensions.checkCompatibility
Typ: boolean
Wert: false

Natürlich würde ich mich über eure Tips auch freuen. Habt ihr noch ein paar „Hints“, wie man den Fuchs noch schneller bekommt? Immer her damit …