Patrick: Experimente oder wie bringe ich Netscape dazu...

...ohne weiteres Zutun selbsttätig JavaScript auszuschalten...

Hallo Fangemeinde!

Ich bin immer noch dabei, eine Lösung zu dem weiter unten geposteten Problem mit der IKHF-Seite zu suchen: http://www.teamone.de/selfaktuell/self_forum/16259.html.

Es ging ja darum, daß ungeduldige User<g>, die einen Verweis ansteuern, bevor die Seite fertig geladen wird (sollte man nicht machen, sowas, tss, tss <g>), mit einer JS-Fehlermeldung bestraft werden.

Der Code ist ziemlich lang (ca. 11 KB) und wenn die Datei nicht vollsändig geladen wird, kommen halt diese unangenehmen Meldungen. Hat man sie wegegklickt, und die Seite ist dann geladen, funzt alles wie gewünscht.

Ich habe Verschiedenes versucht, und bin zu keinem Erfolg gekommen. Ich mußte ebenfalls feststellen, daß auch die Seite, von welcher ich das Script habe, http://www.webreference.com/js/column16/, diese Fehlermeldung generiert, wenn man rasend schnell genug ist, die 3 Verweise anzusteuern, bevor die (im Vergleich zu meinem um einiges kürzere) Seite geladen wird.

Mittlerweile habe ich auf einer Testseite http://atomic-eggs.com/temp/ikhf/istartd_r.html noch etwas eingebaut, das wie im Titel erwähnt, Netscape (4.51) zur Arbeitsverweigerung bringt:

Die istartd_r.html enthält zum Beispiel einen 7. Tooltip mit einem Link zu Atomic Eggs. Die Sache funzt mit dem IE einwandfrei, und mit Netscape 4.04 einigermaßen. Große Überraschung hatte ich heute morgen mit dem 4.51!!! So nach dem Motto: wie bringe ich Nestcape dazu, JavaScript selbst auszuschalten... Wenn man also über den Verweis "webmaster@atomic-eggs.com" drüberfährt und das Tooltip geht auf, bleibt dieser ja stehen, da die "clearEl()"-Funktion bewußt bei onMouseOut weggelassen wurde. Vielmehr wird diese beim "onClick()"-Event aufgerufen, der beim Klicken auf dem Verweis innerhalb des Tooltips zum Wirken kommt. Soweit so gut... Es wird ein neues Fenster aufgerufen und die Tooltipbox verschwindet in der Tat. Nun, nachdem man das 2. Fenster mit Atomic Eggs wieder geschlossen hat, ist es von nun an unmöglich, mit dem 4.51 jegliche Webseite zu öffnen, die JavaScript und/oder CSS enthält (Seite ohne CSS und JS werden aufgerufen). Das Tolle: klicken mit der rechten Maustaste ist von da an auch wirkungslos, es erscheint kein Kontextmenü mehr. Und das Supertolle: es bleibt so bis zum nächsten Neustart, nicht von Netscape, sondern von Windows! Einfach Netscape beenden und erneut aufrufen bringt da nichts. Erst nach einem Windows-Neustart stehen CSS und JS wieder zur Verfügung.

Ich liebe diesen Browser! Bis das [del] uns scheidet.

Bis danndann

