Archiv für Kategorie JS / AJAX

Aufbau von requireJS Modulen

requireJS ist ein “Javascript Modul Loader”. Der Javscript Code wird in Module zerlegt, die nur dann auch geladen werden wenn diese auf einer Seite gebraucht werden. Um das zu erleichten können zwischen den Modulen Abhängikeiten definiert werden.

Das Einbinden auf der Seite ist ein einfaches script-Tag, mit der Besonderheit, dass der Einstiegspunkt mit angegeben wird, also unser Main-Modul.

<script data-main="lib/js/main" src="lib/js/require-jquery.js"></script>

In meinem Beispiel (requireJS mit jQuery) ist jQuery im requireJS Paket mit integriert und kann nun im Main-Script geladen werden:

require(["jquery"], function($) {
 
    $("#body").css("backgroundColor", "#ff6eec");
 
});

Die Module welche “required” werden, finden sich als Parameter in der Funktion des Moduls wieder. Der Name der dabei vergeben wird, ist einem selbst überlassen, für gewohntes arbeiten gebe ich Ihm den Namen “$”. Alles was im Main-Modul geschieht, ist überall verfügbar und wird auf jeder Seite ausgeführt.

Neben normalem Code der als Modul geladen wird, hat es sich in meinem Projekt als sehr praktikabel erwiesen, eine “Klasse” zu schreiben und den Konstruktor zurückzugeben. Mein Grundkonstrukt sieht dabei wie folgt aus:

define(function () {
 
        var MyClass= function(args){
            this.init();
        }
 
        MyClass.prototype = {
 
            init: function(){
 
            }
 
        }
 
        return MyClass;
    }
);

Nutzbar wird das Modul dann, durch das Angeben der Abhängikeiten, würde ich also in der main.js auf das Modul zugreifen wollen, sähe das so aus (davon ausgehend, die Datei liegt im gleichen Ordner wie das main.js Script und heißt myclass.js):

require(["jquery", "myclass"], function($, MyClass) {
 
    $("#body").css("backgroundColor", "#ff6eec");
 
    var instance = new MyClass();
 
});

So kann man ein Object als Parameter in den Konstruktor mit übergeben und zusätzlich wird automatisch die init-Methode ausgerufen, die bei mir die logische Initialisierung übernimmt.

Im Kontext der Views des Play! Frameworks brauche ich nun nur noch ein Modul als Script zu laden und es werden automatisch alle Abhängigkeiten nachgeladen.

#{script "start.js" /}

Schaut man dann in den HTML Head, sind alle abhängigen Scripte geladen.

Der Sinn dahinter, ist nicht nur mehr Performance (in requireJS kann man am Ende noch einiges mit dem Optimizer machen) wird der Aufbau der Javascripts viel übersichtlicher und Strukturierter.

Keine Kommentare

Zweiter Teaser und offene Anmeldung

Wie vor kurzem erwähnt, arbeite ich in meiner Freizeit an einem kleinen Spiel in Form eines Greasemonkey Plugins, in dem man sich über die Webseiten bewegt, Geld sammelt und tolle Sachen bauen kann.
Alle die mit dem kleinen Greasemonkey Plugin surfen, sehen sämtliche “Gebäude” der anderen Spieler und so wird das Web doch etwas lebendiger :-)

Der zweite Teaser ist inzwischen mit Ton!

Bisher gibts folgende Features:
- ein “ich war hier” Schild auf dem einfach nur der Name steht
- die Mine, läuft jemand drüber verliert man 10% des Geldes an den Minenleger
- der Teleporter, bekommt beim Bauen eine URL. läuft man rein, wird man auf die entsprechende Seite “gebeamt”
- die Kanone, braucht man um hier und da auch wieder was weg zu schießen.

Aktuell baue ich an einer Möglichkeit, Webseiten zu erobern die dann Steuern kosten (und evtl. etwas zu verfremden), bis das entsprechende Gebäude wieder zerstört ist.

Auch die Webseite zum Spiel braucht noch ein kleines bisschen Pflege. Optionale Emailangabe für Passwortreset und ein paar Statistiken sollen hier als nächstes folgen.

Da ich mich noch nicht zu einem Namen entscheiden konnte, gibts auch noch keine eigene Domain, aber hier kann man sich registrieren und spielen:

http://www.drailing.net/webgame/

Über Feedback, Anregungen, Bugs etc. freue ich mich natürlich!

