JavaScript String manipulation

-

Einmal mehr musste ich heute wieder per JavaScript die URL einer Grafik verändern. Ich brauchte aber nicht eine komplett neue URL sondern nur ein Parameter verändert. Nun kann man ja nicht immer davon ausgehen, dass der Parameter den man verändern möchte immer am Ende ist. Er kann sich irgendwo im String befinden. Diesen jedes Mal zu suchen und zu manipulieren war mir zu wieder. Einfacher ist es wenn man einen Parameter einfach entfernen könnte und neu hinten dran zu hängen.  Da diese Funktion bei allen URL-Strings nützlich wäre kann man diese einfach zu den Standartfunktionen einfach hinzufügen:

String.prototype.removeParam = function (param) {
    var url = this;
    var aTmp = this.split('?');
    var url = aTmp[0] + '?';

    var aParams = aTmp[1].split('&');
    for (var i in aParams) {
        var aTmp = aParams[i].split('=');
        if ( aTmp[0] != param ) {
            url += '&'+aTmp[0]+'='+aTmp[1];
        }
    }
    return url;
}

So man die Parameter einfach entfernen und neu hinzufügen:

url = url.removeUrlParam('SORT') + '&SORT=name';

Datenschutzlücke in allen Browsern

- , , , ,

Wie der Mozilla Hacks Blog beschreibt gibt es eine Datenschutzlücke in so gut wie allen Browsern. Und zwar geht es um den CSS Selector :visited. Dieser erlaubt dem Webdesignern das hervorheben von Links welchen der Benutzer bereits besucht hat. Dieses CSS Element allein, ist aber noch nicht gefährlich denn es ist der Browser selbst der entscheidet welcher Link der Benutzer bereits besucht hat anhand der Browser Historie. Datenschutztechnisch gefährlich wird dies allerdings erst mit der JavaScript Funktion getComputedStyle(). Mit dieser Funktion lässt sich per JavaScript herausfinden was für ein Design der Browser in einem bestimmten Moment für ein Element generiert hat. Nun lässt sich darüber herausfinden, ob ein Benutzer eine bestimmte Seite bereits besucht hat oder nicht. Was auf den ersten Blick nicht so tragisch klingt ist aber verheerend. Dadurch, dass die modernen Browser die Geschwindigkeit von JavaScript dermassen gesteigert haben lassen sich über 200’000 Links pro Minute überprüfen.

Mozilla plant, wie im Mozilla Hacks Blog angekündigt, diese Datenschutzlücke so bald als Möglich zu schliessen. Bestrebungen anderer Browser Hersteller wie Google, Apple oder Microsoft sind mir nicht bekannt. Bleibt zu hoffen, dass zumindest Mozilla dies bald einschränkt und bis dahin sollte man möglichst oft die Browser Historie löschen.

jQuery 1.4

- ,

Letzten Donnerstag ist ein neues grösseres Release von jQuery erschienen. Welches neben vielen neuen Funktionen auch grosse Geschwindigkeits Verbesserungen mit sich bringt. Neue Funktionen sind zum Beispiel Funktionen wie detatch() oder unwrap(). Bei einemUpdate von Versionen 1.3.* sollte meistens keine Probleme auftreten.  Falls doch, sollte dieses Plugin abhilfe verschaffen. Zudem gibt es neben der total überarbeiteten API Dokumentation einen sehr Praktischen dynamischen API Browser welcher neben den jQuery Funktionen auch die jQuery UI Funktionen beinhaltet. Eine Auflistung aller Neuerungen findet man hier und hier.

Verringerung der komplexität der beliebtesten Funktionen

jQTouch

- , , ,

Lange ist es her, dass ich ein interessantes Thema gefunden habe über welches ich schreiben wollte. Doch ich habe wieder einmal etwas hübsches gefunden. Ein jQuery Plugin welches die Entwicklung von Web Applikationen für das iPhone erleichtern soll: jQTouch. Es erweitert zum Beispiel die Events von jQuery um iPhone-Spezifischen Events wie: ‘turn’ oder ‘swipe’. Ausserdem lässt es isch einfach auslesen ob das iPhone im Hoch- oder Querformat gehalten wird. Das Plugin unterstützt auch Themes und bringt auch gleich zwei vorgefertigte mit womit alles schnell nach iPhone WebApp aussieht.

