JavaScript Formular IE8-tauglich und NoScript-tauglich anzeigenverstecken

MBGucky

Der Mausbiber
ID: 170456
L
21 Februar 2007
214
3
Hi,

ich habe ein Gästebuch, das in allen aktuellen Browsern wunderbar funktioniert.
Das Eingabeformular liegt in einem div und kann über einen Link sichtbar gemacht werden
und über ein kleines X (natürlich auch ein Link) versteckt werden. Funktioniert wunderbar mit
Javascript. Code folgt unten.

Nun habe ich eine Ausweichmöglichkeit geschaffen, mit der das Formular auch ohne Javascript benutzt werden kann, aber trotzdem bei aktivem Javascript zunächst unsichtbar ist. Das ist ja noch ganz einfach, indem man einmal den Link zum Formular mittels Javascript schreibt und einmal ins <noscript></noscript> packt.

Dummerweise macht hier der IE8 Probleme und zeigt das Formular nicht an, sobald man den mittels JS generierten Link anklickt.

Ich habe daraufhin ein wenig rumgebastelt und ändere nun stattdessen mittels onload="" den Zustand des Formulars und das Ziel des Links für das Formular.
Dadurch ist es aber so, dass der IE8 nun das Formular anzeigt, obwohl es nicht angezeigt werden soll.

Da manche Besucher leider immer noch XP haben und trotzdem den IE verwenden, suche ich nun nach einer Lösung, wie beides funktioniert.


Hier auszugsweise mein Script in erster Variante:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>Gästebuch</title>
<script type="text/javascript">
	function neuer_Eintrag() {
		document.getElementById("formular").style.display="";
	}
	function abbrechen() {
		document.getElementById("formular").style.display="none";
	}
  </script>
</head>
<body>
<p><script type="text/Javascript">
		document.write("<a href=\"javascript:neuer_Eintrag()\">Neuer Eintrag</a>");
		</script>
		<noscript><a href="#formular">Neuer Eintrag</a></noscript>
</p>
  <div id="eintraege">
    Hier stehen die Einträge
  </div>
<script type="text/Javascript">
  document.write("<p><a href=\"javascript:neuer_Eintrag()\">Neuer Eintrag</a></p><br>");
  document.write("<div id=\"formular\" class=\"formularjs\" style=\"display:none;\">");
  document.write("<a href=\"javascript:abbrechen()\" id=\"abbr\"><img src=\"images/abbruch.gif\" alt=\"abbrechen\" ></a>");
</script>
<noscript>
<div id="formular" class="formularns">
</noscript>
<!-- hier steht das Formular -->
</div>
</body>
</html>

Und hier nun die Variante wo das Formular im IE8 sichtbar bleibt:

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>Gästebuch</title>
<script type="text/javascript">
	function neuer_Eintrag() {
		document.getElementById("formular").style.display="";
	}
	function abbrechen() {
		document.getElementById("formular").style.display="none";
	}
	function startfunction(){
		document.getElementById("formular").style.display="none";
		document.getElementById("formular").class="formularjs";
		document.getElementById("untererlink").style.display="";
		document.getElementById("untererlink").href="javascript:neuer_Eintrag()";
		document.getElementById("obererlink").href="javascript:neuer_Eintrag()";
	}
  </script>
</head>
<body onload="startfunction()">
<p><a href="#formular" id="obererlink">Neuer Eintrag</a>
</p>
  <div id="eintraege">
    Hier stehen die Einträge
  </div>
<p><a href="#formular" style="display:none;" id="untererlink">Neuer Eintrag</a>
</p>
<div id="formular" class="formularns">
<!-- hier steht das Formular -->
</div>
</body>
</html>

In beiden Fällen meckert der Debugger des IE8 Entwicklertools "Objekt erwartet".
 
function startfunction(){
document.getElementById("formular").style.display="none";
document.getElementById("formular").class="formularjs";
document.getElementById("untererlink").style.display=""; <-
document.getElementById("untererlink").href="javascript:neuer_Eintrag()";
document.getElementById("obererlink").href="javascript:neuer_Eintrag()";
}