4 Kommentare

Erster Teaser meines ersten Spiels ohne Namen

An den letzten Blogposts kann man erkennen, dass ich mich immer mehr mit den Möglichkeiten von Javascript und Greasemonkey beschäftigt habe. Daraus ist nun ein kleines Spiel entstanden und zu dem Spiel ein kleiner Teaser:

Der aktuelle Stand ist folgender:
Man bewegt sich (mit den Pfeiltasten) über Webseiten und findet zufällig verteilte Geldsäcke. Mit diesem Geld kann man nun verschiedenste Sachen bauen. Neben “ich war hier”-Schildern und Minen gibt es Teleporter, denen beim Erstellen eine URL hinterlegt wird. Läuft man nun durch einen Teleporter wird man auf die nächste Seite “gebeamt”.

Läuft jemand über eine Mine, werden 10% des Geldes an den Minenleger übertragen.

Natürlich sieht man auch die Gebäude die von anderen Spielern gebaut wurden und kann auch deren Teleporter benutzen. In ersten Tests konnte ich viele lustige Webseiten besuchen indem ich mich nur von Teleporter zu Teleporter bewegte. Sehr cool! :)

PS: über Namensvorschläge und Feedback freue ich mich natürlich!

Keine Kommentare

Erste Gehversuche mit Node

Nachdem ich schon vor längerem mit Websockets experimentiert hatte, diese aber nur in einer Beta von Chrome aktiv geschaltet sind, habe ich mich nun mit NodeJS und Socket.IO beschäftigt.

NodeJS bietet die Möglichkeit Javascript serverseitig zu interpretieren und stellt eine komfortable API bereit um sehr rasch eigene Serversoftware zu schreiben.
Socket.IO ist ein Node Plugin welches sich zur Aufgabe gemacht hat die Echtzeitkommunikation ins Web zu bringen. Dabei werden entweder auf Websockets, Flashplugins oder Javaapplets zurückgegriffen und ist somit auch auf nicht ganz aktuellen Browsern lauffähig.

Als erster Test habe ich ein Codebeispiel etwas umgebaut und es kam eine kleine Seite zustande, auf der man sich mit einem Namen anmeldet und dann per Click eine kleine blaue Box bewegen kann.
Hört sich erstmal nicht nach einer postenswerten Errungenschaft an, surfen aber mehrere Besucher auf der Seite (oder alleine mit mehreren Browsern), erscheint pro Anmeldung eine blaue Box und jeder kann die Boxen und Bewegungen der Anderen in Echtzeit sehen!

Und hier gehts zur Seite!

Auf Wunsch kann ich den Code noch etwas kommentieren und zum Download anbieten, die Beispiele von Node selbst sind aber recht selbsterklärend und auch entsprechend gut kommentiert :-)

Tip:
Da npm (Node Package Manager) unter Windows nicht zur verfügung steht und das Einrichten unter Windows mit allen Plugins bei mir nicht ganz geklappt hat, empfehle ich das Projekt nodejs-win, ein Installer für NodeJS der alle notwendigen Plugins mitbringt, PATH Variable setzt etc…

Keine Kommentare

z0r Randomizer (Greasemonkey Plugin)

Vor einiger Zeit hatte ich angefangen mich mit Greasemonkey zu beschäftigen, da ich die Idee, Websites Clientseitig seinen eigenen Bedürfnissen anzupassen sehr interessant finde.

Seit der Version 0.8.0 unterstützt Greasemonkey nun ein @require Attribut, welches erlaubt externe Bibliotheken wie jQuery einzubinden und zu benutzen. Das ist toll!

Und als erstes, unverzichtbares Plugin gibts hier den z0r Randomizer, welcher auf der zugehörigen Internetseite alle 10 Sekunden den Random-Button drückt. Wunderbar auf jeder Party oder einfach als Bildschirmschoner, einfach ein MUSS! (im Grunde ist z0r nur eine Ansammlung doch sehr unnötiger aber lustiger Flash Videos, wie z.B. das)

Das Script gibts hier:
click

Und wer Greasemonkey noch nicht installiert hat, wird hier fündig:
click

Zur Installation, ganz einfach den Link zum Script bei aktiviertem Greasemonkey anklicken.

Falls man nun ein Video doch tatsächlich länger als 10 Sekunden sehen möchte, ist im z0r Menü ein zusätzlicher Eintrag dazugekommen, über welchen man jederzeit den Timer an/ausschalten kann.