Das Projekt befindet sich zwar noch im beta Status, sieht aber doch schon ziemlich gut aus.

jQTouch

jQuery Events/toggle Status reset

- ,

Heute habe ich  mich intensiv mit der JQuery Funktion “Events/toggle” beschäftigt. Das ganze schien erst ganz einfach denn ich hatte zwei Funktionen welche mir ein JavasScript Event an- und abschalten. Da das ganze aber nicht nur auf einer einfachen Seite war, sondern in Tabs wurde es ein wenig komplizierter. Denn wenn man auf einen anderen Tab springt soll alles verschwinden was der Event ausgelöst hat. Dies war noch ganz einfach, jedoch wenn man auf den Tab zurück geht soll alles wieder wie vorher sein. Die toggle Funktion von jQuery merkt sich jedoch an welcher stelle sie war, was je nach Situation ungewollte Ergebnisse lieferte. Deshalb musste ich das ganze irgendwie zurücksetzen sobald man den Tab verlässt, damit bei der Rückkehr alles reibungslos läuft.

Die jQuery Dokumentation sagt mir, dass ich mit “unbind(‘click’)” den toggle entfernen kann. Wenn ich den toggle dann aber neu hinzufüge ist der Status noch immer der Alte. Nach intensivem debuging fand ich raus, dass das jQuery Objekt einen zusätzlichen Wert “lastToggle” erhält sobald der Toggle Event das erste mal ausgelöst wird. Dieser bleibt auch bei einem “unbind” des toggle Events bestehen. Um dies zu korrigieren, habe ich mir eine kleine Funktion geschrieben:

function resetToggle(selector) {
$(selector).each(function()	{
this.lastToggle = undefined;
});
}

loadAnimation Plugin unter den besten im Mai 2009?

- ,

Ist mein jQuery Plugins eins der besten welche im Mai geschrieben/veröffentlicht wurden? Diese Ansicht vertritt auf jeden fall die englische Seite ajaxline.com und nimt mein loadAnimation Plugin in ihre Liste der besten 30 Plugins vom Mai auf. Ob es diese Ehre wirklich verdient weiss ich jedoch nicht den es ist doch recht simpel, doch vielleicht war  genau das einer der entscheidenden Gründe… ich weis es nicht. Ich bedanke mich jedoch für die Linkung auf dem Blog und freue mich darüber, dass ich noch anderen Entwicklern ein wenig Arbeit abnehmen konnte indem ich die Funktion in ein jQuery Addon gepackt habe. Wer es noch nicht kennt und gerne ausprobieren möchte, kann es unter Downloads herunterladen.

jQuery Code optimieren

- ,

jQuery ist ein sehr Praktisches JavaScript Framework, welches einfach zu bedienen und auch ganz schön schnell ist. Seit der Version 1.3 sind die Selectoren auch nochmals um ein vielfaches schneller geworden. Trotzdem ist es, vor allem bei grösseren Projekten, nie verkehrt den JavaScript Code zu optimieren. Dafür habe ich einige einfache Tips, welche helfen die Ausführungszeit des JavaScripts zu verringern.

Herkömliche Browser Funktionen sind immer schneller als Funktionen in einer Library

Beispielsweise sollte man eher das normale for () vom JavaScript benützen als die jQuery Funktion $.each() auch wenn diese mehr Funktionen liefert. Ebenso sollte darauf geachtet werden, dass möglichst wenig Funktionen benützt werden.  Also das man sich erst den gesamten String zusammenbaut und erst danach den String in den Ort im DOM einfügt, an welchem er hin gehört.

Keine langen String Verkettungen machen, stattdessen die Array Fuktion join nützen

 var tmp = '';
