Posts mit dem Label Javascript werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Javascript werden angezeigt. Alle Posts anzeigen

Sonntag, 20. November 2011

jQuery - Windows Phone 7 Live Tiles

ProjektbeschreibungProject Description

Mit dem hier verfügbarem jQuery/JavaScript-Projekt kann man Live Tiles, wie sie u.a. in Windows Phone 7 verwendet werden, auf seinen Webseiten einsetzen (Demo).With the here available jQuery/JavaScript project you can use Live Tiles, known from Windows Phone 7, on Web pages (Demo).

Installation

Als erstes bindet Ihr die benötigten JavaScript-Dateien (jquery.min.js & apptile.js) in den HEADER Eurer Seite ein. Die aktuelle Version der jQuery-Datei findet Ihr hier und das Tile-Skript befindet sich in der Beispiel-Implementierung.First, you includes the necessary JavaScript files (jquery.min.js & apptile.js) in the HEADER of your page. The current version of the jQuery file is here and the tile script is located in the example implementation.


<header>
...


...
</header>

Anschließend folgen einige globale Einstellungen ebenfalls im HEADER.Then follow some global settings in the HEADER.


<header>
...
<script type="text/javascript">
/* global tile setup */
var loopDuration = 5000; // Pause between the animation in milliseconds
// required pictures (not optional)
var picPath = "icons/";
var blankImg = picPath + "blank.png";
var standardImg = picPath + "standard.png";
var pointImg = picPath + "point.png";
</script>
...
</header>

Jetzt noch das benötigte CSS-Skript (apptile.css) in den HEADER. Die Datei befindet sich ebenfalls im downloadbaren Beispiel-Projekt.Now the required CSS script (apptile.css) in the HEADER. The file is also located in the downloadable example project.


<header>
...

...
</header>

Optional können mit den folgenden Anweisungen noch Größe und Farbe der Tiles beinflusst werden.Optionally, size and color of the tiles, can be configured with the following instructions.


<header>
...

...
</header>

Erstmal die kürzeste Variante implementierenFirst implement the shortest Variant

Hierfür erzeugt man einen DIV-Tag mit einer id und der CSS-Klasse tilewrapper. Nach dem dem Laden des DIV's, instanziert Ihr ein neues AppTile-Objekt. Das macht man am Besten in der ready()-Funktion, welche von jQuery zur Verfügung gestellt wird.For this adding a DIV tag with an id and CSS class tilewrapper. After the loading of the DIV's, instantiates your a new AppTile object. To do that the best in the ready() function, which is provided by jQuery.


<body>
<script type="text/javascript">
$(document).ready(function()
{
var sampleTile1 = new AppTile("sampletile1");
});
</script>
...
<div id="sampletile1" class="tilewrapper"></div>
...
</body>

Ausführlich konfiguriertConfigured in detail

Der Tile hat 3 Ansichten - Standard (stdTile), Custom (cstTile) und Background (bckTile) - welche sich unterschiedlich konfigurieren lassen:The tile has 3 views - standard (stdTile), custom (cstTile) and background (bckTile) - which can be configured differently.

stdTile([Title], [Backgroundimage], [Counter])
cstTile([Title], [Backgroundimage], [Counter])
bckTile([Title], [Text], [Backgroundimage])

var sampleTile2 = new AppTile("sampletile2");
sampleTile2.stdTile("IT4Zwigge", "it4zwigge.png");
sampleTile2.cstTile("Development", "homerobot.png", 99);
sampleTile2.bckTile("Training", "", "C# PHP SQL jQuery Javascript CSS...");

startRandomRun();

Animation startenStart animation

Um die Tile-Animation auszulösen ruft man die Funktion startTile(id)durch einen beliebigen Event auf. Also zum Beispiel beim Hover über dem Tile durch:To raise the tile animation, call the function startTile(id) by an arbitrary event.


<div id="sampletile2" onmouseover="startTile(id)"></div>

Zum Testen einfach oben auf den IT4Zwigge-Tile zeigen.To test it simply hover the IT4 Zwigge tile above.

oderor

Um die Tiles zufällig zu starten, kann man die Funktion startRandomRun() benutzen. Dazu setzt man den optionalen Parameter bei der Objektinstanzierung auf true (siehe auch Beispiel-Implementierung).To start the tiles randomly, you can use the function startRandomRun(). To do this set the optional parameter when instantiating the object to true (see also example implementation).


var sampleTile2 = new AppTile("sampletile2", true);

Weitere MöglichkeitenMore possibilities

Man kann Tilefarbe & -größe abweichend von den globalen Einstellungen definieren.You can define tile color and tile size by way of derogation from the global settings.


#sampletile3.tilewrapper, #sampletile3 div.tile
{
background-color: red;
}
#sampletile3
{
font-size: 1.25em;
}