Viel Spaß!

Keine Kommentare

blueimp AjaxChat Onlineliste

Auf Anregung von Sumale.nin habe ich hier ein Miniscript geschrieben, womit man die aktuell angemeldeten Chatter sehen und per Ajax-Request in ein Div laden kann.

Grundsätzlich wurde das ganze dann doch sehr simpel ;-)

Benötigt wird jQuery und mein kleines Javascript:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
<script src="onlineuser.js" type="text/javascript"></script>

Diese beiden Scripte müssen auf jedenfall im entsprechenden HTML Header vorhanden sein.

Vor dem hochladen, kann in der onlineuser.js noch die UpdateRate und die ID des Divs konfiguriert werden. Per default heisst die Div-ID “onlineuser” und wird alle 10 Sekunden aktualisiert:

var targetDiv = "onlineuser";
var updateRate = 10000;

Falls nun das PHP Script nicht auf einer Ebene mit der HTML Datei liegt, muss der Pfad noch entsprechend angepasst werden:

$("#"+targetDiv).load("path/to/onlineuser.php");

In der onlineuser.php muss, wie auch schon beim Adminpanel, die Datenbankverbindung eingertagen werden und optional noch CSS Klassen mitgegeben werden:

$cssClass = "styleMe orNot";
 
$db = new mysqli( 'localhost', 'db-user-name', 'db-pw', 'db-name' );

Grundsätzlich wars das schon!

Ein ZIP mit den beiden benötigten Dateien und einem Beispiel-HTML findet man hier

Ich hoffe es funktioniert bei allen, im Notfall kann man sich aber gerne hier melden :-)

2 Kommentare

Twitterwall

Da habe ich endlich mal wieder was gebaut, über was es sich auch lohnt zu schreiben: eine Twitterwall.

Auch wenn ich selber kein aktiver Twitternutzer bin, musste ich mir die API aus verschiedenen Gründen etwas genauer anschauen. Am Ende fiel eine komplett Javascript basierte Twitterwall raus :-)

Bei Click auf den Titel (beim Start “japan”) wird das minimalistische Menü eingeblendet, über das auch nach Hashtags oder User gefiltert werden kann. Abgeschickt bzw. geschlossen, wird das Menü über Enter.

Eine Live-Demo gibts hier: getwitter

Und wer sich den Code genauer anschauen möchte, oder auch den eigenen Bedürfnissen anpassen will, kann sich hier gerne den Code downloaden: download

8 Kommentare

Rails3 und jQuery Implementierung

Hiho,

da ich die letzten Tage unsere Bachelorprojekts auf die serverseitige Programmierung umgestiegen bin, hatte ich auch mit ein paar Neuheiten von Rails3 zu tun.

Da ich mir selbst nen Wolf gegoogelt hab und vieles nicht finden konnte, schreibe ich hier einfach mal die kleinen Stolpersteine zusammen:

1. jQuery mit Rails installieren
dazu gibts inzwischen schon reichliche Tutorials. In Kurz: von github die rails.js runterladen und includen.
Das Problem dabei war, dass Prototype (die JS Library die Rails normalerweise benutzt) und jQuery das Dollarzeichen als Selector benutzen. Das heisst einfach nur includen zerstört die restlichen Javascript calls von Rails – weiterlesen hätte geholfen, denn auf github wird die Installation gut erklärt.

2. respond_to mit jQuery AJAX
da Prototype von Haus aus dabei ist, hätte die Implementierung in einem AJAX Update wohl so ausgesehen

respond_to do |format|
  format.js {
    render :update do |page|
      page.replace_html :divId, :partial => "partialName"
    end
  }
end

die Methoden wie replace_html gibt es nun in der Form in jQuery nicht mehr.
Der Javascript Generator bietet uns allerdings eine andere schöne Form um nun jQuery funktionen aufzurufen. Das äquivalent zum obigen Code sieht dann so aus (in 2 Schritten da die jQuery Methode replaceWith() nicht funktioniert hatte)

render :update do |page|
  page["#divId"].empty
  page["#divId"].append render(:partial => "partialName")
end

3. Ein Partial aus verschiedenen Controllern aus updaten
Die Rails Doku liefert uns unter dem Punkt “shared Partials” schon einen guten Ansatz. Zur Vollständigkeit hier das Codebeispiel von Oben erweitert