PAF (patrickausfrankfurt)

  1. Hi Patrik,

    ich kann Dir sagen, wie ich es mache. Allerdings programmier ich zur Zeit auch nur DHTML. Also ich mache grundsaetzlich alle sensitiven Elemente der Seite unsichtbar, solange bis die Seite komplett geladen ist. Eine andere Moeglichkeit ist, jedesmal vorher abzufragen, ob die eine oder andere Aktion jetzt schon ausgefuehrt werden kann. mehr faellt mir dazu auch nicht ein. Aber so ist das eben mit den Surfern, die es nicht erwarten koennen :-)

    Viele Gruesse, Thomas.

  2. Hi Patrick,

    ein Versuch der Erklärung des "Ausschaltens" des Javascripts/CSS:

    Dass das CSS und Javascript gleichzeitig weg sind, liegt an der Verknüpfung der beiden Dinge im Netscape Navigator (Stichwort: JavaScriptStyleSheet).
    Wahrscheinlich stürzt die Javascriptmaschine ab - schau mal nach dem "Ausschalten" und Beenden des Navigators mit Strg+Alt+Entf. (Dem Microsoft Griff) in die Taskliste - Vermutlich findest Du da immer noch den Navigator, denn der rödelt da immer noch vor sich hin.

    Der Grund dafür dürfte folgendes sein (ich habe mir mal den Quelltext angesehen):

    In der Funktion aktivateEl(id,e), wird eine bestimmtes(id) Tooltipfenster as "aktive" gekennzeichnet, und dann wird mit checkEl(e) per Settimeout auf den Mousemove-Event gewartet, und mit jedem Mousemove wird das aktivierte Element immer wieder auf sichtbar gestellt. Dieses Settimeout merkt sich die Funktion mit "timerid".

    Wenn dann der Mouseout-Befehl kommt, wird dieses aktivierte Element mit ClearEl() wieder unsichtbar und das die mit timerid gekennzeichnete Schleife wird beendet.

    Bei dem Link auf Deine atomic-eggs-Seite (id=mailto) fehlt dieses ClearEl() des aktivierten Elemetes, wenn nicht direkt auf den Link geklickt wird, denn dann wird vielleicht ein anderes Tooltipfenster geöffnet und damit ein anderes als "active" und die alte "timerID" wird durch eine neue "timerID" überschrieben und immer wieder wird die Maus bewegt und Netscape durchläuft jedesmal neu die alten Timeout-Schleife - ohne dass das erste aktivierte Element (mailto) und die daran hängenden Schleife (timerID) durch ein clearEl() jemals ausgeschaltet wird, falls Du dann noch mal über den atomic-eggs Link fährst, wird dann sogar noch eine weiterer Schleifensatz gestartet und so weiter. (Mit ein bißchen "Mühe" kriegt man damit auch Netscape 4.03 und den Internet-Explorer zum Absturz, den den dann aber völlig ;-) ).

    Du müßtest also ein doppel der Funktionen hinzufügen, die sich nur genau mit diesem eine aktivierte Element beschäftigt, also auch einmalige TimerId und einmalige "aktive"-Variable.

    Ich würde dir aber eher raten auf den Link in der Form zu verzichten oder einen Satz spezieller Funktionen mit eigener TimerID nur für diesen Link zu erstellen... aber ich weiß nicht ob das lohnt, vielleicht doch einfach ein Link auf der Seite? ;-)

    Gruß

    Leonhard

    P.S. Noch ein Hinweis: Die clearEL()-Funktion ist zweimal definiert (im Scriptteil über und im Scriptteil unter dem HTML-Text) so was sollte man normalerweise vermeiden.

    1. Hallo Leonhard!

      Vielen Dank für die Mühe, die Du Dir beim Antworten gemacht hast.

      Deine Erklärungen waren auch für einen JS-Laie wie mich gut verständlich.

      Ich werde den Link im Tooltip weglassen, wie gesagt, es war nur ein Experiment. Allerdings, hätte es gefunzt... wäre die Idee nicht schlecht gewesen, und wenn mehr Zeit zur Verfügung steht, werde ich die Idee wieder aufgreifen. Vielleicht habe ich bis dahin auch mehr gelernt (ich habe seit nun fast einen Monat ein JS-Buch und noch keine Gelegenheit/Zeit gehabt richtig hinein zu schauen).

      Nur so viel zu der doppelt definierten "clearEl()": so steht es im Originalscript, und auf der entsprechenden Seite wird auch erklärt, warum:

      "Furthermore, these event handlers are supported by all JavaScript-enabled browsers, while the script is only parsed by fourth-generation ones (thanks to the LANGUAGE="JavaScript1.2" attribute). Thus, we must define our standard browser-detection variables. Simply include the following script in the <HEAD>...</HEAD> portion of the document:

      <SCRIPT LANGUAGE="JavaScript">
      <!--

      var NS4 = (document.layers) ? 1 : 0;
      var IE4 = (document.all) ? 1 : 0;

      function clearEl() {}

      // -->
      </SCRIPT>

      NS4 is true if the browser supports the document.layers object. In other words, it is true for Navigator 4.0x. The second variable, IE4, is true if the browser supports the document.all object. That is, it is true for Internet Explorer 4.0x. Note that 1 and 0 are equivalent to true and false. We use them because they are shorter.

      If the browser is Navigator 4.0x or Internet Explorer 4.0x, the new definitions of the preceding functions overwrite the original (empty) definitions.

      Notice that we define clearEl() as an empty function in this script. If the user is running a fourth-generation browser, the new definition overwrites this one, so the function isn't just an empty one. But since we don't want older browsers to generate errors when they encounter clearEl() (in an onMouseOut event handler), we must include an alternative definition. We don't need to initially define activateEl() as an empty function for older browsers, because it is only executed if the user is running a fourth-generation browser. "

      Also eine Art Anti-Fehlermeldung für ältere Browser, oder habe ich es falsch verstanden?

      Danke nochmals und

      Bis danndann

      PAF (patrickausfrankfurt)

      1. Hallo Patrick,

        Notice that we define clearEl() as an empty function in this script. If the user is running a fourth-generation browser, the new definition overwrites this one, so the function isn't just an empty one. But since we don't want older browsers to generate errors when they encounter clearEl() (in an onMouseOut event handler), we must include an alternative definition. We don't need to initially define activateEl() as an empty function for older browsers, because it is only executed if the user is running a fourth-generation browser. "

        Das ist ja klasse, wenn das stimmt, daß neue Funktionsdefinitionen alte überschreiben.

        Damit kriegst Du dann ja auch das Problem mit dem zu schnellen überfahren der Links beim Laden geregelt :-)):

        Einfach im head schon mal eine leere Funktion aktivateEL(id,e){ } definieren, dann wird diese leere Funktion, die dann ja schon da ist, ausgeführt, auch wenn die wirkliche noch nicht geladen ist. Dann passiert zwar nix, so lange die wirkliche aktivateEL-Funktion noch nicht da ist - aber das ist ja besser als ein Javascripterror, ode etwa nicht?
        :-))

        Viel Spaß noch beim ausprobieren ;-)

        Gruß

        Leonhard

        1. Hallo Leonhard!

          Einfach im head schon mal eine leere Funktion aktivateEL(id,e){ } definieren, dann wird diese leere Funktion, die dann ja schon da ist, ausgeführt, auch wenn die wirkliche noch nicht geladen ist. Dann passiert zwar nix, so lange die wirkliche aktivateEL-Funktion noch nicht da ist - aber das ist ja besser als ein Javascripterror, ode etwa nicht?

          »»  :-))

          Leider hat es nichts gebracht. Auch die anderen 3 übrigen Funktionen als "leere" Funktionen zu definieren brachte nichts: immer wieder wird bemängelt, daß auf Zeile 263 "active" nicht definiert wird.

          Ich muß jedes mal die Datei umbenennen, da ich mit ISDN surfe... und wenn die Datei einmal geladen worden ist, ist die beim 2. Aufruf so schnell aufgebaut, daß es zu keinerlei Fehlermeldung kommt.

          Also, leider noch keine Lösung in Sicht...

          Danke trotzdem und bis danndann

          PAF (patrickausfrankfurt)

          Viel Spaß noch beim ausprobieren ;-)

          Gruß

          Leonhard

    2. Wahrscheinlich stürzt die Javascriptmaschine ab - schau mal nach dem "Ausschalten" und Beenden des Navigators mit Strg+Alt+Entf. (Dem Microsoft Griff) in die Taskliste - Vermutlich findest Du da immer noch den Navigator, denn der rödelt da immer noch vor sich hin.

      Hehe.. jau.. unter NT hatte ich schon 5 mal Netscape
      noch im Taskmanger zum laufen.. nachdem ich alle Versionen
      gekillt hatte funzte es wieder...
      Inzwischen wunder ich mich auch nicht mehr das WIN95 mir
      mit Netscape so oft abstürzte.. bei NT wird Netscape einfach
      bei vielen Sachen gnadenlos terminiert.. WIN95 lässt ihn
      wohl noch weiterlaufen obwohl er Müll im Speicher produziert..
      Die Folge... System wird instabil.. und irgendwann isses
      denn halt ganz tot...

      Liegt natürlich alles nur am Windows.. weil NS ist gut, und
      MS BÖSE,.. *g*

      naja.. gehörte nicht wirklich zum Thema aber das musste
      ich mal loswerden.. :)

      gruss
      Jens

  3. Der Code ist ziemlich lang (ca. 11 KB) und wenn die Datei nicht vollsändig geladen wird, kommen halt diese unangenehmen Meldungen. Hat man sie wegegklickt, und die Seite ist dann geladen, funzt alles wie gewünscht.

    Hallo Patrick,

    vielleicht mal eine Idee zu deinem Problem, ob es klappt weiß ich auch nicht.
    Lege am Dateianfang eine globale Variable fest
    var schonda;
    schonda="nein";

    und am Ende deines Scriptes dann schonda="da";

    frage in deinen Funktionen diese Variablen ab
    und mache die Ausführung abhängig vom Ergebnis

    Viele Grüße

    Antje

    1. Hallo Antje!

      vielleicht mal eine Idee zu deinem Problem, ob es klappt weiß ich auch nicht.
      Lege am Dateianfang eine globale Variable fest
      var schonda;
      schonda="nein";

      und am Ende deines Scriptes dann schonda="da";

      frage in deinen Funktionen diese Variablen ab
      und mache die Ausführung abhängig vom Ergebnis

      Leider habe ich immer noch folgende Meldung (immerhin werden die Funktionen nicht mehr bemängelt):

      JavaScript Error:
      http://atomic-eggs.com/temp/ikhf/xyz_2.html, line
      273:

      active is not defined.

      Aber vielleicht habe ich die Variable falsch definiert/eingesetzt<g>

      Wenn Du willst, kannst Du im Quelltext: http://atomic-eggs.com/temp/ikhf/xyz_2.html nachschauen.

      Danke!

      Bis danndann

      PAF (patrickausfrankfurt)

      1. Aber vielleicht habe ich die Variable falsch definiert/eingesetzt<g>

        Hi PAF,
        du mußt schon angeben

        if (schonda=="da") oder if (schonda !="nein")

        denn schonda ist ja definiert, alternativ kannst du ja mal versuchen, schonda="nein" nicht extra anzugeben, dann könnte if (schonda) schon reichen.

        Viele Grüße

        Antje

        1. Hallo Antje!

          if (schonda=="da")

          in einer anderen Version hatte ich es auch schon so gemacht. Scheinbar nützt nichts. Ich glaube ich verwerfe die Idee mit diesen Tooltips...

          Ich probiere schon seit 2 Tagen verschiedene Dinge wie alle Funktionen im Header, oder was weiß ich noch was. Das Script ist scheinbar so nicht ausgereift, denn der Fehler tritt bei Webrefrence ebenso, dort muß man allerdings schnell sein, da deren Seite fast nur aus ein bißchen Text besteht.

          Oder ich suche nach anderen (Altavista hatte einige Treffer zu dem Thema)... Aber diese Woche nicht mehr.

          Bis danndann

          PAF (patrickausfrankfurt)

  4. Ähmm...

    würde es nicht helfen wenn du die Scripts vor den
    Body-Tag schreibst ?
    Denn müssten sie ja eigentlisch schon zur Verfügung stehen wenn die links auf dem Bildschirm erscheinen.

    gruss
    Jens