Datumsfunktion + create.textNode
KD-one
- javascript
Hallo,
Ich habe folgendes Script, das nur im IE lief, für Geckos umgebaut:
<script type="text/javascript">
<!--
function xtime()
{
today = new Date();
day=today.getDate();
month=today.getMonth()+1;
year=today.getYear();
hour=today.getHours();
minutes=today.getMinutes();
seconds=today.getSeconds();
if (day < 10) {day="0"+day;}
if (month < 10) {month="0"+month;}
if (minutes < 10) {minutes="0"+minutes;}
if (seconds < 10) {seconds="0"+seconds;}
timeString= day + "." + month + "." + year + " " + hour + ":" + minutes + ":" + seconds;
ticktack.innerHTML = timeString;
window.setTimeout("xtime();", 100);}
window.onload = xtime;
//-->
</script>
Der relevante Teil sieht nun so aus und läuft auch grundsätzlich:
<script type="text/javascript">
<!--
function xtime()
{
[..........................nicht geänderte Angaben....................]
timeString= day + "." + month + "." + year + " - " + hour + ":" + minutes + ":" + seconds;
if (document.all)
{ticktack.innerHTML = timeString;}
else if(window.opera || (document.getElementById && !document.all))
{var timeString = document.createTextNode(day + "." + month + "." + year + " - " + hour + ":" + minutes + ":" + seconds);
document.getElementById('ticktack').appendChild(timeString);}
window.setTimeout("xtime();", 100);}
window.onload = xtime;
//-->
</script>
Nun treten aber 2 Probleme auf:
Erstens werden die geschützten Leerzeichen im timestring codiert, also als Klartext ausgegeben, und zweitens wird das Jahr nicht als 2003(wie im IE), sondern als 103 ausgegeben.
Kann mir bei den beiden Problemen jemand auf die Sprünge helfen?
Gruß
Kurt
Hi,
Erstens werden die geschützten Leerzeichen im timestring codiert, also als Klartext ausgegeben,
ja, DOM ist kein HTML.
und zweitens wird das Jahr nicht als 2003(wie im IE), sondern als 103 ausgegeben.
So ist getYear() definiert, es liefert die Jahre seit 1900. Der IE ist der einzige, der es falsch macht (oder hat Opera inzwischen den Bug adaptiert?). Benutze getFullYear().
Cheatah
Hallo,
Erstens werden die geschützten Leerzeichen im timestring codiert, also als Klartext ausgegeben,
ja, DOM ist kein HTML.
Kannst du mir auch dazu einen Lösungsweg aufzeigen? Der IE stellt sie nämlich nicht als Klartext dar, wobei ich nicht darauf vertrauen will, dass er das ausnahmsweise mal richtig macht.
So ist getYear() definiert, es liefert die Jahre seit 1900. Der IE ist der einzige, der es falsch macht (oder hat Opera inzwischen den Bug adaptiert?). Benutze getFullYear().
Danke, das hat geholfen.
Gruß
Kurt
Hi,
ja, DOM ist kein HTML.
Kannst du mir auch dazu einen Lösungsweg aufzeigen?
einfach nur Leerzeichen ausgeben. Wenn Du keine Umbrüche willst, benutze die white-space-Eigenschaft von CSS. innerHTML möchte ich nicht empfehlen, weil es nicht Teil von DOM ist, auch wenn es IE und Mozilla implementiert haben.
Der IE stellt sie nämlich nicht als Klartext dar, wobei ich nicht darauf vertrauen will, dass er das ausnahmsweise mal richtig macht.
Er macht.
Cheatah
Hallo,
einfach nur Leerzeichen ausgeben. Wenn Du keine Umbrüche willst, benutze die white-space-Eigenschaft von CSS.
Ja, das klappt nun. Allerdings wird nun nach jeder Sekunde ein neuer Eintrag erzeugt und hinten angefügt, anstatt den alten Wert zu überschreiben. So entsteht nun eine immer länger werdende Liste an Zeitangaben.
Wie kann ich die Geckos dazu bewegen, die bestehende Ausgabe einfach zu überschreiben, anstatt diese hinten anzufügen?
Im Moment fehlt mir der Plan dazu, wie ich das lösen könnte.
innerHTML möchte ich nicht empfehlen, weil es nicht Teil von DOM ist, auch wenn es IE und Mozilla implementiert haben.
Was ist mit dem IE4? der bliebe dann ja aussen vor, oder liege ich da falsch?
Gruß
Kurt
moin KD-one,
Allerdings wird nun nach jeder Sekunde ein neuer Eintrag erzeugt und hinten angefügt, anstatt den alten Wert zu überschreiben. So entsteht nun eine immer länger werdende Liste an Zeitangaben.
Wie kann ich die Geckos dazu bewegen, die bestehende Ausgabe einfach zu überschreiben, anstatt diese hinten anzufügen?
wenn ich das richtig sehe erzeugst du jedes mal einen neuen child-knoten, und hängst diesen dann ins dokument ein.
logisch, dass das immer mehr kinderchen ergibt.
nach dem das erste kind vorhanden ist, müsstest du also statt appendChild() wohl eher replaceChild() verwenden.
aber da du doch sowieso nur reinen text verwendest, finde ich das sowieso irgendwie zu umständlich.
warum krallst du dir nicht einfach einen textknoten, und änderst dessen inhalt, über die node-eigenschaft data http://selfhtml.teamone.de/javascript/objekte/node.htm#data?
das wäre m.e. doch viel einfacher, ist quasi das DOM-äquivalent zu innerText(!) des IE.
Was ist mit dem IE4? der bliebe dann ja aussen vor, oder liege ich da falsch?
IE4 ist in freier wildbahn heute m.e. so selten anzutreffen, dass mich der wirklich nicht mehr kratzen würde ...
gruss,
wahsaga
Hi,
Was ist mit dem IE4? der bliebe dann ja aussen vor, oder liege ich da falsch?
IE4 ist in freier wildbahn heute m.e. so selten anzutreffen, dass mich der wirklich nicht mehr kratzen würde ...
erweitern wir die Frage auf alle nicht-DOM-fähigen Clients, also z.B. auch Netscape 4. Tja, die können halt kein DOM und bleiben ergo außen vor. Da JavaScript aber grundsätzlich nur für optionale Dinge eingesetzt wird, ist das egal - frage die DOM-Fähigkeit ab und tue andernfalls schlichtweg nichts.
Cheatah
Hallo,
erweitern wir die Frage auf alle nicht-DOM-fähigen Clients, also z.B. auch Netscape 4. Tja, die können halt kein DOM und bleiben ergo außen vor. Da JavaScript aber grundsätzlich nur für optionale Dinge eingesetzt wird, ist das egal - frage die DOM-Fähigkeit ab und tue andernfalls schlichtweg nichts.
Naja, grundsätzlich würde es mich schon reizen, auch den NN4 zum laufen zu bringen, alledings ist es mir zu aufwendig, eine Syntax zu lernen, die zum Aussterben verurteilt ist. drum lass ich ihn lieber aussen vor. ;-)
Ein Datums-Zeitticker ist imho mehr als optional...
Danke füür eure Hilfe!
Gruß
Kurt
Hi,
Naja, grundsätzlich würde es mich schon reizen, auch den NN4 zum laufen zu bringen, alledings ist es mir zu aufwendig, eine Syntax zu lernen, die zum Aussterben verurteilt ist. drum lass ich ihn lieber aussen vor. ;-)
ich würde Netscape 4 als deutlich verbreiteter ansehen als den IE 4.
Ein Datums-Zeitticker ist imho mehr als optional...
Jupp :-)
Cheatah
hi,
ich würde Netscape 4 als deutlich verbreiteter ansehen als den IE 4.
und so lange immer noch vielfach erhebliche mühen darin investiert werden, diesem "gleich gut aussehende" seiten mit der gleichen vielfalt an optionalen features zu liefern, gibt man den NS4-benutzern auch keinen anreiz, sich endlich mal einen aktuellen browser zu besorgen ...
gruss,
wahsaga
und so lange immer noch vielfach erhebliche mühen darin investiert werden, diesem "gleich gut aussehende" seiten mit der gleichen vielfalt an optionalen features zu liefern, gibt man den NS4-benutzern auch keinen anreiz, sich endlich mal einen aktuellen browser zu besorgen ...
tztz, was heißt Anreiz?
Es gibt vielfältige Gründe eine alten Browser zu benutzen, die meisten hindern dich daran einen neuen Browser zu besorgen.
* keine Rechte zum installieren (Firma)
* langsamer Rechner
* altes aber funktionierendes System
* Unkenntnis wie man ein Programm installiert
* Angst um die alten Daten (bookmarks, emails)
wie schon öfters erwähnt, benutz ich auch noch einen IE 4. selbst Netscape 4 würde ich hier nicht installieren - viel zu langsamen Rechner mit zu wenig Speicher - der einzige Anreiz wäre ein neuer Rechner, aber das bezahlt mir hier keiner.
Struppi.
hi,
tztz, was heißt Anreiz?
Es gibt vielfältige Gründe eine alten Browser zu benutzen, die meisten hindern dich daran einen neuen Browser zu besorgen.
ja ja, ist mir doch alles bewusst ...
klar gibt es fälle, in denen es nicht in der macht des _nutzers_ liegt, sich einen besseren browser zu besorgen (uni-, firmennetzwerke). das liegt aber oft an der faulheit des admins, der keine lust hat, sich mit einem neuen browser zu beschäftigen, und wie er diesen _sicher_ in die systemlandschaft eingebunden kriegt, obwohl dies mit modernen browsern wie mozilla durchaus möglich sein sollte.
hier sollten dann die nutzer genügend druck auf den admin ausüben, ihnen endlich ein zeitgemäßeres programm zum arbeiten zur verfügung zu stellen.
so lange aber die benutzten seiten im NS4 noch genau so gut aussehen und alles bieten, was die seite in modernen browsern auch bietet, besteht für die nutzer ja gar kein grund, druck auf den admin auszuüben.
dies wird dann dadurch erkauft, dass der seitenersteller stundenlang an workarounds für den NS4 tüffelt - und eben das muss m.e. nicht mehr sein.
eine seite hat für mich im NS4 _benutzbar_ zu sein, nicht weniger, aber auch nicht mehr.
wenn du dir aber bei jeder seite die mühe machst, dem NS4-nutzer annähernd gleiches aussehen, und die gleiche anzahl an optionalen features zu bieten, wirst du eben diesen aufwand für die nächste und die übernächste seite auch wieder machen müssen - da der NS4 nutzer auch dann noch mit seinem dino surft.
ich bin der meinung, dass der NS4 endlich weg vom fenster gehört, weil es "modernem" webdesign einfach zu viele steine in den weg legt, bzw. vielfach erhöhten aufwand bedeutet.
diese "ziel" erreichen wir aber bestimmt nicht, in dem wir den netscape-4-nutzern bis in alle ewigkeit zucker in den allerwertesten blasen ...
gruss,
wahsaga
Hallo wahsaga,
wenn ich das richtig sehe erzeugst du jedes mal einen neuen child-knoten, und hängst diesen dann ins dokument ein.
logisch, dass das immer mehr kinderchen ergibt.
Öhm ja, eigentlich schon. :-)
nach dem das erste kind vorhanden ist, müsstest du also statt appendChild() wohl eher replaceChild() verwenden.
aber da du doch sowieso nur reinen text verwendest, finde ich das sowieso irgendwie zu umständlich.
warum krallst du dir nicht einfach einen textknoten, und änderst dessen inhalt, über die node-eigenschaft data http://selfhtml.teamone.de/javascript/objekte/node.htm#data?
das wäre m.e. doch viel einfacher, ist quasi das DOM-äquivalent zu innerText(!) des IE.
Nun, ursprünglich gab es in dem Div keine Textknoten. Den musste ich erst einfügen, aber nun gehts, und wie du sagtest, wesentlich einfacher, als mit appendChild.
Nun sieht der relevante Teil so aus:
[...]
timeString = day + "." + month + "." + year + " - " + hour + ":" + minutes + ":" + seconds;
if (document.all)
{ticktack.innerHTML = timeString;}
else if(window.opera || (document.getElementById && !document.all))
{document.getElementById('ticktack').firstChild.data = timeString;}
window.setTimeout("xtime();", 1000);
}
window.onload = xtime;
Im Grunde genommen bin ich ja immer noch auf der Anfängerspur in JS, ich lerne am besten dazu, wenn ich bestehende Scripte verbessern will. ;-)
Was ist mit dem IE4? der bliebe dann ja aussen vor, oder liege ich da falsch?
IE4 ist in freier wildbahn heute m.e. so selten anzutreffen, dass mich der wirklich nicht mehr kratzen würde ...
Meinst du wirklich? Andererseits schadet es aber auch niemanden, wenn das Script auch für diesen kompatibel ist, oder?
Gruß
Kurt
Hi,
else if(window.opera || (document.getElementById && !document.all))
diese Abfrage braucht nur auf document.getElementById zu lauten - und sollte als erste stattfinden (häufigster Fall).
Andererseits schadet es aber auch niemanden, wenn das Script auch für diesen kompatibel ist, oder?
Kommt auf Deine Definition von "kompatibel" an. Es sollte auf jeden Fall dort keinen Fehler geben :-)
Cheatah
Hallo,
Hi,
else if(window.opera || (document.getElementById && !document.all))
diese Abfrage braucht nur auf document.getElementById zu lauten - und sollte als erste stattfinden (häufigster Fall).
Ok, das ändere ich noch. Das ist ja daraus entstanden, daß der IE-Teil schon vorhanden war und ich den DOM-Teil erst hinzugefügt habe.
Andererseits schadet es aber auch niemanden, wenn das Script auch für diesen kompatibel ist, oder?
Kommt auf Deine Definition von "kompatibel" an. Es sollte auf jeden Fall dort keinen Fehler geben :-)
Was meinst du mit "es sollte..."? _Könnte_ es Probleme damit geben? Dann fliegt es raus...
Gruß
Kurt
Hi,
Das ist ja daraus entstanden, daß der IE-Teil schon vorhanden war und ich den DOM-Teil erst hinzugefügt habe.
rate mal, was "else" bedeutet ;-)
Kommt auf Deine Definition von "kompatibel" an. Es sollte auf jeden Fall dort keinen Fehler geben :-)
Was meinst du mit "es sollte..."? _Könnte_ es Probleme damit geben?
Ich rede von JavaScript-Fehlern, und die hast Du durch hinreichend günstiges Vorgehen im Griff. Die Abfrage auf Existenz der verwendeten Objekte und Methoden ist eines der Dinge, die ich meine.
Cheatah
Hallo,
Was meinst du mit "es sollte..."? _Könnte_ es Probleme damit geben?
Ich rede von JavaScript-Fehlern, und die hast Du durch hinreichend günstiges Vorgehen im Griff. Die Abfrage auf Existenz der verwendeten Objekte und Methoden ist eines der Dinge, die ich meine.
Aso. :-)
Nun hab ich dem Script seine endgültige Fassung gegeben, könntest du nochmal drüberschauen und eventuelle Fehler oder Missgriffe aufdecken? :-)
<script type="text/javascript">
<!--
function xtime()
{
today = new Date();
day=today.getDate();
month=today.getMonth()+1;
year=today.getFullYear();
hour=today.getHours();
minutes=today.getMinutes();
seconds=today.getSeconds();
if (day < 10)
{day="0"+day;}
if (month < 10)
{month="0"+month;}
if (minutes < 10)
{minutes="0"+minutes;}
if (seconds < 10)
{seconds="0"+seconds;}
timeString = day + "." + month + "." + year + " - " + hour + ":" + minutes + ":" + seconds;
if (window.opera || (document.getElementById && !document.all))
{if (document.getElementById('ticktack').hasChildNodes() == false)
{
var child = document.createTextNode("begin");
document.getElementById('ticktack').appendChild(child);
}
document.getElementById('ticktack').firstChild.data = timeString;
}
else if (document.all)
{
ticktack.innerHTML = timeString;
}
window.setTimeout("xtime();", 1000);
}
window.onload = xtime;
//-->
</script>
Das Div hat anfänglich keine Kindknoten, deshalb die Abfrage auf Existenz eines Kindknotens.
Man könnte ja einen Kindknoten hineinschreiben, aber so empfinde ich das Ganze als sauberer.
Danke dir.
Gruß
Kurt
<script type="text/javascript">
<!--
function xtime()
{
today = new Date();
day=today.getDate();
month=today.getMonth()+1;
year=today.getFullYear();
hour=today.getHours();
minutes=today.getMinutes();
seconds=today.getSeconds();if (day < 10)
{day="0"+day;}
if (month < 10)
{month="0"+month;}
if (minutes < 10)
{minutes="0"+minutes;}
if (seconds < 10)
{seconds="0"+seconds;}
aus Bequemlichkeit und Übersichtlichkeit
if (day < 10) day = "0" + day;
if (month < 10) month = "0" + month;
if (minutes < 10) minutes = "0" + minutes;
if (seconds < 10) seconds = "0" + seconds;
else if (document.all)
{
ticktack.innerHTML = timeString;
na, dann aber auch richtig, man weiss ja nie ob die Fehlerkorrektur nicht doch mal stolpert:
document.all['ticktack'].innerHTML = timeString;
Struppi.
Hallo Struppi,
aus Bequemlichkeit und Übersichtlichkeit
if (day < 10) day = "0" + day;
if (month < 10) month = "0" + month;
if (minutes < 10) minutes = "0" + minutes;
if (seconds < 10) seconds = "0" + seconds;else if (document.all)
{
ticktack.innerHTML = timeString;na, dann aber auch richtig, man weiss ja nie ob die Fehlerkorrektur nicht doch mal stolpert:
document.all['ticktack'].innerHTML = timeString;
Ok, danke, das korrigiere ich noch.
Gruß
Kurt
innerHTML möchte ich nicht empfehlen, weil es nicht Teil von DOM ist, auch wenn es IE und Mozilla implementiert haben.
Was ist mit dem IE4? der bliebe dann ja aussen vor, oder liege ich da falsch?
Ja tust du, der IE 4 kann prima innerHTML.
Struppi.
Ja, ich benutze ihn hier - ist der schnellste Browser auf dem P100 (meistens) - NN 3.01 ist zwar schneller - aber da bleibt bei den meisten Interentseiten kaum was übrig.
Hallo Struppi,
Was ist mit dem IE4? der bliebe dann ja aussen vor, oder liege ich da falsch?
Ja tust du, der IE 4 kann prima innerHTML.
Ja, ich benutze ihn hier - ist der schnellste Browser auf dem P100 (meistens) - NN 3.01 ist zwar schneller - aber da bleibt bei den meisten Interentseiten kaum was übrig.
Keine Angst, ich hab's dringelassen. ;-)
Könntest du eventuell auch mal hier drüberschauen, ob du was verbesserungswürdiges entdeckst?
[pref:t=64836&m=369270]
Gruß
Kurt
Hi,
Erstens werden die geschützten Leerzeichen im timestring codiert, also als Klartext ausgegeben,
ja, DOM ist kein HTML.
Kannst du mir auch dazu einen Lösungsweg aufzeigen? Der IE stellt sie nämlich nicht als Klartext dar, wobei ich nicht darauf vertrauen will, dass er das ausnahmsweise mal richtig macht.
Sowas geht auch: String.fromCharCode(160);
Allerdings macht mac-ie 5.0 da Probleme.
Gruesse Joachim
Hallo Joachim,
Sowas geht auch: String.fromCharCode(160);
Allerdings macht mac-ie 5.0 da Probleme.
ich verzichte lieber auf die geschützten Leerzeichen, bevor ich mir neue Probleme einhandle. ;-)
Gruß
Kurt