render :update do |page|
  page["#divId"].empty
  page["#divId"].append render(:partial => "controllerName/partialName", :locals => {:objectName => @context.objectName })
end

4. jQuery UI Icons in den Links
nach vielen Versuchen die CSS Wrapper drumherum zu bauen, hat einfach das zufügen der jQuery Klassen selber gereicht. Ein “Delete” als Mülleimer würde dann entsprechend so aussehen:

<%= link_to 'Destroy', restfull_route_path(object_to_destroy), :confirm => 'Are you sure?', :method => :delete, :class => 'ui-state-default ui-corner-all ui-icon ui-icon-trash', :title => "Delete" %>

Ich hoffe dem Ein oder Anderen kanns etwas Zeit sparen :-)

Keine Kommentare

Probleme und Lösungen mit JS/jQuery

Nachdem ich mich die letzte Woche mit jQuery etwas beschäftigt habe, möchte ich hier einmal kurz die aufgetretenen Probleme und die damit verbundenen Lösungen festhalten:

Parallele Abläufe
Da es in Javascript und somit auch in jQuery keine Threads gibt und eine endlose while Schleife keine Parallelität bietet (und ausserdem den Browser abstürzen lässt) muss ein anderes Konstrukt herhalten. Die Lösung hier lautet Rekursion (schön erklärt von Markus Kühle auf Javathreads).

setTimeout mit Parametern
Auf anhieb findet man für die Rekursion viele Beispiele mit der setTimeout Methode, leider aber immer ohne Parameterübergabe (in meinem Beispiel der CountUp):

setTimeout("countUp()", 1000);

Sobald nun countUp() mit einem Parameter übergeben werden soll, funktioniert dieser Aufruf nicht mehr. Die Lösung war, den ersten Parameter der setTimeout Methode durch eine Funktion zu ersetzen:

setTimeout(function(){
	countUp(date);
}, 1000);

Countup und die Zeit
Ich hatte eigentlich erwartet dass mich Google mit kleinen Codeschnipseln überhäuft wenn es um einen Simplen Countup für Zeit geht. Gefunden habe ich ein paar wenige, die aber so unschön anzuschauen waren, dass ich mir kurzerhand was kleines Simples selbst zusammengeschrieben habe:

//Parameter inzwischen global um einfach und dynamisch zur Laufzeit zu ändern
var year, month, day;
 
function countUp(){
        //month-1 da die Monate von 0-11 codiert sind
	var startDate = new Date(year, month-1, day, 0, 0, 0);
	var currentDate = new Date();
 
	var diff = new Date(currentDate.getTime() - startDate.getTime());
 
	//(diff.getYear()-70) da der Zeitliche Nullpunkt bei 1970 liegt, und wir nur die Anzahl der Jahre benötigen
	var diffString = "Years " + (diff.getYear()-70) + " Months " + diff.getMonth() + " Days " + diff.getDate() + 
		" Hours " + diff.getHours() + " Minutes " + diff.getMinutes() + " Seconds " + diff.getSeconds();
 
        //String schreiben
	$('#countUpDiv').html(diffString);
 
        //rekursiver Aufruf
	setTimeout(function(){
		countUp();
	}, 1000);
}

noch ein Tip zum Schluss
Um die komplette jQuery Doku auch offline (solls ja ab und zu geben…) nutzen zu können, gibts diese auch als PDF oder sogar als Windows Help File zum Download.
Link

Keine Kommentare

Nichtraucher mit jQuery

Nachdem ich seit inzwischen 3 Wochen dem Laster des Rauchens trotze und in meiner freien Zeit vor Praxisphase und Bachelorarbeit noch etwas sinnvolles machen wollte, habe ich mich etwas mit dem Javascript/AJAX Framework jQuery beschäftigt. Beides kombiniert, kommt bei mir eine kleine Nichtraucher”Uhr” raus:

Zur Zeit wird das Datum der letzten Zigarette (, durchschnittliches Gerauche und Preis einer Schachtel erfasst und daraus die Zeit als Nichtraucher und das dabei gesparte Geld errechnet.

In Zukunft wird die Toplist noch um das gesparte Geld erweitert, eine kleine API gebastelt die die “Uhr” ausgeben kann (ohne angemeldet zu sein) und bei ganz viel Laune wird noch das Standarddesign ersetzt.

Wer sich nicht registrieren will, kann sich mit test/test auch das innenleben mal amschauen.

Eine schöne Sache dieses jQuery :-)

2 Kommentare