Einige Notizen und kleine Beispiele zu JavaScript. Wenn man auch der Suche nach einer richtigen Einführung ist, siehe aufgelistet Links und Quellen, besonders das Buch von Stefan Koch "JavaScript: Einführung, Programmierung und Referenz inklusive Ajax".
04-03-2010 20.40
Einige Links zu und über JavaScript
25-03-2013 02.15
Java Script Versionsgeschichte
Mittlerweile sind große Teile sind JavaScript über den ECMAScript Standard standadisiert.
| Browser | JavaScript Version |
| Firefox 1.5 | JavaScript 1.6 |
| Firefox 1.8 | JavaScript 1.8 |
| InternetExplorer 6.0 | Jscript 5.6 |
| InternetExplorer 7.0 | Jscript 5.7 |
| InternetExplorer 8.0 | Jscript 6.0 |
04-03-2010 20.40
So kann man JavaScript so einbinden, dass es sowohl in Browsern funktioniert die es unterstützen, als auch in solchen die es nicht unterstützen:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>JavaScript Demo</title>
</head>
<body>
<div>
HTML.<br />
<script type="text/javascript">
<!--
alert("JavaScript 4*3="+(4*3));
// -->
</script>
<noscript>
No Script
</noscript>
</body>
</html>
Sauberer ist es aber, eine eigene Datei mit dem JavaScript Code zu importieren
FIXME, angeblich ist das darüber kein valides XHTML?
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>JavaScript Demo</title>
</head>
<body>
<script type="text/javascript" src="myJavaScriptFile.js" />
<noscript>
JavaScript is not supported in your browser.
</noscript>
</body>
</html>
04-03-2010 20.40
Parameter in Funktionen sind Call by Value für Basistypen und Call by Reference für Objekte. Benötigt man Call by Reference muss man die Basistypen in Objekte packen. Es ist möglich, Funktionen mit einer dynamischen Anzahl an Parametern zu haben:
function myConcat()
{
var result="";
for (var i=0; i<myConcat.arguments.length; i++)
{
result+=myConcat.arguments[i];
}
return result;
}
// ab
alert(myConcat('a', 'b'));
// Hallo Welt
alert(myConcat('Hallo', ' ', 'Welt'));
Globale / Lokale Variablen
Bei globalen Variablen ist var optional. Innerhalb von Funktion muss var benutzt werden, sonst wird die Variable global. Nutzt man in einer Funktion let statt var, wird eine mögliche globale Variable gleichen Namens nicht überschrieben.
Beim Umwandeln von String nach Int sollte immer das Zahlensysten angegeben werden:
var i=parseInt("09", 10);
Join, sort, und zur Demonstration ein eigener Comperator
function myReverseComperator(a, b)
{
if(a>b) return -1;
if(a<b) return +1;
return 0;
}
var myArray = new Array();
myArray[0] = "Foo";
myArray[1] = "Bar";
myArray[2] = "Dog";
myArray[3] = "Cat";
myArray.sort();
// Bar - Cat - Dog - Foo
alert(myArray.join(" - "));
//myArray.reverse();
myArray.sort(myReverseComperator);
// Foo; Dog; Cat; Bar
alert(myArray.join("; "));
04-03-2010 20.40
Erzeuge den 12.2.2010 als Datumsobjekt. Achtung, der Monat beginnt bei 0, nicht bei 1!
var d=new Date(2010, 1, 12);
Nicht
Date.getYear()
nutzen (das liefert ja nach Browser mal ein zwei oder ein vierstelliges Datum) sondern
Date.getFullYear();
(immer vierstellig).
JavaScript ist prototypenbasiert
- Mein schreibt einen Konstruktor, es gibt private und public Variablen und Methoden
- Man legt den Namen fest unter der eine Methode erreichbar ist und welche function unter diesem Namen ausgeführt werden soll
- Ein Objekt wird mit dem Konstruktor erzeugt
- Man kann jederzeit dem Objekt Attribute (von außen!) hinzufügen
- Auch Methoden kann man von außen hinzufügen oder vorhanden Methoden neu definieren.
- Dann hat man allerdings keinen Zugriff mehr auf private Attribute (wie hier price)
- Ein anderer Konstruktor, der auch Objekte erzeugt. Diese Objekte "erben" alle Eigenschaften von einer anderen Klasse, die als Prototyp dient.
- Wir überschreiben eine Methode und rufen dabei die alte, im Protypen auf
// 1
function TransportVehicle(pName, pPrice)
{
// public
this.name=pName;
// private
var price=pPrice;
// public // 2
this.getName=function()
{
return this.name;
}
// private
function getPrice()
{
return price; /> }
// public
this.isPriceBelow100=function()
{
return price<100.0;
}
this.getStrg=function()
{
return "Name: "+this.name+", Price: "+price;
}
}
// 3
var t=new TransportVehicle("Boat", 100.2);
// Name: Boat, Price: 100.2
alert(t.getStrg());
// 4
t.description="General transport vehicle";
// 5
t.getStrg=function()
{
// 6
return "Name: "+this.name+", Desc: "+this.description+", PriceInfo: "+this.isPriceBelow100();
}
// Name: Boat, Desc: General transport vehicle, PriceInfo: false
alert(t.getStrg());
// 7
function WheelBased(pName, pPrice, pNrOfWheels)
{
this.prototype=new TransportVehicle(pName, pPrice);
this.nrOfWheels=pNrOfWheels;
// 8
this.getStrg=function()
{
return this.prototype.getStrg()+", NrOfWheels: "+pNrOfWheels;
}
}
var w=new WheelBased("Car", 65100.0, 4);
// Name: Car, Price: 65100, NrOfWheels: 4
alert(w.getStrg());
Eine Kurzschreibweise für JavaObjekte
var deposit= { currency:"EUR",
value:"120,12",
getString:function() { return this.value+"("+this.currency+")"; }
}
| Objekt | Anwendung |
| window | z.B. window.alert(); |
| document | Zugriff auf die Webseite |
| location | Zugriff auf die URL der aktuellen Seite |
04-03-2010 20.40
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>JavaScript Demo</title>
<style type="text/css">
#d1 { color:red; position:fixed; top:10px; left:10px; }
#d2 { color:blue; position:fixed; top:100px; left:100px; }
</style>
</head>
<body>
<div id="d1">Foo</div>
<div id="d2">Bar</div>
<script type="text/javascript">
var o1=document.getElementById("d1")
var o2=document.getElementById("d2")
var myCounter=0;
function moveIt()
{
o1.style.left=10+myCounter+'px';
o2.innerHTML='Value: '+myCounter;
myCounter++;
if(myCounter>100) clearInterval(myInterval);
}
var myInterval=setInterval("moveIt()", 20);
</script>
</body>
</html>
04-03-2010 20.40
Firefox DOM Inspector
Es gibt für einige Objekte Arrays (u.a. für Links und Bilder). Zum Beispiel
document.links[i];
Für alle Objekte in der HTML Seite gibt es ein Objekt.
<div id="d1">
First
<div id="d2">
Second
<ul id="d3">
<li>A</li><li>B</li>
<li>C</li>
</ul>
</div>
<span id="d4"><a href="http://www.example.com">third</a></span>
</div>
<br /><hr /><br />
<div id="result">Result:</div>
<script type="text/javascript">
var o1=document.getElementById("d1");
var o2=document.getElementById("d2");
var o3=document.getElementById("d3");
var o4=document.getElementById("d4");
var result=document.getElementById("result").childNodes[0];
// First
result.nodeValue+=" "+o1.childNodes[0].nodeValue;
// Second
result.nodeValue+=" "+o2.childNodes[0].nodeValue;
// ul
for(var i=0; i<o3.childNodes.length; i++)
{
if("object"===typeof o3.childNodes[i].childNodes[0])
{
result.nodeValue+=i+": "+o3.childNodes[i].childNodes[0].nodeValue+" ";
}
}
// a href
var ol=o4.childNodes[0];
result.nodeValue+=ol.childNodes[0].nodeValue;
result.nodeValue+=" -> "+ol.getAttribute('href')
// other possibility
result.nodeValue+="; "+o3.innerHTML;
</script>
04-03-2010 20.40
Liste wichtiger Events, siehe auch
DOM Events
- onchange
- onclick
- onfocus
- onload
- onmouseon
- onmouseover
- onload
W3C Event-Listener (wird nicht vom IE unterstützt) und Micrsoft Internet Explorer Events
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>JavaScript Demo</title>
<style type="text/css">
.stylA { font-size:large; color:red; }
.stylB { font-size:normal; color:green; }
</style>
<meta http-equiv="Content-Script-Type" content="text/javascript" />
</head>
<body>
<div id="d1" class="stylB" onmouseover="this.className='stylA';" onmouseout="this.className='stylB';">
Foo
</div>
<script type="text/javascript">
var o=document.getElementById("d1");
if("function"===typeof o.addEventListener)
o.addEventListener("click", myFunction, false);
else if("function"===typeof o.attachEvent)
o.attachEvent("click", myFunctionIE);
function myFunction(pEvent)
{
o.childNodes[0].nodeValue+=".("+pEvent.clientX+"/"+pEvent.clientY+"\)";
}
function myFunctionIE()
{
o.childNodes[0].nodeValue+=".("+window.event.offsetX+"/"+window.event.offsetY+"\)";
}
</script>
</body>
</html>
25-03-2013 02.15
var myNewURL="foo.bar?"+encodeURIComponent("Hello World!");
alert(myNewURL);
var myParams=location.search;
myParams=myParams.substring(1, myParams.length);
myParams=decodeURIComponent(myParams);
alert(myParams);
location.hash kann dazu benutzt werden, für den Zustand einer dynamischen Seite eine URL in der Adressleiste zu erreichen, die man verlinken kann.
04-03-2010 20.40
Ein Input Element für Texte soll mit der Größe des bereits eingegebenen Strings dynamisch mitwachsen und schrumpfen.
Der Code kann entweder direkt am Element platziert werden
<input type="text" ... size="2" onkeyup="var newsize=this.value.length; if(newsize<2) { newsize=2; }; if(newsize>1000) { newsize=1000; }; this.setAttribute('size', newsize);" />
oder in eine Methode ausgelagert werden
<script type="text/javascript">
<!--
/* this function can be used to enlarge text input
* fields while the users enters text into it.
* Usage: <input type="text" onkeyup="enlarge_size_with_value_length(this);" ...
*/
function enlarge_size_with_value_length(o)
{
var minsize=2;
var maxsize=1023;
var newsize=o.value.length;
if(newsize<minsize) {
newsize=minsize;
};
if(newsize>maxsize) {
newsize=maxsize;
};
o.setAttribute('size', newsize);
};
//-->
</script>
<input type="text" ... size="2" onkeyup="enlarge_size_with_value_length(this)"
14-08-2011 23.12
Asynchronous JavaScript and XML
// get XMLHttpRequest object for most browsers
function getXMLHttpRequest()
{
if(window.XMLHttpRequest) return new XMLHttpRequest();
if(typeof ActoveXObject!="undefined") return new ActiveXObject("Microsoft.XMLHTTP");
return null;
}
talk2me=getXMLHttpRequest();
talk2me.onreadystatechange=gotOne;
talk2me.open("get", "data1.xml", true);
talk2me.send(null);
function gotOne()
{
if(talk2me.readyState==4)
{
if(talk2me.status==200)
{
alert(talk2me.responseText);
}
}
}
04-03-2010 20.40