jQuery - Windows Phone 7 Live Tiles

ProjektbeschreibungProject Description

Mit dem hier verfügbarem jQuery/JavaScript-Projekt kann man Live Tiles, wie sie u.a. in Windows Phone 7 verwendet werden, auf seinen Webseiten einsetzen (Demo).With the here available jQuery/JavaScript project you can use Live Tiles, known from Windows Phone 7, on Web pages (Demo).

Installation

Als erstes bindet Ihr die benötigten JavaScript-Dateien (jquery.min.js & apptile.js) in den HEADER Eurer Seite ein. Die aktuelle Version der jQuery-Datei findet Ihr hier und das Tile-Skript befindet sich in der Beispiel-Implementierung.First, you includes the necessary JavaScript files (jquery.min.js & apptile.js) in the HEADER of your page. The current version of the jQuery file is here and the tile script is located in the example implementation.


<header>
...


...
</header>

Anschließend folgen einige globale Einstellungen ebenfalls im HEADER.Then follow some global settings in the HEADER.


<header>
...
<script type="text/javascript">
/* global tile setup */
var loopDuration = 5000; // Pause between the animation in milliseconds
// required pictures (not optional)
var picPath = "icons/";
var blankImg = picPath + "blank.png";
var standardImg = picPath + "standard.png";
var pointImg = picPath + "point.png";
</script>
...
</header>

Jetzt noch das benötigte CSS-Skript (apptile.css) in den HEADER. Die Datei befindet sich ebenfalls im downloadbaren Beispiel-Projekt.Now the required CSS script (apptile.css) in the HEADER. The file is also located in the downloadable example project.


<header>
...

...
</header>

Optional können mit den folgenden Anweisungen noch Größe und Farbe der Tiles beinflusst werden.Optionally, size and color of the tiles, can be configured with the following instructions.


<header>
...

...
</header>

Erstmal die kürzeste Variante implementierenFirst implement the shortest Variant

Hierfür erzeugt man einen DIV-Tag mit einer id und der CSS-Klasse tilewrapper. Nach dem dem Laden des DIV's, instanziert Ihr ein neues AppTile-Objekt. Das macht man am Besten in der ready()-Funktion, welche von jQuery zur Verfügung gestellt wird.For this adding a DIV tag with an id and CSS class tilewrapper. After the loading of the DIV's, instantiates your a new AppTile object. To do that the best in the ready() function, which is provided by jQuery.


<body>
<script type="text/javascript">
$(document).ready(function()
{
var sampleTile1 = new AppTile("sampletile1");
});
</script>
...
<div id="sampletile1" class="tilewrapper"></div>
...
</body>

Ausführlich konfiguriertConfigured in detail

Der Tile hat 3 Ansichten - Standard (stdTile), Custom (cstTile) und Background (bckTile) - welche sich unterschiedlich konfigurieren lassen:The tile has 3 views - standard (stdTile), custom (cstTile) and background (bckTile) - which can be configured differently.

stdTile([Title], [Backgroundimage], [Counter])
cstTile([Title], [Backgroundimage], [Counter])
bckTile([Title], [Text], [Backgroundimage])

var sampleTile2 = new AppTile("sampletile2");
sampleTile2.stdTile("IT4Zwigge", "it4zwigge.png");
sampleTile2.cstTile("Development", "homerobot.png", 99);
sampleTile2.bckTile("Training", "", "C# PHP SQL jQuery Javascript CSS...");

startRandomRun();

Animation startenStart animation

Um die Tile-Animation auszulösen ruft man die Funktion startTile(id)durch einen beliebigen Event auf. Also zum Beispiel beim Hover über dem Tile durch:To raise the tile animation, call the function startTile(id) by an arbitrary event.


<div id="sampletile2" onmouseover="startTile(id)"></div>

Zum Testen einfach oben auf den IT4Zwigge-Tile zeigen.To test it simply hover the IT4 Zwigge tile above.

oderor

Um die Tiles zufällig zu starten, kann man die Funktion startRandomRun() benutzen. Dazu setzt man den optionalen Parameter bei der Objektinstanzierung auf true (siehe auch Beispiel-Implementierung).To start the tiles randomly, you can use the function startRandomRun(). To do this set the optional parameter when instantiating the object to true (see also example implementation).


var sampleTile2 = new AppTile("sampletile2", true);

Weitere MöglichkeitenMore possibilities

Man kann Tilefarbe & -größe abweichend von den globalen Einstellungen definieren.You can define tile color and tile size by way of derogation from the global settings.


#sampletile3.tilewrapper, #sampletile3 div.tile
{
background-color: red;
}
#sampletile3
{
font-size: 1.25em;
}


Donnerstag, 10. November 2011

jQuery - Testen ob ein Element existiert


if($("#elem").length == 0)
alert("Da ist kein Objekt mit der ID \"elem\"!");