for (var i=0; i< =rows.length; i++) {
       tmp += '
'+rows[i]+''; } alert(tmp); // ist schneller var tmp = []; for (var i=1; i< =rows.length; i++) { tmp[i] = '
'+rows[i-1]+''; $ } alert(tmp.join(''));

Einfachere Selectoren auf kleinere DOM Teile angewendet sind schneller</b><br /> Am schnellsten ist der Selector $(‘#id’). Wenn immer möglich sollte man für jedes Element, welches angesprochen werden soll eine eigene ID setzten und das Element darüber ansprechen. Dies ist auf jeden fall der schnellste Weg ein Element anzusprechen. Der Zweitschnellste, ist dasder Selector $(‘tag’) über einen HTML Tag. Auch Kombiniert sind diese beiden sehr schnell.

var bereich = $('#container');
var link = bereich.find('a');
var tabelle = bereich.find('table');

jQuery Plugin loadAnimation

- ,

Ich habe vor ein par Wochen ein kleines Plugin für jQuery geschrieben, welches mir schnell und einfach ermöglicht einen Bereich zu Markieren in welchem gerade etwas geladen wird. Es ist bisher nichts spezielles und wurde eigendlich auch nur für mich geschrieben. Ein Kollege von mir meinte aber bereits auch, dass er dieses Plugin gerne einsetzten würde und so dachte ich mir ich kann es gleich allen zur Verfügung stellen. Ihr könnt es ganz einfach im Downloadbereich herunterladen.

Zu bedienen ist es relativ einfach und lässt sich mit einem kurzen Start und Stop befehl steuern.

// Starten
$('selector').loadAnimation();  

// Stoppen
$.loadAnimation.end();

Zudem kann die Animation auch ein wenig dem Layout angepasst werden in dem man die Farbe, Transparenz, zIndex und ein Bild in der Mitte anzeigt. Ebenso kann man die Geschwindikeit steuren in der die Animation ein- und ausgeblendet wird.

var options = {
// Ein- / Ausblenden
loadSpeed: 'slow',
closeSpeed: 'fast',

// CSS Otionen
zIndex: 998,
opacity: 0.9,

// Farbe
color: '#ccc',

// Bild in der Mitte
image: {
src: '',
alt: 'loading...',

// Grösse des Bildes wird benötigt um das Bild schön
// in der Mitte darzustellen.
size: {
width: 100,
height: 10
}
}
};

// Animation mit Optionenen Starten
$('selector').loadAnimation(options);

Also viel Spass damit… Wenn ihr Fragen habt oder Bugs gefunden habt, schreibt dies einfach in die Kommentare.

jQuery Plugin qTip

- , ,

Heute ist der erste Release Candidate vom jQuery Plugin qTip rausgekommen. Es ermöglicht einem auf einfache Art und Weise coole Tooltips zu bauen ohne dafür grossen Aufwand betreiben zu müssen. Es bieted aber nicht nur die Möglichkeit einfach und schnell Tooltips zu erstellen sondern erlaubt es auch duch die API Schnittstelle die Funktionalität vollkommen zu dynamisieren oder auch erweitern.

// Einfaches Tooltip über alle Links
$('a').qtip({ content: 'Mein Tooltip' });

// Tooltip mit dynamischen Inhalt
$(&quot;#dynamisches_tooltip&quot;).qtip({
	content: {
		url: 'localcontent.html'
	}
});

Man kann die Tooltips aber auch nach belieben gestalten über das style Attribut:

$(&quot;gestyltes_tooltip&quot;).qtip({
	content: 'Dieses Tooltip ist hübsch',
	style: {
		width: 500,
		padding: 5,
		background: '#ccc',
		color: 'black',
		textAlign: 'center',
		border: {
			width: 7,
			radius: 2,
			color: '#fff'
		}
	}
});

Es gibt aber auch vorgefertigste Styles, welche man einfach über style.name aktivieren kann und man nur noch gewisse kleinigkeiten anpassen/überschreiben muss.
Zudem bieted das API Attribut diverse Callbacks welche man erstellen kann. Ein keines Beispiel:

$('#api_funktionen').qtip({
	content: 'mein Inhalt',
	api: {
		onFocus: function ()
		{
			// Bei Mousover färbt sicht das Element rot
			this.css('color','red');
		}
	}
})

Alles in allem ein sehr gelungenes Plugin mit vielen Möglichkeiten es zu erweitern. Zudem steht der Ersteller im Forum aktiv zur Rede und Antwort.