MichaelR: + Javascript: window.location.hash mit IE

Hallo,

warum liefert der IE 5.5 bei window.location.hash _immer_ einen leeren String zurück, selbst wenn die URL so aussieht?

my_file.xml#derAnker

Scheinbar geht hash + XML im IE nicht???

Danke für jede Hilfe.
Grüße
Michael

  1. Hallo,

    warum liefert der IE 5.5 bei window.location.hash _immer_ einen leeren String zurück, selbst wenn die URL so aussieht?
    my_file.xml#derAnker
    Scheinbar geht hash + XML im IE nicht???

    Was möchtest du erreichen?
    Ein XML-Dokument ist beim JavaScript ein eigenes Objekt.
    Vorausgesetzt du hast sowas in deinem Script:
    var xmlDoc = new ActiveXObject("Msxml.DOMDocument");
    kannst du die URL so auslesen: xmlDoc.url.
    Z.B. alert(xmlDoc.url);

    my_file.xml#derAnker da wäre #derAnker ein XPointer.

    Grüße
    Thomas

    1. Hallo Thomas,

      warum liefert der IE 5.5 bei window.location.hash _immer_ einen leeren String zurück, selbst wenn die URL so aussieht?
      my_file.xml#derAnker
      Scheinbar geht hash + XML im IE nicht???

      Was möchtest du erreichen?

      Ganz kurz: es ist eine ewig lange xml Datei, die FAQ-Einträge enthält; per xsl wird das ganze "gestylt" und ausgegebenen (client-seitig). Mittels einer "bookmark" Funktion kann man bestimmte FAQ-Einträge an die URL anhängen

      datei.xml#faqitem=item_1#faqitem=item_2 etc.

      Eigentlich würde man das ja über doc.search machen, aber wenn ich diese FAQ-ID an die URL hänge wird bei doc.search immer die Seite neu geladen (und das dauert eben mir zu lange) und beim Anhängen an den Hash eben nicht.

      Wenn man die URL (z. B. die obige) dann aufruft parst ein Javascript die gebookmarkten Einträge raus und ermöglicht ein "Durchbrowsen" durch diese Einträge.

      Ein XML-Dokument ist beim JavaScript ein eigenes Objekt.
      Vorausgesetzt du hast sowas in deinem Script:
      var xmlDoc = new ActiveXObject("Msxml.DOMDocument");
      kannst du die URL so auslesen: xmlDoc.url.
      Z.B. alert(xmlDoc.url);

      Geht das auch ohne ActiveX?

      Warum gibt es hier so einen riesen Unterschied in der Handhabung zwischen IE und Mozilla?

      danke, Grüße
      Michael

      1. Hallo,

        Was möchtest du erreichen?

        Ganz kurz: es ist eine ewig lange xml Datei, die FAQ-Einträge enthält; per xsl wird das ganze "gestylt" und ausgegebenen (client-seitig).

        Aha... ich bin davon ausgegangen, dass du dein XML und XSL mit Javascript ladest und nicht per URL + PI.

        Mittels einer "bookmark" Funktion kann man bestimmte FAQ-Einträge an die URL anhängen

        datei.xml#faqitem=item_1#faqitem=item_2 etc.
        Eigentlich würde man das ja über doc.search machen,

        Verstehe ich nicht, was würde man über doc.search machen?
        Du kannst normal einen Anker an die XML-Datei anhängen
        blabla.xml#anker und diesen mit <a name="anker"></a> anspringen. Beide, IE und Mozilla machen mit.

        Wenn man die URL (z. B. die obige) dann aufruft parst ein Javascript die gebookmarkten Einträge raus und ermöglicht ein "Durchbrowsen" durch diese Einträge.

        D.h. du hängst nicht bloß einen, sondern mehrere Anker an die XML-Datei im URL an?
        Das würde wiederum der Logik wiedersprechen, dass man nur einen Anker als Ziel definieren kann.

        Irgendwie verstehe ich nicht immern icht so klar, was du erreichen möchtest. Wenn du eine Auswahl anhand eines URL-Parameters machen möchtest, muss du diesen auch als Paramter übergeben und abfragen:
        geht bei clienseitigen Transformation nur wenn du XML und XSL per JavaScript ladest.

        Geht das auch ohne ActiveX?

        Wenn ich bloß´wüsste was du möchtest ;-)

        Warum gibt es hier so einen riesen Unterschied in der Handhabung zwischen IE und Mozilla?

        Warum ist der Himmel blau? ;-)

        Grüße
        Thomas

        1. Hallo,

          Was möchtest du erreichen?

          Ganz kurz: es ist eine ewig lange xml Datei, die FAQ-Einträge enthält; per xsl wird das ganze "gestylt" und ausgegebenen (client-seitig).

          Aha... ich bin davon ausgegangen, dass du dein XML und XSL mit Javascript ladest und nicht per URL + PI.

          Mittels einer "bookmark" Funktion kann man bestimmte FAQ-Einträge an die URL anhängen

          datei.xml#faqitem=item_1#faqitem=item_2 etc.
          Eigentlich würde man das ja über doc.search machen,

          Verstehe ich nicht, was würde man über doc.search machen?
          Du kannst normal einen Anker an die XML-Datei anhängen
          blabla.xml#anker und diesen mit <a name="anker"></a> anspringen. Beide, IE und Mozilla machen mit.

          Ähm, in der Hoffnung jetzt keine Details zu vergessen:

          Wie gesagt es ist eine FAQ;

          --beim Erstellen der Webausgabe (mittels XSL) werden alle Einträge auf display:none gesetzt; lediglich ein Index mit unterschiedlichen Kategorien ist sichtbar

          --per Index und JavaScript kann man bestimmte Einträge sichtbar machen etc.

          -- warum nicht alles sichtbar? weil darunter die Übersichtlichkeit klar leiden würde und wenn immer nur ein FAQ-Eintrag sichtbar ist, dann steigert das ungemein die Darstellungsqualität. Außerdem haben einige der Einträge Auszüge aus Javascripten, Auflistungen, etc.
          (Es sind nich bloß ein/zwei Antwortsätze, sondern teilweise richtige Anleitungen über JavaScript/HTML/XHTML ...)

          -- wenn nun ein Eintrag sichtbar ist kann man wie beschrieben einen Anker mit einer eindeutigen ID an die URL anhängen
          Warum?
          * in der Vergangenheit bestand die FAQ aus über 100 einzelnen HTML Seiten; wollte man jemanden zu genau einem Eintrag den Link schicken, ging das problemlos;
          * jetzt besteht die FAQ aus einer einzigen XML Datei, da kann man die URL alleine nicht einfach schicken, weil die dann zum Index zeigt und nicht den vorher mal ausgewählten Eintrag; daher das mit den "Bookmarks".
          Lade ich die URL mit einem Bookmark der Form #faqitem=item_10 dann wird mir nach dem Laden der Seite automatisch der entsprechende Eintrag angezeigt. (Alle anderen sind ja wieder display:none;)

          -- Warum mach' ich das nicht über doc.search?
          Weil jedesmal beim Anhängen der Id an die URl die Seite neu geladen wird und das dauert definitiv zu lange. Mit Modem gute 10 Sekunden. Man soll einfach die Id (per javaScript) anhängen können und fertig.

          -- Daher der Umweg über die Anker; ich weiß, dass ich das eigentlich dafür "missbrauche", aber es gibt halt keine andere Möglichkeit als über den Anker (ohne Neuladen der Seite wie bei doc.search) einen Paramter an ein XML-Dokument für die Weiterverarbeitung per JavaScript zu übergeben (bzw. erstmal zu "speichern").

          Wenn man die URL (z. B. die obige) dann aufruft parst ein Javascript die gebookmarkten Einträge raus und ermöglicht ein "Durchbrowsen" durch diese Einträge.

          D.h. du hängst nicht bloß einen, sondern mehrere Anker an die XML-Datei im URL an?
          Das würde wiederum der Logik wiedersprechen, dass man nur einen Anker als Ziel definieren kann.

          Ja, es wiederspricht der Logik, aber es geht nicht anders.
          Dass man mehrere Anker anhängt dürfte zwar eh der Ausnahmefall sein, aber technisch (zumindest mit Mozilla) kein Problem.
          Beispiel:

          datei.xml#faqitem_item10#faqitem=item_100

          Achja: XML mit XSl erfolgt clientseitig.

          Wenn zumindest der erste Anker auslesbar wäre ...

          Das Problem scheint wirklich nur in Verbindung von XML und Anker zu sein; in einer ganz normalen HTML Seite geht das ohne Probleme....

          Irgendwie verstehe ich nicht immern icht so klar, was du erreichen möchtest. Wenn du eine Auswahl anhand eines URL-Parameters machen möchtest, muss du diesen auch als Paramter übergeben und abfragen:
          geht bei clienseitigen Transformation nur wenn du XML und XSL per JavaScript ladest.

          Geht das auch ohne ActiveX?

          Wenn ich bloß´wüsste was du möchtest ;-)

          War es wirklich so undurchsichtig ? :-(

          Dein Ansatz war doch ein ActiveX-Ansatz, oder?

          Eigentlich will ich nur:

          -- per Javascript auf den hash im IE zugreifen:

          datei.xml#faqitem=item_100

            
          var DocHash = document.location.hash;  
          
          

          Und das sollte mir im IE - wie im Mozilla - #faqitem=item_100 zurückliefern; und nicht einen leeren String.

          Warum gibt es hier so einen riesen Unterschied in der Handhabung zwischen IE und Mozilla?

          Warum ist der Himmel blau? ;-)

          Weil heute ein schöner Tag war :-)

          Grüße (in der Hoffung bald eine Lösung zu finden, schluchz),
          Michael

          PS: Willst Du die FAQ mal in Natura sehen...?

          1. Hallo,

            Ähm, in der Hoffnung jetzt keine Details zu vergessen:

            Wie gesagt es ist eine FAQ;

            OK so weit ist mir jetzt klar was du möchtest.

            -- Daher der Umweg über die Anker; ich weiß, dass ich das eigentlich dafür "missbrauche", aber es gibt halt keine andere Möglichkeit als über den Anker (ohne Neuladen der Seite wie bei doc.search) einen Paramter an ein XML-Dokument für die Weiterverarbeitung per JavaScript zu übergeben (bzw. erstmal zu "speichern").

            Doch den gibt es.
            Ich habe das Beispiel dazu nicht in der Hand, aber Thomas Meinike hat das mal hier im Forum gepostet. Es ging genau darum wie man Parameter aus der URL mitles JavaScrip auslesen und dann im XSL weiterverarbeiten kann.
            Wie das im Mozilla geht steht unter: http://devedge.netscape.com/viewsource/2003/xslt-js/
            Wie gesagt zu IE findest du das im Archiv.

            D.h. du hängst nicht bloß einen, sondern mehrere Anker an die XML-Datei im URL an?
            Das würde wiederum der Logik wiedersprechen, dass man nur einen Anker als Ziel definieren kann.

            Ja, es wiederspricht der Logik, aber es geht nicht anders.
            Dass man mehrere Anker anhängt dürfte zwar eh der Ausnahmefall sein, aber technisch (zumindest mit Mozilla) kein Problem.
            Beispiel:

            datei.xml#faqitem_item10#faqitem=item_100
            Achja: XML mit XSl erfolgt clientseitig.

            Der Ansatz den ich vorschlage basiert darauf, dass du aus einer HTML-Datei heraus deine XML und XSL Datei lädst, also ein leicht abweichender Weg.

            Wenn zumindest der erste Anker auslesbar wäre ...
            Das Problem scheint wirklich nur in Verbindung von XML und Anker zu sein; in einer ganz normalen HTML Seite geht das ohne Probleme....

            Da weiss ich auch nicht wirklich weiter.

            Wenn ich bloß´wüsste was du möchtest ;-)

            War es wirklich so undurchsichtig ? :-(

            Ein wenig ;-)

            Dein Ansatz war doch ein ActiveX-Ansatz, oder?

            Beim IE dient das in dieme Fall nur dazu ein Object zu erzugen (var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");) mit dem man dann Arbeiten kann.

            Eigentlich will ich nur:

            -- per Javascript auf den hash im IE zugreifen:

            datei.xml#faqitem=item_100

            var DocHash = document.location.hash;

            
            >   
            > Und das sollte mir im IE - wie im Mozilla - #faqitem=item\_100 zurückliefern; und nicht einen leeren String.  
              
              
            Versuche mal diese DocHash per alert() auszugeben. Wenn es dann ein [object] zurückkomt weiss du was lost ist. Dann muss du es mit z.B. DocHash.text auslesen.  
              
              
            
            > PS: Willst Du die FAQ mal in Natura sehen...?  
              
            Hmmm ... weiss ich nicht ;-) kannst aber du gerne verlinken  
              
            Grüße  
            Thomas
            
            1. Hallo Thomas,

              [...]

              Doch den gibt es.
              Ich habe das Beispiel dazu nicht in der Hand, aber Thomas Meinike hat das mal hier im Forum gepostet. Es ging genau darum wie man Parameter aus der URL mitles JavaScrip auslesen und dann im XSL weiterverarbeiten kann.
              Wie das im Mozilla geht steht unter: http://devedge.netscape.com/viewsource/2003/xslt-js/
              Wie gesagt zu IE findest du das im Archiv.

              Danke für den Link.

              Zu dem mit IE:
              Bevor ich die jetzige FAQ-Version begonnen hatte wollte ich ursprünglich URL-Parameter auslesen und direkt im XSL verwenden; dann hatte man mir hier allerdings gesagt, dass

              1. ein Zugriff auf diese Paramter mittels javaScript wenn erst nach dem erfolgen kann, dass das XSL bereits abgeschlossen ist; d.h. erst wird das XSL aktiv, dann kann JavaScript aktiv werden und damit wäre eine Kombination nicht möglich.
              Sofern man das ganze clientseitig machen will.

              2. URL-Paramter im XSL zu verwenden würde nur bei Server-seitiger Verarbeitung gehen.

              Wenn ich das obige richtig verstehe, dann wäre das eine Mischung aus beidem ? Bin verwirrt! :)
              Werde das Archiv trotzdem mal durchsuchen.

              Der Ansatz den ich vorschlage basiert darauf, dass du aus einer HTML-Datei heraus deine XML und XSL Datei lädst, also ein leicht abweichender Weg.

              Aber selbst bei diesem Weg müsste ich vorher die URL-Paramter wissen um sie dann weiterzuverarbeiten. Und die einzige einfache Lösungen (zumindest für die Nutzer der FAQ) ist das Anhängen dieser Id(s) an die URL.

              Wenn zumindest der erste Anker auslesbar wäre ...
              Das Problem scheint wirklich nur in Verbindung von XML und Anker zu sein; in einer ganz normalen HTML Seite geht das ohne Probleme....

              Eigentlich will ich nur:

              -- per Javascript auf den hash im IE zugreifen:

              datei.xml#faqitem=item_100

              var DocHash = document.location.hash;

              
              > >   
              > > Und das sollte mir im IE - wie im Mozilla - #faqitem=item\_100 zurückliefern; und nicht einen leeren String.  
              >   
              >   
              > Versuche mal diese DocHash per alert() auszugeben. Wenn es dann ein [object] zurückkomt weiss du was lost ist. Dann muss du es mit z.B. DocHash.text auslesen.  
                
              Es ist ein String, halt nur ein leerer.  
                
              Kann es vielleicht sein, dass der location.hash gar nicht dem window oder document Object im IE (im Falle einer XML Datei) zugeordnet wird, sondern irgendwelchen XML-Objekten? Falls ja, ist nur die Frage welchen...  
              Vielleicht gibt es bei der MS-DOM-Variante irgendwo ein Objekt das diese Sachen speichert. Und vielleicht sollte ich mal danach suchen...  
                
              Grüße und Danke  
              Michael
              
              1. Hallo Michael,

                Zu dem mit IE:
                Bevor ich die jetzige FAQ-Version begonnen hatte wollte ich ursprünglich URL-Parameter auslesen und direkt im XSL verwenden; dann hatte man mir hier allerdings gesagt, dass

                1. ein Zugriff auf diese Paramter mittels javaScript wenn erst nach dem erfolgen kann, dass das XSL bereits abgeschlossen ist; d.h. erst wird das XSL aktiv, dann kann JavaScript aktiv werden und damit wäre eine Kombination nicht möglich.
                  Sofern man das ganze clientseitig machen will.

                Das Stimmt, wenn du Direkt auf deine XML-Datei verlinkst und in dieser dann deine XSL mit der PI aufrufst.
                Aber wenn du deine XML und XSL Datei aus einer HTML-Datei aus aufrufst, hast du die Möglichkeit mit JavaScript auf die versch. (XML)DOM-Methoden zurückzugreifen.

                1. URL-Paramter im XSL zu verwenden würde nur bei Server-seitiger Verarbeitung gehen.

                Antwort wie oben ;-)

                Wenn ich das obige richtig verstehe, dann wäre das eine Mischung aus beidem ? Bin verwirrt! :)
                Werde das Archiv trotzdem mal durchsuchen.

                So ist es. Und es kann auch Nachteile haben.
                Ich habe vor vielleich eine Woche für jemanden so eine HTML-Datei hier gepostet, da ging es allerdings darum, dass man die XSL-Transformation in Abhängigkeit eines Elements im XML anstoßen  bzw. eben nicht durchführen sollte. Könnte aber auch dir Hilfreich sein.

                Der Ansatz den ich vorschlage basiert darauf, dass du aus einer HTML-Datei heraus deine XML und XSL Datei lädst, also ein leicht abweichender Weg.

                Aber selbst bei diesem Weg müsste ich vorher die URL-Paramter wissen um sie dann weiterzuverarbeiten. Und die einzige einfache Lösungen (zumindest für die Nutzer der FAQ) ist das Anhängen dieser Id(s) an die URL.

                Den Namen des Paramters muss du so oder so immer schon wissen.
                Dass der User davon nichts zu wissen braucht ist aber klar.
                Er kann ja verlinken: faq.xml?anker=frage123.
                Du kannst den Paramter schon vorher definieren, du muss ihn dann nur noch auswerten.
                Wenn es mehrere Anker angehägt werden sollten, muss du dann für dich einen "Trenner" ausdenken und den Wert des Paramters dann  im XSL zerlegen: faq.xml?anker=frage123#frage321#frage987

                Kann es vielleicht sein, dass der location.hash gar nicht dem window oder document Object im IE (im Falle einer XML Datei) zugeordnet wird, sondern irgendwelchen XML-Objekten? Falls ja, ist nur die Frage welchen...

                Das sind aber zwei Fragen: erstens was passiert beim XML-XSL-Transformation: die HTML datei gibt es als solches eigentlich  nicht wirklich, da es in desem Fall wohl nur im Speicher exsitiert, aber doch angezeigt wird. Deshalb dürfe es ein Problem sein auf die URL der XML-Datei zuzugreifen.

                "Irgendwelche XML-Objekte": wie das bei direkter XML-XSL-Transformation ist, kann ich auch nicht sagen. Wenn du den Weg über HTML und JavaScript aufruf gehst muss du solche XML-Objekte erzeugen: beim IE eben mit z.B. ActiveXObject("Msxml2.DOMDocument");

                Vielleicht gibt es bei der MS-DOM-Variante irgendwo ein Objekt das diese Sachen speichert. Und vielleicht sollte ich mal danach suchen...

                Antwort wie oben ;-)

                Grüße
                Thomas

                1. Hi Thomas,

                  danke noch für Deine ausführliche Antwort.

                  Hab' heute das ganze auf einem Server probiert und -frag mich nicht warum- aber wenn die XML Datei über das http Protokoll angesprochen wird, dann funktioniert im IE (zumindest war es so, hoffe, dass das auch anhält...) das Bookmark-System.

                  Das würde heißen, dass _nur_ im File Protokoll bei lokaler Betrachtung der XML Datei das ganze nicht funktioniert.
                  Mir es ist mehr als schleicherhaft, aber wenn es letztlich im Internet geht, soll mir das recht sein.

                  Hier übrigens der Link, falls es Dich interessiert: (es ist die FAQ von Usern für User eines Autorenprogramms)

                  http://gerda.univie.ac.at/sprachwerkstatt/webpages/michael/HPFAQv2/HotPot_FAQ_v2.xml

                  Auf jeden Fall, nochmals vielen Danke für Deine Hilfe.

                  Viele Grüße
                  Michael

                  1. Hallo Michael,

                    danke noch für Deine ausführliche Antwort.

                    Hab' heute das ganze auf einem Server probiert und -frag mich nicht warum- aber wenn die XML Datei über das http Protokoll angesprochen wird, dann funktioniert im IE (zumindest war es so, hoffe, dass das auch anhält...) das Bookmark-System.

                    *argh*
                    Das hätte ich dir sagen können, aber ich habe auch nicht daran gedacht, dass du es nur offline Probiert hast.
                    Dabei hat der IE, warum auch immer, ein anderes Verhalten.

                    Hier übrigens der Link, falls es Dich interessiert: (es ist die FAQ von Usern für User eines Autorenprogramms)

                    http://gerda.univie.ac.at/sprachwerkstatt/webpages/michael/HPFAQv2/HotPot_FAQ_v2.xml

                    Ein paat Tipps noch:
                    Beim IE bleibt nach abklappern mehrere Bookmarks ein # am URL hängen
                    http://gerda.univie.ac.at/sprachwerkstatt/webpages/michael/HPFAQv2/HotPot_FAQ_v2.xml#
                    Macht man hier wiederum Bookmarks kommt es zu einem: *.xml##
                    Ich habe aber jetzt nicht überprüft ob das auch Auswirkungen hat.

                    Zu deinem XSL, du kannst ihn - falls du dazu Lust hast - noch recht viel Optimieren
                    Mach ein:
                    1)
                    <xsl:output method="html" encoding="iso-8859-1" />
                    dann kommt auch dein HTML mit der richtigen encoding her.

                    <xsl:template match="faq">
                     <xsl:element name="div">
                      <xsl:attribute name="class">PageTitle</xsl:attribute>
                      <xsl:value-of select="@title" />
                     </xsl:element>
                     <xsl:apply-templates />
                    </xsl:template>

                    Solche Element-Kreationen lassen sich sehr vereinfachen:

                    <xsl:template match="faq">
                      <div class="PageTitle">
                        <xsl:value-of select="@title" />
                      </div>
                      <xsl:apply-templates />
                    </xsl:template>

                    oder:

                    <xsl:element name="span">
                     <xsl:attribute name="id">Tab_About</xsl:attribute>
                     <xsl:attribute name="class">TabActive</xsl:attribute>
                     <xsl:attribute name="onclick">Set_TabVisibility('About')</xsl:attribute>
                     <xsl:value-of select="about/@name" />
                    </xsl:element>

                    <span id="Tab_About" class="TabActive" onclick="Set_TabVisibility('About')">
                     <xsl:value-of select="about/@name" />
                    </span>

                    oder, etwas weniger gewöhnlich:

                    <xsl:attribute name="onclick">ShowEntry('<xsl:value-of select="@id" />')</xsl:attribute>

                    onclick="ShowEntry('{@id}')

                    So ließe sich dein XSL um mehr als die Helfte reduzieren, was bei online Übertragung auch wichtig ist.

                    1. ist zwar nicht wirklich wichtig, aber dein End-HTML ist ein "wenig" ungültig ;-)

                    Auf jeden Fall, nochmals vielen Danke für Deine Hilfe.

                    Gerne, wobei es schon nett ist, wenn ein Germanist einem Romanist helfen kann ;-)

                    Grüße
                    Thomas

                    1. Hallo Thomas,

                      Danke noch für die Vorschläge - werde sie beim endgültigen Fertigstellen noch mit reinnehmen.

                      [...]

                      Gerne, wobei es schon nett ist, wenn ein Germanist einem Romanist helfen kann ;-)

                      Ich bin leider kein Romanist (höchstens hobbymäßig) - die Seite ist nur auf dem Server momentan untergebracht. :)

                      Grüße
                      Michael