Jürgen Schomann: Attribute setzen

Hi,

noch einmal zum Attribute setzen. Ich versuche folgendes in JavaScript

var SELECT_LIST = "select";
 var SELECT_LIST_OPTION = "option";
 var ID_SELECT_LIST = "_str_select_list";
 var MESS = "Test";
 var _html_obj, _err_mess;

_err_mess = MESS;
 _html_obj = document.createElement(SELECT_LIST);
 _html_obj.setAttribute("id", ID_SELECT_LIST);
 _html_obj.setAttribute("onClick", "catchClick(_err_mess);");
 document.body.appendChild(_html_obj);
 _html_obj = document.createElement(SELECT_LIST_OPTION);
 document.getElementById(ID_SELECT_LIST).options[0] = _html_obj;
 _html_obj.selected = true;
 _html_obj.text = "aaa";
 _html_obj = document.createElement(SELECT_LIST_OPTION);
 document.getElementById(ID_SELECT_LIST).options[1] = _html_obj;
 _html_obj.text = "bbb";

aber im IE 6 erfolgt keine Reaktion beim anklicken der Liste. In Netscape 7 klappt es.
Wenn ich die Liste zusammenstelle und mit innerHTML zuweise geht es bei beiden Browsern.
Auch die Schreibweise 'onClick' bzw. 'onclick' bringt keinen Erfolg. Außerdem ist die Möglichkeit über die Anweisung _html_obj.onclick = catchClick keine Lösung, da ich auch Argumente übergeben möchte, was ggf. nur umständlich über globale Variable möglich wäre. Da ich aber allgemeine Funktionen erstellen möchte, möchte ich möglichst wenige globale Variablen definieren, um Konflikte mit ggf. gleichnamigen Variablen des Endanwenders zu vermeiden.
Ich möchte aber gerne die o. g. Version, da innerHTML zwar von den Browsern für IE und Netscape unterstützt wird aber eben nicht W3-konform ist. Im Hinblick auf einen universellen Einsatz bzw. zukünftige W3-konforme Standardisierungsbestrebungen möchte ich mich gern an den W3-Standard halten. Ich habe bisher versucht andere Funktionen auch nur nach diesem Standard auszurichten, wenn auch insbesondere beim Event-Handling doch noch die Browsertypen berücksichtigt werden müssen.
Kann mir jemand dazu etwas sagen?

Hier noch gleich ein anderes Problem.
Ich benutze Netscape 7.0 unter Windows XP Home Edition Version 2002. Nun versuche ich in JavaScript die openDialog-Methode für das window-Objekt anzuwenden, um ein modales Fenster zu öffnen. Im IE gibt es dazu die äquivalente Methode showModalDialog, die gut funktioniert. Außerdem kann man in Netscape auch über die open-funktion für das window-Objekt mit den besonderen Eigenschaften 'modal=yes,alwaysRaised=yes,dependent=yes' ein modales Fenster öffnen aber leider keine Argumente wie bei der showModaldialog-Methode im IE mit übergeben. Man muß die Argumente umständlich in internen Tags zwischenspeichern und dann über die opener-Eigenschaft abholen. Deshalb suche ich nähere Hinweise bzw. die Ursache für den unten aufgeführten Fehler bei Anwendung der openDialog-Methode in Netscape, bei der man auch Argumente übergeben können soll. Hier die zugehörige HTML-Datei:

<html>
<head>
<script language="JavaScript">
function openModal(_win_url)
{
 var WINDOW_NAME = "mod_win";
 var _win_feat, _win_arg;
 _win_arg = "Test";
 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
 netscape.security.PrivilegeManager.enablePrivilege("UniversalDialogModality");
 _win_feat = "outerHeight=150,outerWidth=400";
 window.openDialog(_win_url, WINDOW_NAME, _win_feat, _win_arg);
 alert("Ende");
}
</script>
</head>
<body>
<form>
<b>Test Netscape openDialog</b>
<br>
<input type=button value="test modal window" onClick="openModal('modalWin.html');">
</form>
</body>
</html>

Außerdem habe ich in der Datei prefs.js folgende Zeile ergänzt:

user_pref("signed.applets.codebase_principal_support", true);

Doch beim Aufruf erhalte ich immer folgende Fehlermeldung:

error: uncaught exception: [Exception... "Security error"  code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)"  location: "file:///C:/usr/html/test_modal.html Line: 16"]