Warum steht hier nix ?
Schalg mal bei https://de.selfhtml.org/css/eigenschaften/positionierung.htm#display nach.
Dort steht geschrieben, was möglich ist, aber "" sicher nicht !
Vll ist es auch das was Du sichst:
https://de.selfhtml.org/css/eigenschaften/positionierung.htm#visibility
 
doch, das ist genau so richtig. Der Wert für display soll von "none" auf "" geändert werden. Und genau dies macht die Zeile problemlos in allen Browsern außer dem IE8 (und früher wahrscheinlich auch).

aber schon die erste Zeile

HTML:
document.getElementById("formular").style.display="none";

wird im IE8 gar nicht aufgeführt. Was ich noch vergessen habe zu schreiben:

Der Fehler "Objekt erwartet tritt in der Zeile 21 von meinem 2. Script auf, also schon beim Aufrufen der Funktion.
 
So, ich habe es sicherheitshalber mal ausprobiert. Habe zwar hier nur den IE10 zur Verfügung, aber der hat ja einen Kompatibilitätsmodus und über die Entwicklertools (F12) auch die Möglichkeit, in die Ansicht eines älteren Browsers umzuschalten.

Zunächst habe ich dadurch festgestellt, dass sowohl der IE9 als auch der Kompatibilitätsmodus des IE10 ebenfalls betroffen sind. Erst der IE10 ohne Kompatibilitätsmodus macht es richtig.

Dann habe ich die von dir beanstandete Zeile
Code:
document.getElementById("untererlink").style.display="";
einfach mal komplett entfernt, falls der IE die ganze Funktion wegen eines deiner Meinung nach falschen Eintrags ignoriert und ich habe den tatsächlich hier geposteten Code verwendet, damit nicht noch irgendein versteckter Codeschnipsel im Originalcode dazwischenfunkt.
Lediglich den HTML-Kommentar habe ich in normalen Text geändert, damit ich das "Formular" sehen kann.

Ergebnis:
SCRIPT1010: Bezeichner erwartet
test.html, Zeile 14 Zeichen 41

SCRIPT5007: Der Wert der Eigenschaft "startfunction" ist Null oder undefiniert, kein Function-Objekt
test.html, Zeile 20 Zeichen 1

Das Problem blieb das selbe. Aber etwas anderes ist mir aufgefallen:
SCRIPT1010: Bezeichner erwartet
test.html, Zeile 14 Zeichen 41
meckert über die Zeile, in der ich die Klasse von formularns in formulrajs ändere.

Wenn ich diese Zeile rausnehme, funktioniert auf ein Mal das Script und es kommt auch keine Fehlermeldung mehr.

Mein zweitbester Freund Google hat mir mit folgendem weitergeholfen:

Um die class eines Elements zu ändern, verwendet man nicht class sondern className.
Also habe ich die Zeile wie folgt abgeändert:

Code:
document.getElementById("formular").className="formularjs";

So hat es dann einwandfrei funktioniert.
Ich hoffe, das hilft jemandem, falls noch jemand mal so ein Problem hat.

Und ich hoffe, ich kann das jetzt hier absenden, weil mein Firefox gerade aus irgendeinem Grund in den abgesicherten Modus gewandert ist. Sonst muss ich alles noch mal tippen :(

Edit:

1. ich musste nicht noch mal alles tippen
2. der IE ist der letzte Müll!

natürlich ändert er die Klasse. Aber er übernimmt nicht die CSS-Eigenschaften der neuen Klasse. Ich muss also trotzdem alle Eigenschaften der neuen Klasse per JS ändern :(

Oder hat noch jemand eine Lösung? setAttribute() hab ich auch schon probiert und klappt auch nicht.

Edit die 2te:

Ich habe es nun über die "alte Methode" mit dem document.write() und noscript gelöst.
Leider scheint der IE9 auch kein Position:fixed zu kennen, so dass ich hier auch wieder durm herum basteln musste. Ich bin ja schon froh, dass er transparente PNG kann, sonst hätte ich so langsam wirklich ein Problem.

Fazit:

alles läuft nun so wie es soll. Der IE ist kagge. Und vielleicht kann der Beitrag hier doch noch jemand anderem helfen.
 
Zuletzt bearbeitet: