Hallo J.,
In Mozilla klappt folgender Code einwandfrei, im MSIE 6 nicht. Was soll der Code machen? Wenn der User in ein <input type="text" /> fokussiert, soll der Text darin verschwinden, wenn er es verlässt, soll der alte Text erscheinen oder der neu eingetragene bleiben.
Jedes dieser inputs hat eine id und ein value, die immer gleich sind.
defaultValue existiert... http://selfhtml.teamone.de/javascript/objekte/elements.htm#default_value
Ich würde es so lösen:
<html>
<head>
<script type="text/javascript">
var ids=new Array('a', 'b', 'c');
function ci (e) {
if (!e) var e=window.event; // gemäß DOM ist das Event-Objekt im Funktionsparameter e, im MSIE stattdessen in window.event
elem=(e.srcElement) ? e.srcElement : e.target; // srcElement für MSIE, target für W3C-DOM-Browser
if (elem.value==elem.defaultValue) elem.value='';
}
function co (e) {
if (!e) var e=window.event;
elem=(e.srcElement) ? e.srcElement : e.target;
if (elem.value=='') elem.value=elem.defaultValue;
}
function init () {
for (i=0; i<ids.length; i++) {
if (elem=document.getElementById(ids[i])) { // getElementById muss nur einmal ausgeführt werden
if (elem.addEventListener) {
elem.addEventListener("focus", ci, true);
elem.addEventListener("blur", co, true);
} else {
if (elem.attachEvent) {
elem.attachEvent("onfocus", ci); // mit »on« im Eventnamen
elem.attachEvent("onblur", co);
}
}
}
}
}
window.onload=init; // hier wäre natürlich wieder attachEvent/addEventListener möglich, wenn du darauf bestehst
</script>
</head>
<body>
<form action="bla">
<p><input type="text" name="a" id="a" value="text1" /></p>
<p><input type="text" name="b" id="b" value="text2" /></p>
<p><input type="text" name="c" id="c" value="text3" /></p>
</form>
</body>
</html>
Siehe insgesamt http://www.quirksmode.org/js/contents.html#events ff. (hilft einem sehr weiter!)
if(this.value == this.id) // hier könnte der Fehler liegen. Ich weiß, this an dieser Stelle ist zumindest heikel.. hilft event.srcElement ?
Ja, srcElement hilft. Und für W3C-DOM-kompatible Browser würde ich event.target statt this verwenden.
Wie gesagt, bei Mozilla (Firefox und Firebird) funktionierts astrein. In MSIE dagegen passiert einfach nichts!
Das ist klar, für den MSIE musst du die Eventnamen mit »on« davor notieren und this als Verweis auf das Element, das den Event ausgelöst hat, versteht er auch nicht.
Selbst, wenn in der Funktion co() nur alert("lol"); steht.. dies wird dann wahllos beim Laden der Seite ausgelöst..
Hm, das verstehe ich nicht.
Zum Schluss: Es muss DOM-kompatibel bleiben, also nix mit onFocus oder onBlur :)
Wieso? Old-School-mäßig ohne attachEvent/addEventListener wäre es viel kompatibler.
Mathias