So kann man z.B. Testen oben ein Element mit der entsprechenden ID existiert. Das funktioniert aber auch bei den anderen Selektoren die das jQuery-Objekt benutzen.

jQuery - Testen ob ein Element existiert


if($("#elem").length == 0)
alert("Da ist kein Objekt mit der ID \"elem\"!");

So kann man z.B. Testen oben ein Element mit der entsprechenden ID existiert. Das funktioniert aber auch bei den anderen Selektoren die das jQuery-Objekt benutzen.

Mittwoch, 9. November 2011

Javascript - Objektorientierung und Drag and Drop (1/2)

Konstruktor, Objektvariablen, private und öffentliche Methoden

Dieser erste Teil ist an das vor einiger Zeit veröffentlichte Slider-Skript angelehnt. Hier wird die Logik aus dem älterem Post in objektorientierter Form verwendet.
Im ersten Teil wird mit Javascript eine aus Java oder C# bekannte Objektstruktur verwendet, um Objekte mittels Konstruktor zu instanzieren, in den Objekten Objektvariablen zu verwenden und mit öffentlichen und privaten Methoden zu arbeiten.

Javascript im HEAD (u.a. Objektinstanzierung):

window.onload = Init;

function Init() {
// neues Objekt instanzieren
var dragObj = new DragObj;
// Events öffentlichen Methoden aus
// instanziertem Objekt zuweisen
document.onmousedown = dragObj.startDrag;
document.onmousemove = dragObj.Drag;
document.onmouseup = dragObj.endDrag;
}
Javascript im HEAD (das Objekt, seine Variablen und Methoden):

function DragObj() {
// Variable zur Rückgabe
// von öffentlichen Methoden (Pattern)
var that = {};
// Objektvariablen
this.movie = null;
this.startX = 0;
this.startY = 0;
this.start_drag = false;

// öffentliche Methoden
that.startDrag = function(e) {
// Browserweiche
if(!e) { // IE
e = window.event;
this.movie = e.srcElement;
}
else
this.movie = e.target;

var id = this.movie.id;

if(IsDragable(id)) {
this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);

this.start_drag = true;
}
}

that.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;

var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;

this.movie.style.left = newX + "px";
this.movie.style.top = newY + "px";
}
}

that.endDrag = function() {
this.start_drag = false;
}

// private Methode
function IsDragable(id) {
// prüfen ob in der ID des angelickten Objektes
// das Wort "dragable" vorkommt (damit nicht
// alles verschoben werden kann)
if(id.split("_")[0] == "dragable")
return true;

return false;
}

return that;
}
HTML im BODY:

<img src="html.gif"
style="position:absolute; top:0; left:0;"
onmousedown="return false;"
onmousemove="return false;"
width="129" height="108" id="dragable_1" />

Javascript - Objektorientierung und Drag and Drop (1/2)

Konstruktor, Objektvariablen, private und öffentliche Methoden

Dieser erste Teil ist an das vor einiger Zeit veröffentlichte Slider-Skript angelehnt. Hier wird die Logik aus dem älterem Post in objektorientierter Form verwendet.
Im ersten Teil wird mit Javascript eine aus Java oder C# bekannte Objektstruktur verwendet, um Objekte mittels Konstruktor zu instanzieren, in den Objekten Objektvariablen zu verwenden und mit öffentlichen und privaten Methoden zu arbeiten.

Javascript im HEAD (u.a. Objektinstanzierung):

window.onload = Init;

function Init() {
// neues Objekt instanzieren
var dragObj = new DragObj;
// Events öffentlichen Methoden aus
// instanziertem Objekt zuweisen
document.onmousedown = dragObj.startDrag;
document.onmousemove = dragObj.Drag;
document.onmouseup = dragObj.endDrag;
}
Javascript im HEAD (das Objekt, seine Variablen und Methoden):

function DragObj() {
// Variable zur Rückgabe
// von öffentlichen Methoden (Pattern)
var that = {};
// Objektvariablen
this.movie = null;
this.startX = 0;
this.startY = 0;
this.start_drag = false;

// öffentliche Methoden
that.startDrag = function(e) {
// Browserweiche
if(!e) { // IE
e = window.event;
this.movie = e.srcElement;
}
else
this.movie = e.target;

var id = this.movie.id;

if(IsDragable(id)) {
this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);

this.start_drag = true;
}
}

that.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;

var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;

this.movie.style.left = newX + "px";
this.movie.style.top = newY + "px";
}
}

that.endDrag = function() {
this.start_drag = false;
}

// private Methode
function IsDragable(id) {
// prüfen ob in der ID des angelickten Objektes
// das Wort "dragable" vorkommt (damit nicht
// alles verschoben werden kann)
if(id.split("_")[0] == "dragable")
return true;

return false;
}

return that;
}
HTML im BODY:

<img src="html.gif"
style="position:absolute; top:0; left:0;"
onmousedown="return false;"
onmousemove="return false;"
width="129" height="108" id="dragable_1" />

Donnerstag, 27. Oktober 2011

jQuery - Windows Phone 7 Live Tiles (Demo)

Go to jQuery - Windows Phone 7 Live Tiles mainpage

jQuery - Windows Phone 7 Live Tiles (Demo)

Go to jQuery - Windows Phone 7 Live Tiles mainpage

Freitag, 1. April 2011

Facebook: created_time mit Javascript formatieren


function formatFBTime(fbDate, long) {
//2011-02-26T18:04:11+0000
var arrDateTime = fbDate.split("T");
var arrDate = arrDateTime[0].split("-");
var arrTime = arrDateTime[1].split("+")[0].split(":");
var arrDay = new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
var arrMonth = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");

// TODO: Zeitzone hart (++arrTime[0])
var newDate = new Date(arrDate[0], arrDate[1], arrDate[2], ++arrTime[0], arrTime[1], arrTime[2]);

var strDay = newDate.getDate() > 10 ? newDate.getDate() : "0" + newDate.getDate();
var strWeekDay = arrDay[newDate.getDay()];
var strMonth = arrMonth[newDate.getMonth() - 1];
var strHours = newDate.getHours() > 10 ? newDate.getHours() : "0" + newDate.getHours();
var strMinutes = newDate.getMinutes() > 10 ? newDate.getMinutes() : "0" + newDate.getMinutes();

if(long)
return strWeekDay + ", " + strDay + ". " + strMonth + " " + newDate.getFullYear() + " um " + strHours + ":" + strMinutes;
else
return strDay + ". " + strMonth + " um " + strHours + ":" + strMinutes;
}

Facebook: created_time mit Javascript formatieren


function formatFBTime(fbDate, long) {
//2011-02-26T18:04:11+0000
var arrDateTime = fbDate.split("T");
var arrDate = arrDateTime[0].split("-");
var arrTime = arrDateTime[1].split("+")[0].split(":");
var arrDay = new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
var arrMonth = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");

// TODO: Zeitzone hart (++arrTime[0])
var newDate = new Date(arrDate[0], arrDate[1], arrDate[2], ++arrTime[0], arrTime[1], arrTime[2]);

var strDay = newDate.getDate() > 10 ? newDate.getDate() : "0" + newDate.getDate();
var strWeekDay = arrDay[newDate.getDay()];
var strMonth = arrMonth[newDate.getMonth() - 1];
var strHours = newDate.getHours() > 10 ? newDate.getHours() : "0" + newDate.getHours();
var strMinutes = newDate.getMinutes() > 10 ? newDate.getMinutes() : "0" + newDate.getMinutes();

if(long)
return strWeekDay + ", " + strDay + ". " + strMonth + " " + newDate.getFullYear() + " um " + strHours + ":" + strMinutes;
else
return strDay + ". " + strMonth + " um " + strHours + ":" + strMinutes;
}

Mittwoch, 16. Februar 2011

Facebook/Blogger: Like Button für jeden Blogeintrag

Wenn man im Blogdesign, unter "HTML bearbeiten" das Häkchen bei "Widget-Vorlagen komplett anzeigen" gesetzt hat, findet man im Quelltext den Abschnitt <data:post.body/>.
Hier kann man dann unterhalb einen der beiden gezeigten Codeschnipsel einsetzen.
Wichtig hierbei ist das Referenzieren des jeweiligen Eintrags, dass wird mit expr:href="data:post.url" gemacht.

Beispiel mit Javascript SDK - XFBML (empfohlen):Um dieses Codeschnipsel zu verwenden muss man das Javascript SDK von Facebook im Blog-HTML referenzieren.




Beispiel mit IFrame:

<iframe src="http://www.facebook.com/plugins/like.php?href=data:post.url&layout=standard&show_faces=true&width=450&action=like&font=arial&colorscheme=light&height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>

Wenn man alles richtig gemacht hat, sieht es dann so aus wie hier, also ein Like Button für jeden Blogeintrag. Dass heisst unter anderem, ein Besucher des Blogs kann mit einem Klick, den Eintrag in sein Facebook-Profil posten.

Facebook/Blogger: Like Button für jeden Blogeintrag

Wenn man im Blogdesign, unter "HTML bearbeiten" das Häkchen bei "Widget-Vorlagen komplett anzeigen" gesetzt hat, findet man im Quelltext den Abschnitt <data:post.body/>.
Hier kann man dann unterhalb einen der beiden gezeigten Codeschnipsel einsetzen.
Wichtig hierbei ist das Referenzieren des jeweiligen Eintrags, dass wird mit expr:href="data:post.url" gemacht.

