speedy: einen Teil der Seite dynamisch generieren - die 2.

Hallo,

ich hatte ja schonmal was dazu gefragt - ich wollte einen Teil der Seite "zur Laufzeit" ständig neu generieren, wenn neue Daten gesetzt werden - also nicht nur beim ersten Aufruf der Seite. Die Seite muß auch immer vorhanden sein und darf nicht irgendwann zwischendurch durch ein cgi-Script etc. (oder eben die komplette Seite durch Javascript) neu aufgebaut werden, damit bestimmte hidden input-Felder stets erreeichbar sind bzw. ausgelesen werden können. Jedenfalls sollte der Inhalt des Feldes auch im Design der Seite angezeigt werden (ohne die Möglichkeit, das input-Feld selber per CSS zu stylen). Ich hab das versucht, wie unten zu sehen, zu lösen. Dabei wollte ich, daß beim ersten Aufruf der Seite unten durch WriteUser('') der Layer bzw. das DIV-Feld komplett generiert wird (je nach Browser) und dann bei den folgenden Aufrufen nur noch der Inhalt des jeweiligen Layer/DIV Feldes neu gefüllt wird - nur klappt das so anscheinend nicht. ... setData(user) kann zu jeder Zeit von einer anderen HTML Seite aufgerufen werden, um neue Daten zu übergeben ... Wo ist da mein Denkfehler bzw. was mache ich da falsch bzw. was muß ich machen, damit es so in der Art funktioniert ?

<html>
<head>
<script Language="Javascript">
<!--
var firstUser = 0;
var is_IE = RoutineZumRausfindenObIE();
var currentUser=null;

function WriteUser(user)
{
 if(firstUser == 0)
 {
  if (is_IE)
  {
   document.writeln('<DIV align="right" id=currentUser style="position:absolute;top:13;left:14;WIDTH:120;background-color:ff0000;visibility:visible;">');
   document.writeln('<font face="arial"> '+user+' </font></DIV>');
   currentUser = document.all.currentUser;
  }
  else
  {
   document.writeln('<LAYER name="currentUser" top="12" left="13" WIDTH="119" visibility="show" bgcolor="ff0000">');
   document.writeln('<div align=right><font face="arial"> '+user+' </font></div></LAYER>');
   currentUser = document.currentUser;
  }
  firstUser = 1;
 }
 else
 {
  if (is_IE)
  {
   currentUser.innerHTML = '<font face="arial" size=1> '+user+' </font>';
  }
  else
  {
   currentUser.document.writeln('<div align=right><font face="arial" size=1> '+user+' </font></div>');
  }
 }
}

function setData(user)
{
 this.document.userdata.user.value = user;
 WriteUser(user);
}
//-->
</script>
</head>
<body>
<form name=userdata>
<input type=text name=user value="user2">
</form>
<script Language="Javascript">
<!--
WriteUser('');
//-->
</script>
</body>
</html>