Kann mir jemand dazu auch noch etwas sagen?
Vielen Dank im voraus.
Jürgen

  1. Hallo,

    _html_obj.setAttribute("onClick", "catchClick(_err_mess);");

    Schreibe onclick klein und ...

    document.body.appendChild(_html_obj);

    ... fuege hier diese Zeile hinzu:

    if(document.body.outerHTML)document.body.outerHTML=document.body.outerHTML;

    Das sollte erfahrungsgemaeß "das DOM quasi refreshen".

    MfG, Thomas

    1. Hallo,

      _html_obj.setAttribute("onClick", "catchClick(_err_mess);");

      Schreibe onclick klein und ...

      document.body.appendChild(_html_obj);

      ... fuege hier diese Zeile hinzu:

      if(document.body.outerHTML)document.body.outerHTML=document.body.outerHTML;

      Das sollte erfahrungsgemaeß "das DOM quasi refreshen".

      MfG, Thomas

      Hi,

      ich hatte bereits erwähnt, dass auch 'onclick' nicht funktioniert. Auch der genannte Refresh mit outerHTML geht nicht und führt sogar zur Meldung 'unbekannter Laufzeitfehler'. Außerdem möchte ich wie bereits erwähnt den W3-Standard einhalten und outerHTML gehört nicht dazu. Browserspezifische Lösungen sind keine guten Lösungen. Ich möchte möglichst kompatible Funktionen erstellen und nur wie auch bereits erwähnt beim Event-Handling browserspezifische Extras berücksichtigen.

      MfG Jürgen

      1. Hallo,

        ich hatte bereits erwähnt, dass auch 'onclick' nicht funktioniert. Auch der genannte Refresh mit outerHTML geht nicht und führt sogar zur Meldung 'unbekannter Laufzeitfehler'.

        Im IE funktioniert das und es ist AFAIK die einzige Moeglichkeit, dort Event-Handler dynamisch zu erzeugen. Im Archiv sind mehrere Beitraege von mir zu aehnlichen Problemen zu finden, die mit outerHTML auch zum Ziel gefuehrt haben.

        Außerdem möchte ich wie bereits erwähnt den W3-Standard einhalten und outerHTML gehört nicht dazu. Browserspezifische Lösungen sind keine guten Lösungen.

        Deshalb erfolgt ja auch die Abfrage if(document.body.outerHTML).

        Probiere das unter IE bzw. anderen Browsern aus:

        if(document.body.outerHTML)alert("outerHTML ok");else alert("kein outerHTML verfuegbar");

        Ich möchte möglichst kompatible Funktionen erstellen und nur wie auch bereits erwähnt beim Event-Handling browserspezifische Extras berücksichtigen.

        Dann sollte outerHTML auch einsetzbar sein.

        Falls es document.body nicht bringt, versuche es mit
        if(document.documentElement.outerHTML)document.documentElement.outerHTML=document.documentElement.outerHTML;

        MfG, Thomas

      2. Hallo,

        ich hatte bereits erwähnt, dass auch 'onclick' nicht funktioniert. Auch der genannte Refresh mit outerHTML geht nicht und führt sogar zur Meldung 'unbekannter Laufzeitfehler'.

        So klappt es bei mir:

        //...
        document.body.appendChild(_html_obj);
        if(_html_obj.outerHTML)_html_obj.outerHTML=_html_obj.outerHTML;
        //...

        MfG, Thomas

        1. Hallo,

          ich hatte bereits erwähnt, dass auch 'onclick' nicht funktioniert. Auch der genannte Refresh mit outerHTML geht nicht und führt sogar zur Meldung 'unbekannter Laufzeitfehler'.

          So klappt es bei mir:

          //...
          document.body.appendChild(_html_obj);
          if(_html_obj.outerHTML)_html_obj.outerHTML=_html_obj.outerHTML;
          //...

          MfG, Thomas

          Hi,

          ziemlich nervend meine Fragerei?
          Vielen Dank für den Hinweis mit refresh. Ich hatte den Fehler mit document.body.outerHTML auch schon bemerkt. Mein aktuelles Objekt ist nicht body sondern _html_obj. Aber trotzdem noch mal die Frage. Gibt es für das Refresh eine andere Möglichkeit. Ich möchte wie gesagt wenn möglichst nur den W3-Standard verwenden und nicht browserspezifische Objekte und Attribute. Deshalb habe ich auch nach anfänglichen Versionen mit Browserabfragen und z. B. bei Internet Explorer Verwendung des all-Objekts u.a., jetzt konsequent den Weg über das DOM-Modell von W3 versucht umzusetzen (mit dem node-Objekt usw.). So brauche ich nicht laufend entsprechend dem Browsertyp verschiedene JavaScript-Zweige abzuarbeiten. Dies ist allerdings doch leider nicht voll umsetzbar, da insbesondere das Event-Handling sehr unterschiedlich in Microsoft Internet Explorer und Netscape Navigator ab Version 6 behandelt wird (siehe Bubbling und Attribute des Event-Objekts u.a.). Aber vielleicht wird dies später auch mal W3-mäßig standardisiert, dann brauche ich 'nur' noch diesen Teil meiner Funktionen zu ändern.

          Übrigens hast Du eventuell auch noch eine Idee zu meiner Frage mit dem modalen Dialog?

          Mfg
          Jürgen

          1. Hallo,

            Gibt es für das Refresh eine andere Möglichkeit.

            AFAIK nicht.

            Ich möchte wie gesagt wenn möglichst nur den W3-Standard verwenden und nicht browserspezifische Objekte und Attribute.

            Das schafft man meistens nicht, wenn man moeglichst breite Browserunterstuetzung bei diesen Dingen haben moechte.

            Eine gelegentliche Einlassung auf spezifische Implementierungen finde ich legitim bis notwendig, solange korrekte Abfragen erfolgen, die anderen Browsern keine Fehler entlocken.

            Übrigens hast Du eventuell auch noch eine Idee zu meiner Frage mit dem modalen Dialog?

            Ich vermute mal, dass Du nicht berechtigt bist, Rechte auf den Clientsystemen umzubiegen ...

            MfG, Thomas