Beispiel mit Javascript SDK - XFBML (empfohlen):Um dieses Codeschnipsel zu verwenden muss man das Javascript SDK von Facebook im Blog-HTML referenzieren.




Beispiel mit IFrame:

<iframe src="http://www.facebook.com/plugins/like.php?href=data:post.url&layout=standard&show_faces=true&width=450&action=like&font=arial&colorscheme=light&height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>

Wenn man alles richtig gemacht hat, sieht es dann so aus wie hier, also ein Like Button für jeden Blogeintrag. Dass heisst unter anderem, ein Besucher des Blogs kann mit einem Klick, den Eintrag in sein Facebook-Profil posten.

Mittwoch, 14. April 2010

HTML/Javascript: Framegröße an Inhalte anpassen

Das folgende Beispiel kann genutzt werden, wenn man die Framegröße automatisch an wechselnde Inhaltgrößen anpassen möchte. Ein Anwendungsfall wären die UFZ-Adventskalender, welche sich als Popup öffnen und Kalender unterschiedlicher Größe zeigen. Frames sind hier deshalb eingesetzt weil sich das Menü zum Wechseln der Kalender in einem solchen befindet (siehe Screenshots).

Download komplettes Beispielkomplettes Beispiel

HTML/Javascript: Framegröße an Inhalte anpassen

Das folgende Beispiel kann genutzt werden, wenn man die Framegröße automatisch an wechselnde Inhaltgrößen anpassen möchte. Ein Anwendungsfall wären die UFZ-Adventskalender, welche sich als Popup öffnen und Kalender unterschiedlicher Größe zeigen. Frames sind hier deshalb eingesetzt weil sich das Menü zum Wechseln der Kalender in einem solchen befindet (siehe Screenshots).

Download komplettes Beispielkomplettes Beispiel

Montag, 11. Januar 2010

Javascript: Objektorientierung und Drag and Drop (Teil 2)

Vererbung

Im zweiten Teil geht es um die Vererbung, ich habe u.a. in den Kommentaren den Begriff Klassen verwendet (natürlich gibt es in Javascript keine Klassen in dem Sinne), da ich aber versucht habe Strukturen nachzubilden, wie sie aus Java bzw. C# bekannt sind, erklärt sich das Ganze so besser.

Ob eine Verkettung der drei definierten Klassen möglich ist, gilt es noch auszutesten!

Javascript im HEAD (u.a. Objektinstanzierung):

window.onload = Init;

function Init() {
// neues Objekt der Subklasse instanzieren
var dragObj = new DragById("dragable_1");
// weiterere moegliche Instanzierung
//var dragObj = new DragInFrame(316, 92);

// Events öffentlichen Methoden aus
// dem instanziertem Objekt zuweisen
document.getElementById("dragpanel").onmousedown =
dragObj.startDrag;
document.getElementById("dragpanel").onmousemove =
dragObj.Drag;
document.getElementById("dragpanel").onmouseup =
dragObj.endDrag;
}
Javascript im HEAD (die Basisklasse):

function DragObj() {
// Variable zur Rückgabe
// von öffentlichen Methoden (Pattern)
var that = {};
// Objektvariablen
this.movie = null;
this.startX = 0;
this.startY = 0;
this.start_drag = false;

// öffentliche Methoden
that.startDrag = function(e) {
// Browserweiche
if(!e) { // IE
e = window.event;
this.movie = e.srcElement;
}
else
this.movie = e.target;

this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);

this.start_drag = true;
}

that.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;

var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;

this.movie.style.left = newX + "px";
this.movie.style.top = newY + "px";

document.title = "X: " + newX + " Y: " + newY;
}
}

that.endDrag = function() {
this.start_drag = false;
}

return that;
}
Javascript im HEAD (die Subklassen):

function DragById(objId) {
// Konstruktor der Basisklasse aufrufen
this.constructor();
// öffentliche Methode der Basisklasse überschreiben
this.startDrag = function(e) {
if(document.getElementById(objId)) {
this.movie = document.getElementById(objId);

this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);

this.start_drag = true;
}
}
}
// Initialisierung der Vererbung
DragById.prototype = new DragObj();

// weitere abgeleitete Klasse definieren
function DragInFrame(frameWidth, frameHeight) {
// Konstruktor der Basisklasse aufrufen
this.constructor();
// öffentliche Methode der Basisklasse überschreiben
this.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;

var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;

if(newX > 0 && newX < frameWidth)
this.movie.style.left = newX + "px";
if(newY > 0 && newY < frameHeight)
this.movie.style.top = newY + "px";

document.title = "X: " + newX + " Y: " + newY;
}
}
}
// Initialisierung der Vererbung
DragInFrame.prototype = new DragObj();
HTML im BODY:

<img src="html.gif"
style="position:absolute; top:0; left:0;"
onmousedown="return false;"
onmousemove="return false;"
width="129" height="108" id="dragable_1" />
Quelltext

Javascript: Objektorientierung und Drag and Drop (Teil 2)

Vererbung

Im zweiten Teil geht es um die Vererbung, ich habe u.a. in den Kommentaren den Begriff Klassen verwendet (natürlich gibt es in Javascript keine Klassen in dem Sinne), da ich aber versucht habe Strukturen nachzubilden, wie sie aus Java bzw. C# bekannt sind, erklärt sich das Ganze so besser.

Ob eine Verkettung der drei definierten Klassen möglich ist, gilt es noch auszutesten!

Javascript im HEAD (u.a. Objektinstanzierung):

window.onload = Init;

function Init() {
// neues Objekt der Subklasse instanzieren
var dragObj = new DragById("dragable_1");
// weiterere moegliche Instanzierung
//var dragObj = new DragInFrame(316, 92);

// Events öffentlichen Methoden aus
// dem instanziertem Objekt zuweisen
document.getElementById("dragpanel").onmousedown =
dragObj.startDrag;
document.getElementById("dragpanel").onmousemove =
dragObj.Drag;
document.getElementById("dragpanel").onmouseup =
dragObj.endDrag;
}
Javascript im HEAD (die Basisklasse):

function DragObj() {
// Variable zur Rückgabe
// von öffentlichen Methoden (Pattern)
var that = {};
// Objektvariablen
this.movie = null;
this.startX = 0;
this.startY = 0;
this.start_drag = false;

// öffentliche Methoden
that.startDrag = function(e) {
// Browserweiche
if(!e) { // IE
e = window.event;
this.movie = e.srcElement;
}
else
this.movie = e.target;

this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);

this.start_drag = true;
}

that.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;

var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;

this.movie.style.left = newX + "px";
this.movie.style.top = newY + "px";

document.title = "X: " + newX + " Y: " + newY;
}
}

that.endDrag = function() {
this.start_drag = false;
}

return that;
}
Javascript im HEAD (die Subklassen):

function DragById(objId) {
// Konstruktor der Basisklasse aufrufen
this.constructor();
// öffentliche Methode der Basisklasse überschreiben
this.startDrag = function(e) {
if(document.getElementById(objId)) {
this.movie = document.getElementById(objId);

this.startY =
e.screenY - parseInt(this.movie.style.top);
this.startX =
e.screenX - parseInt(this.movie.style.left);

this.start_drag = true;
}
}
}
// Initialisierung der Vererbung
DragById.prototype = new DragObj();

// weitere abgeleitete Klasse definieren
function DragInFrame(frameWidth, frameHeight) {
// Konstruktor der Basisklasse aufrufen
this.constructor();
// öffentliche Methode der Basisklasse überschreiben
this.Drag = function(e) {
if(this.start_drag) {
if(!e)
e = window.event;

var newX = e.screenX - this.startX;
var newY = e.screenY - this.startY;

if(newX > 0 && newX < frameWidth)
this.movie.style.left = newX + "px";
if(newY > 0 && newY < frameHeight)
this.movie.style.top = newY + "px";

document.title = "X: " + newX + " Y: " + newY;
}
}
}
// Initialisierung der Vererbung
DragInFrame.prototype = new DragObj();
HTML im BODY:

<img src="html.gif"
style="position:absolute; top:0; left:0;"
onmousedown="return false;"
onmousemove="return false;"
width="129" height="108" id="dragable_1" />
Quelltext

Freitag, 8. Januar 2010

AJAX: HTML-Element für Autovervollständigung

Nachdem ich nach einigem Suchen kein stabiles Element für eine AJAX-Autocomplete Funktion gefunden habe, hier mein Mix aus einem Text- und Listenfeld.

Zum Test einfach etwas eingeben (ohne Datenanbindung).


var charCode = 0; // Tastencode aus beiden Steuerelementen
var optText = null; // Textfeld
var optList = null; // Listenfeld
var topOpt = false; // Hilfsvariable zum Steuern des Uebergangs
var oldText = ""; // Vorwert aus Textbox merken