MFG,
speedy

  1. Wo ist da mein Denkfehler bzw. was mache ich da falsch bzw. was muß ich machen, damit es so in der Art funktioniert ?

    Was für ein Fehlermeldung erhälst du? http://glasgoogle.de

    <script Language="Javascript">

    da fehlt das type Attribut.

    <!--
    var firstUser = 0;
    var is_IE = RoutineZumRausfindenObIE();

    bist du sicher das du diese brauchst?

    in der Regel sind diese Routinen nämlich absoluter Unfug, da diese nicht rausfinden, was der Browser kann, sondern wie er heißt und das sagt wenig über dessen Fähigkeit aus.

    function WriteUser(user)
    {
    if(firstUser == 0)
    {
      if (is_IE)
      {
       document.writeln('<DIV align="right" id=currentUser style="position:absolute;top:13;left:14;WIDTH:120;background-color:ff0000;visibility:visible;">');
       document.writeln('<font face="arial"> '+user+' </font></DIV>');

    Also CSS würd ich in einen externen Block packen, zumal  du einenm sehr gruseligen MischMasch verwendest. Der font tag ist veraltet und soll nicht mehr verwendet werden (ist auch nicht mehr nötig). ausserdem werden Hex Farbwerte mit einem führenden # gekennzeichnet und bei den Werten fehlt eine Einheit.

    currentUser = document.all.currentUser;

    wieso ist document.all.currentUser?
    auch der IE 4 sollte document.currentUser kennen.

    }
      else
      {
       document.writeln('<LAYER name="currentUser" top="12" left="13" WIDTH="119" visibility="show" bgcolor="ff0000">');
       document.writeln('<div align=right><font face="arial"> '+user+' </font></div></LAYER>');

    Der LAYER Tag ist hier völlig überflüssig, da der NC 4.x auch DIV positionieren kann. Aber hier sieht man auch das deine Unterscheidung offensichtlich nur 4'er Browser berücksichtigt und vermutlich in modernen Browsern gar nciht mehr läuft.

    currentUser.document.writeln('<div align=right><font face="arial" size=1> '+user+' </font></div>');

    Falls du hier einen Layer im NC 4.x neu beschreiben willst, fehlt noch ein open() und close()

    function setData(user)
    {
    this.document.userdata.user.value = user;

    was ist this?
    Du meinst window oder self?

    this bezieht sich immer auf den momentanen Kontext, den du aber gar nicht willst, sondern du willst das aktuelle Fenster ansprechen.

    Struppi.

    1. Hallo,

      Was für ein Fehlermeldung erhälst du? http://glasgoogle.de

      Keinen ... es wird anscheind der Code für den ersten Aufruf nochmal ausgeführt - also einzig und allein das DIV neu geschrieben und das restliche HTML ist weg (wenn ich auf Quelltext anzeigen im IE gehe, wird mir nur das DIV angezeigt)

      <script Language="Javascript">
      da fehlt das type Attribut.

      Ähm ... achso, dann also nur type="text/javascript" schreiben und ohne Language-Attribut ?

      var is_IE = RoutineZumRausfindenObIE();
      bist du sicher das du diese brauchst?

      Na denke ich mal schon, wenn ich zwischen Sachen für IE und NS unterscheiden will/muß. (siehe unten)

      Also CSS würd ich in einen externen Block packen, zumal  du einenm sehr gruseligen MischMasch verwendest.

      :)

      Der font tag ist veraltet und soll nicht mehr verwendet werden (ist auch nicht mehr nötig).

      Ähm ... ich wollt eigentlich bis zu NS bzw. IE 4.x kompatibel sein ... und die mögen manch CSS Befehl noch nicht so wirklich.

      ausserdem werden Hex Farbwerte mit einem führenden # gekennzeichnet und bei den Werten fehlt eine Einheit.

      Ähm ... beim Layer, ok, habs einfach vergessen ... beim CSS war ich der Meinung, mal irgendwo gesehen zu haben, daß dort kein # verwendet wird (hatte mich seinerzeit auch gewundert) ... ok, also doch mit # schreiben.

      currentUser = document.all.currentUser;
      wieso ist document.all.currentUser?
      auch der IE 4 sollte document.currentUser kennen.

      hmm ... ich hatte folgendes in SelfHTML gefunden: document.all.meinAbsatz.innerHTML ... und daher diese Schreibweise, um dann in das DIV per innerHTML schreiben zu können.

      Der LAYER Tag ist hier völlig überflüssig, da der NC 4.x auch DIV positionieren kann. Aber hier sieht man auch das deine Unterscheidung offensichtlich nur 4'er Browser berücksichtigt und vermutlich in modernen Browsern gar nciht mehr läuft.

      Hmm ... um so besser :) ... da ich nicht genau wußte, wie ich das am Besten mache mit der ganzen Unterscheidung etc., damit das auch überall ordentlich funktioniert, habe ich mir von einem AdServer-Anbieter (AdTech) den Code für das StickyAd geholt und den dann für meine Zwecke umgeschrieben. Ich hab mir gedacht, die sind am ehesten daran interessiert, daß die Banner auf so vielen Browsern bzw. Browserversionen wie möglich angezeigt werden - und ich will ja meine Anzeige auch auf so vielen Browsern bzw. Versionen wie möglich anzeigen. Hier der Code für die Browser-Unterscheidung (ist der nach deiner Meinung i.o. ? - das Original findet man bei AdTech.de bei den Bannerbeschreibungen, beim StickyAd - falls ich hier nen Schreibfehler drin hab):

      var nav_typ = navigator.userAgent.toLowerCase();
      var nav_major = parseInt(navigator.appVersion);
      var nav_minor = parseFloat(navigator.appVersion);
      var is_NS  = ((nav_typ.indexOf('mozilla')!=-1) && (nav_typ.indexOf('spoofer')==-1) && (nav_typ.indexOf('compatible') == -1) && (nav_typ.indexOf('opera')==-1) && (nav_typ.indexOf('webtv')==-1));
      var is_IE = (nav_typ.indexOf("msie") != -1) || (is_NS && nav_major >= 5);

      Falls du hier einen Layer im NC 4.x neu beschreiben willst, fehlt noch ein open() und close()

      Ok.

      this.document.userdata.user.value
      was ist this?
      Du meinst window oder self?
      this bezieht sich immer auf den momentanen Kontext, den du aber gar nicht willst, sondern du willst das aktuelle Fenster ansprechen.

      Ähm ... ich meine damit - yep, das aktuelle Fenster (bzw. this=window nach meiner Denke) - bzw. die aktuelle HTML Datei im aktuellen Frame, um auf das Formular zuzugreifen - wie schreib ich das sonst besser ? - einfach anstatt dem this das self ? - nur das mit dem "momentanen Kontext" verstehe ich nicht so ganz - die HTML-Datei (bzw. das aktuelle Fenster) ist nicht der momentane Kontext, wenn ich da oben im Javascript-Bereich bin ?

      MFG,
      speedy