fritz: appendChild im Header (browserspezifisch)

hallo,

das folgende kleine Script soll ein base target in den Header einfügen:

<head>
<title>test</title>
<script language="JavaScript" type="text/javascript">
header=document.getElementsByTagName("head")[0];
b=document.createElement("base");
btarget=document.createAttribute("target");
btarget.value="_blank";
b.setAttributeNode(btarget);
header.appendChild(b);
//Kontrolle
alert(document.getElementsByTagName("head")[0].innerHTML);
//Alternative Angabe - gleiches Ergebnis
//document.getElementsByTagName("base")[0].target="_blank";
</script>
</head>

Genau das tut´s dann auch (zumindest wenn man dem Auslesen von innerHTML Glauben schenken darf): Drauf reagieren tut aber nur der IE; Mozilla und Opera ignorieren´s vornehm :-O
Was mach ich falsch?

Gruss
Fritz

PS: Wie kommt man eigentlich ans Forums-Archiv ran (Drin suchen kann ich schon, nur die Resultate aufrufen?!)? (bin zum ersten Mal hier, sorry)

  1. Hallo fritz,

    Genau das tut´s dann auch (zumindest wenn man dem Auslesen von innerHTML Glauben schenken darf): Drauf reagieren tut aber nur der IE; Mozilla und Opera ignorieren´s vornehm :-O

    Also bei mir machen das sowohl Mozilla, Konqueror als auch Opera. (mit exakt Deinem Quellcode)

    Ich würde aber setAttribute ("target", "_blank") statt createAttribute nehmen, denn Opera fügt <base> und Konqueror fügt <base target=""> ein.

    Kleine Frage nebenbei: Was soll das ganze eigentlich, warum schreibst Du es nicht direkt in den head?

    Was mach ich falsch?

    Keine Ahnung.

    PS: Wie kommt man eigentlich ans Forums-Archiv ran (Drin suchen kann ich schon, nur die Resultate aufrufen?!)?

    Wenn Du über die http://selfsuche.teamone.de/ suchst, dann sind die Suchergebnisse eigentlich als Link anklickbar...

    Viele Grüße,
    Christian

    1. Hallo Christian,

      danke für die schnelle Antwort.

      Also bei mir machen das sowohl Mozilla, Konqueror als auch Opera. (mit exakt Deinem Quellcode)

      • vielleicht reden wir ja über unterschiedliche Releases:
        (bei mir Mozilla 1.4 - Gecko/20030624 und Opera 7.02 build 2668)
      • werd also mal ein neueres downloaden...

      Ich würde aber setAttribute ("target", "_blank") statt createAttribute nehmen, denn Opera fügt <base> und Konqueror fügt <base target=""> ein.

      o.k., so ists auch kürzer (Konqueror teste ich immer erst nach den anderen)

      Kleine Frage nebenbei: Was soll das ganze eigentlich, warum schreibst Du es nicht direkt in den head?

      weil die ganze Seite (aus diversen Quellen) dynamisch generiert wird, und´s mal ein base target braucht und eben auch mal nicht...

      Wenn Du über die http://selfsuche.teamone.de/ suchst, dann sind die Suchergebnisse eigentlich als Link anklickbar...

      ...und das Ergebnis des Klicks sieht bei mir dann z.B. so aus:
      http://forum.de.selfhtml.org/archiv/2003/8/55654/#m310631
      "Die gesuchte Seite wurde nicht gefunden. Bitte überprüfen Sie die Adresse oder benutzen Sie die angebotene Navigation durch die Seiten von SELFHTML:"

      Gibt´s da eine Zugangsbeschränkung?

      Gruß
      Fritz

      1. Hallo fritz,

        Also bei mir machen das sowohl Mozilla, Konqueror als auch Opera. (mit exakt Deinem Quellcode)

        • vielleicht reden wir ja über unterschiedliche Releases:
          (bei mir Mozilla 1.4 - Gecko/20030624 und Opera 7.02 build 2668)

        Ich habe Opera 7.11 Build 406 und Mozilla 1.4 Gecko/20030624. Ich habe den Quellcode genommen, in eine HTML-Datei kopiert und diese dann aufgerufen.

        weil die ganze Seite (aus diversen Quellen) dynamisch generiert wird, und´s mal ein base target braucht und eben auch mal nicht...

        Nur, dass ich Dich richtig verstanden habe, Du generierst eine Seite dynamisch auf dem Client?

        [Archiv]
        Gibt´s da eine Zugangsbeschränkung?

        Nein. Aber anscheinend bastelt Christian Kruse (der Autor der Forensoftware hier) gerade am Archiv rum. Probier es später noch einmal.

        Viele Grüße,
        Christian

        1. Hallo Christian,

          Also bei mir machen das sowohl Mozilla, Konqueror als auch Opera. (mit exakt Deinem Quellcode)
          Ich habe Opera 7.11 Build 406 und Mozilla 1.4 Gecko/20030624.

          Im Konqueror war ich grade auch erfolgreich, beim Mozilla haben wir ja ohnehin die gleiche Version (aber auch mit einer älteren gings bei mir nicht, egal ob unter Win oder Linux), und mit dem nagelneuen Opera 7.11 ist´s nun das gleiche: innerHTML zeigt an, dass der Header korrekt geändert wurde, der Klick auf ein Beispiellink öffnet aber unter Mozilla und Opera trotzdem im selben Fenster respektive Tab (eine freizügigere Einstellung der JavaScript-Optionen hat´s auch nicht gebracht).

          Nur, dass ich Dich richtig verstanden habe, Du generierst eine Seite dynamisch auf dem Client?

          Naja, das hört sich zugegebenermaßen kryptisch an, aber mein Spar-Account erlaubt nun mal keine eigenen serverseitigen Scripte :(

          Falls es Dich wirklich interessiert: Die Intention ist, HTML- und ggf. andere Dateien für den User optional separat oder in einer Übersicht (geschichtete Container und iFrames) darzustellen; das Verhalten der Links innerhalb der Ausgangsdateien soll dabei je nachdem, ob sie nun 'gerahmt' sind oder nicht, variieren.

          Das kann man sicher machen, indem man in einer Schleife nun allen Adresstags das Target-Attribut verpasst; ich dachte nur, es wär doch schön...

          [Archiv]
          Probier es später noch einmal.

          Mach´ ich. Nochmals danke und

          Viele Grüße,
          fritz

          1. Hallo Fritz,

            innerHTML zeigt an, dass der Header korrekt geändert wurde, der Klick auf ein Beispiellink öffnet aber unter Mozilla und Opera trotzdem im selben Fenster respektive Tab (eine freizügigere Einstellung der JavaScript-Optionen hat´s auch nicht gebracht).

            Oh, Verzeihung, ich habe _das_ gar nicht probiert. Ich habe lediglich getestet, ob das ganze richtig in den Head geschrieben wurde, dann dachte ich, dass das mit den Links dann auch klappt... Tut mir leid...

            Das kann man sicher machen, indem man in einer Schleife nun allen Adresstags das Target-Attribut verpasst; ich dachte nur, es wär doch schön...

            Tja, that's life... :-(

            Probier es später noch einmal.

            Mach´ ich.

            s/später/morgen oder übermorgen/ - nachdem es inzwischen immer noch nicht geht, wird es warscheinlich etwas größeres sein...

            Viele Grüße,
            Christian

  2. Hallo,

    Genau das tut´s dann auch (zumindest wenn man dem Auslesen von innerHTML Glauben schenken darf): Drauf reagieren tut aber nur der IE; Mozilla und Opera ignorieren´s vornehm :-O

    Probiere es mal so:

    <head>
    <title>test</title>
    <script language="JavaScript" type="text/javascript">
    document.write("<base target="_blank">");
    </script>
    </head>

    MfG, Thomas

    1. Hallo Thomas,

      document.write("<base target="_blank">");

      Hätt´ ich mich ja nie getraut, sozusagen 'on the fly' in die Datei zu schreiben, aber es scheint tatsächlich mit allen Browsern zu funktionieren; überhaupt ist die Methode echt ausbaufähig :)

      Das wär´s in dem von mir gezeigten Zusammenhang gewesen; mein Miniscript ist aber nur ein Beispiel zum Testen. Tatsächlich brauche ich einen Zugriff von außen, also nach dem Laden des iFrame-Inhalts; damit scheidet dieser geniale Trick leider aus, und ich werd´ mich wohl weiter mit den Untiefen der DOM-Manipulation herumschlagen müssen.

      Trotzdem vielen Dank
      fritz

      1. Hallo,

        Das wär´s in dem von mir gezeigten Zusammenhang gewesen; mein Miniscript ist aber nur ein Beispiel zum Testen. Tatsächlich brauche ich einen Zugriff von außen, also nach dem Laden des iFrame-Inhalts; damit scheidet dieser geniale Trick leider aus, und ich werd´ mich wohl weiter mit den Untiefen der DOM-Manipulation herumschlagen müssen.

        innerHTML waere noch einen Test wert:

        parent.frames["IFrame_Name"].document.getElementsByTagName("head")[0].innerHTML="<base target="_blank">";

        MfG, Thomas

        1. Hallo Thomas,

          innerHTML waere noch einen Test wert:
          parent.frames["IFrame_Name"].document.getElementsByTagName("head")[0].innerHTML="<base target="_blank">";

          Wenn man ein + vor der Zuweisung einfügt, kann man damit im Mozilla den Header ergänzen; analog zu appendChild steht´s dann zwar brav im DOM drin, eine entsprechende Reaktion gibt´s aber immer noch nicht (der IE weigert sich anscheinend gleich von vornherein, den HEAD des Subframes mittels innerHTML zu überschreiben).

          Was witzigerweise tatsächlich funktioniert, und zwar in allen von mir getesteten Browsern, die innerHTML (kein Standard, wie wir wissen...) akzeptieren, ist die Kombination Deiner beiden Vorschläge:

          //wir basteln uns ein neues Dokument...
          h="<head>" + parent.frames["f2"].document.getElementsByTagName("head")[0].innerHTML + "<base target="_blank"></head><body>" + parent.frames["f2"].document.getElementsByTagName("body")[0].innerHTML + "</body>";
          //und überschreiben einfach das alte komplett:
          parent.frames["f2"].document.write(h);

          Das kann man zwar noch verfeinern, indem man das <body>-Tag vor dem Plattmachen erstmal ausliest (outerHTML geht mit Mozilla nicht); trotzdem werd´ ich in den nächsten Tagen (Nächten) mal schaun, ob sich das nicht auch noch etwas näher an eine W3C-konforme Formulierung ranbringen läßt, und ggf. die Resultate - falls dieser Thread bis dahin nicht vom Archiv verschluckt wurde - hier nochmal posten.

          vielen Dank für die Tips
          bis dann
          fritz