function Init(obj) {
if(optList) // Falls noch andere Liste offen
//CloseList(false); // IE hängt sich auf
optList.style.display = 'none';

optText = obj;
optList = GetSelect(optText); // SELECT-Element ermitteln
// geerbte Breite des Eingabefeldes an SELECT-Element weitergebn
optList.style.width = optText.offsetWidth + "px";
// Variable charCode setzen
document.onkeydown = GetKeyCode;
}
function OpenList() {
oldText = optText.value; // Wert für Abbruch merken

if(charCode == 27) { // ESC
optList.style.display = 'none'; // Liste wieder zu machen
return;
}
if(charCode == 13) { // ESC
optList.style.display = 'none'; // Liste wieder zu machen
// Event valuefixed auslösen
return;
}

if(optText.value.length > 0) { // ist etwas im Textfeld
topOpt = true; // Pfeiltaste nach oben soll Textfeld aktivieren

with(optList) {
// bei diesen Tasten Liste anzeigen
if(
charCode == 8 || // Backspace
charCode == 40 || // Pfeil nach unten
charCode == 46 || // Delete
(charCode >= 48 && charCode <= 57) || // 0-9
(charCode >= 65 && charCode <= 90) || // a-z
charCode == 109 || // -
charCode == 190 || // .
charCode == 59 || // ü
charCode == 192 || // ö
charCode == 219 || // ß
charCode == 222 // ä
) {
style.display = 'block'; // Liste anzeigen
selectedIndex = -1; // nichts auswaehlen
}
}
}
else
CloseList(false); // wurde z.B. alles geloescht, Liste schliessen

// Übergang zur Liste bei...
if(charCode == 40 && // ... Pfeiltaste nach unten
optList.style.display == 'block') { // und Liste offen

optText.value = optList.options[0].value; // Textbox aktualisieren
optList.focus(); // Liste aktivieren
optList.selectedIndex = 0; // ersten Eintrag auswählen
}
}
function CloseList(setOpt) {
if(setOpt && (optList.options.length != optList.selectedIndex + 1)) {
optText.value = optList.value; // Listenwert ins Textfeld
// Event valuefixed auslösen
}
else {
optText.value = oldText;
oldText = null;
}
optText.focus(); // Textfeld aktivieren
optList.style.display = 'none'; // Liste ausschalten
}
function CancelSelect() {
optList.style.display = 'none'; // Liste ausschalten
optText.value = oldText; // gemerkten Text einsetzen
optText.focus(); // Textfeld aktivieren
}
function CtrlList() {

if(charCode == 13) // Enter
CloseList(true);
if(charCode == 27) // ESC
CancelSelect();
if((charCode == 38 || charCode == 40) && // Pfeiltaste oben unten
optList.options.length != optList.selectedIndex + 1) // nicht letzte Option
optText.value = optList.value;

if(charCode != 38) // nicht Pfeiltaste nach oben
topOpt = false;

// Pfeiltaste nach oben und oberster Eintrag ausgewaehlt
if(charCode == 38 && optList.selectedIndex == 0) {
if(topOpt) { // beim ersten Mal noch nichts machen
optList.style.display = 'none'; // Liste ausschalten
optText.focus(); // Textfeld aktivieren
}
else
topOpt = true; // um beim zweiten Pfeiltaste nach oben
} // Steuerelement zu wechseln
}
function GetKeyCode(e) {
if (!e)
e = window.event;
charCode = e.keyCode;
}
function GetSelect(obj) {
var count = 0;
do {
var elem = obj.nextSibling;
obj = elem;

count++;
if(count > 3) break;
} while(elem.type != "select-one")

return elem;
}
function FixValue() {
// TODO: Event valuefixed auslösen
// aktives Element oder Tastencodes prüfen
}
CSS im HEAD:

input.autocomplete {
width: inherit;
}
input.autocomplete {
display: block;
}
select.autocomplete {
display: none;
position: absolute;
}
#autocomplete1 {
float: left;
width: 200px;
}
#autocomplete2 {
float: left;
width: 200px;
}
.lastopt {
background-color: lightgray;
}
HTML im BODY:

<div id="autocomplete1">
<input type="text" name="autocomplete2" class="autocomplete" onclick="this.focus();" onfocus="Init(this)" onkeyup="OpenList();" onblur="FixValue();" tabindex="2" />
<select size="4" class="autocomplete" onclick="CloseList(true);" onkeyup="CtrlList();">
<option value="Peter">Peter</option>
<option value="Peters">Peters</option>
<option value="Petersen">Petersen</option>
<option value="Petersohn">Petersohn</option>
<option class="lastopt" title="Schließen">⇑</option>
</select>
</div>
Download komplettes Beispielkomplettes Beispiel

AJAX: HTML-Element für Autovervollständigung

Nachdem ich nach einigem Suchen kein stabiles Element für eine AJAX-Autocomplete Funktion gefunden habe, hier mein Mix aus einem Text- und Listenfeld.

Zum Test einfach etwas eingeben (ohne Datenanbindung).


var charCode = 0; // Tastencode aus beiden Steuerelementen
var optText = null; // Textfeld
var optList = null; // Listenfeld
var topOpt = false; // Hilfsvariable zum Steuern des Uebergangs
var oldText = ""; // Vorwert aus Textbox merken

