J. Nanninga: attachEvent für IE (XHTML-, DOM-kompatibel)

Beitrag lesen

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.

var ids = new Array("name","password",...); // die ids der inputs, die einen event kriegen sollen.

for(i = 0;i < ids.length;i++) { //die ids werden einzeln durchgegangen
  if(document.getElementById(ids[i])) { // hier geht's für Mozilla weiter
    if(document.getElementById(ids[i]).addEventListener) {
      document.getElementById(ids[i]).addEventListener("focus",ci,true); // Event wirt "geaddet"
      document.getElementById(ids[i]).addEventListener("blur",co,true);
    } else {
      if(document.getElementById(ids[i]).attachEvent) { // hier geht's für MSIE weiter
        document.getElementById(ids[i]).attachEvent("focus",ci); // Event wird "attacht" (dies scheint auch zu funktionieren, denn attachEvent gibt hier - ich habs getestet - true zurück.
        document.getElementById(ids[i]).attachEvent("blur",co);
      }
    }
  }
}

function ci() {
  if(this.value == this.id) // hier könnte der Fehler liegen. Ich weiß, this an dieser Stelle ist zumindest heikel.. hilft event.srcElement ?
    this.value = ""; // Inhalt wird auf "" gesetzt. Hierdurch entsteht ünrigens ein weiterer Bug - diesmal in Mozilla: die AutoComplete-Funktion von Mozilla kommt offenbar nicht mit auf diese Art geleerten Feldern zurecht...
}

function co() {
  if(this.value == "")
    this.value = this.id; // Inhalt wird, wenn er nicht geändert wurde, wieder auf den Ursprungswert gesetzt.
}

Wie gesagt, bei Mozilla (Firefox und Firebird) funktionierts astrein. In MSIE dagegen passiert einfach nichts! Selbst, wenn in der Funktion co() nur alert("lol"); steht.. dies wird dann wahllos beim Laden der Seite ausgelöst..
Zum Schluss: Es muss DOM-kompatibel bleiben, also nix mit onFocus oder onBlur :)