function Init(obj) {
if(optList) // Falls noch andere Liste offen
//CloseList(false); // IE hängt sich auf
optList.style.display = 'none';

optText = obj;
optList = GetSelect(optText); // SELECT-Element ermitteln
// geerbte Breite des Eingabefeldes an SELECT-Element weitergebn
optList.style.width = optText.offsetWidth + "px";
// Variable charCode setzen
document.onkeydown = GetKeyCode;
}
function OpenList() {
oldText = optText.value; // Wert für Abbruch merken

if(charCode == 27) { // ESC
optList.style.display = 'none'; // Liste wieder zu machen
return;
}
if(charCode == 13) { // ESC
optList.style.display = 'none'; // Liste wieder zu machen
// Event valuefixed auslösen
return;
}

if(optText.value.length > 0) { // ist etwas im Textfeld
topOpt = true; // Pfeiltaste nach oben soll Textfeld aktivieren

with(optList) {
// bei diesen Tasten Liste anzeigen
if(
charCode == 8 || // Backspace
charCode == 40 || // Pfeil nach unten
charCode == 46 || // Delete
(charCode >= 48 && charCode <= 57) || // 0-9
(charCode >= 65 && charCode <= 90) || // a-z
charCode == 109 || // -
charCode == 190 || // .
charCode == 59 || // ü
charCode == 192 || // ö
charCode == 219 || // ß
charCode == 222 // ä
) {
style.display = 'block'; // Liste anzeigen
selectedIndex = -1; // nichts auswaehlen
}
}
}
else
CloseList(false); // wurde z.B. alles geloescht, Liste schliessen

// Übergang zur Liste bei...
if(charCode == 40 && // ... Pfeiltaste nach unten
optList.style.display == 'block') { // und Liste offen

optText.value = optList.options[0].value; // Textbox aktualisieren
optList.focus(); // Liste aktivieren
optList.selectedIndex = 0; // ersten Eintrag auswählen
}
}
function CloseList(setOpt) {
if(setOpt && (optList.options.length != optList.selectedIndex + 1)) {
optText.value = optList.value; // Listenwert ins Textfeld
// Event valuefixed auslösen
}
else {
optText.value = oldText;
oldText = null;
}
optText.focus(); // Textfeld aktivieren
optList.style.display = 'none'; // Liste ausschalten
}
function CancelSelect() {
optList.style.display = 'none'; // Liste ausschalten
optText.value = oldText; // gemerkten Text einsetzen
optText.focus(); // Textfeld aktivieren
}
function CtrlList() {

if(charCode == 13) // Enter
CloseList(true);
if(charCode == 27) // ESC
CancelSelect();
if((charCode == 38 || charCode == 40) && // Pfeiltaste oben unten
optList.options.length != optList.selectedIndex + 1) // nicht letzte Option
optText.value = optList.value;

if(charCode != 38) // nicht Pfeiltaste nach oben
topOpt = false;

// Pfeiltaste nach oben und oberster Eintrag ausgewaehlt
if(charCode == 38 && optList.selectedIndex == 0) {
if(topOpt) { // beim ersten Mal noch nichts machen
optList.style.display = 'none'; // Liste ausschalten
optText.focus(); // Textfeld aktivieren
}
else
topOpt = true; // um beim zweiten Pfeiltaste nach oben
} // Steuerelement zu wechseln
}
function GetKeyCode(e) {
if (!e)
e = window.event;
charCode = e.keyCode;
}
function GetSelect(obj) {
var count = 0;
do {
var elem = obj.nextSibling;
obj = elem;

count++;
if(count > 3) break;
} while(elem.type != "select-one")

return elem;
}
function FixValue() {
// TODO: Event valuefixed auslösen
// aktives Element oder Tastencodes prüfen
}
CSS im HEAD:

input.autocomplete {
width: inherit;
}
input.autocomplete {
display: block;
}
select.autocomplete {
display: none;
position: absolute;
}
#autocomplete1 {
float: left;
width: 200px;
}
#autocomplete2 {
float: left;
width: 200px;
}
.lastopt {
background-color: lightgray;
}
HTML im BODY:

<div id="autocomplete1">
<input type="text" name="autocomplete2" class="autocomplete" onclick="this.focus();" onfocus="Init(this)" onkeyup="OpenList();" onblur="FixValue();" tabindex="2" />
<select size="4" class="autocomplete" onclick="CloseList(true);" onkeyup="CtrlList();">
<option value="Peter">Peter</option>
<option value="Peters">Peters</option>
<option value="Petersen">Petersen</option>
<option value="Petersohn">Petersohn</option>
<option class="lastopt" title="Schließen">⇑</option>
</select>
</div>
Download komplettes Beispielkomplettes Beispiel

Freitag, 13. November 2009

Javascript: Anzahl Stellen einer Zahl ermitteln


function countDigits(i) {
return (i + "").length;
}
var x = 10;
var count = countDigits(x);
// count ist 2

Javascript: Anzahl Stellen einer Zahl ermitteln


function countDigits(i) {
return (i + "").length;
}
var x = 10;
var count = countDigits(x);
// count ist 2