Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: [JS] Link Target nachträglich ändern
AUTOR BEITRAG
Whiteknight KKK

RANG Deckschrubber

#1 - 17.12 13:10

Hallo zusammen,

ich binde per JS eine Datei ein, welche mir einen Text darstellt.

Beispiel:

code:

<script type="text/javascript" src="http://www.fremdeseite.de/fremdskript.js"></script>


Ich bekomme von dem Skript dann einen Text dargestellt, welcher Hyperlinks enthält. Leider haben all diese Links das Attribut target="_self", ich würde aber gerne diese Links im neuen Fenster öffnen lassen. (Das JS aus dem Beispiel oben kann ich nicht editieren)

Ich dachte mir, ich könnte um das Skript welches ich einbinde ein DIV erstellen, und dann alle Hyperlinks innerhalb dieses Divs nachträglich ändern (Funktionsaufruf am Seitenende).

Leider bekomme ich es nicht hin. Kann mir da jemand helfen?

Oder hat jemand noch eine bessere Lösung? Vielleicht beim Verlassen der Seite prüfen, ob eine Fremde Seite aufgerufen wird und dann das Target ändern?

Vielen lieben Dank!
*al!ve* - will code for food

RANG Master of Clanintern

#2 - 17.12 18:57

Idee:
Vorher alle as anhand ihrer ids merken, ggf. mit ids versehen wenn noch keine vorhanden sind.
Nachher alle as durchlaufen, die nicht gemerkten sind neu.

PHP-code:
<?PHP
/*

<script type="text/javascript">
    var allAIds = new Object();
    var allAs = document.getElementsByTagName('a');
    for (var i=0; i<allAs.length; i++) {
        if (!allAs[i].id)
            allAs[i].id = new Date() + '-' + i;
        allAIds[allAs[i].id] = allAs[i].id;
    }
</script>



<script type="text/javascript" src="http://www.fremdeseite.de/fremdskript.js"></script>



<script type="text/javascript">
    var allAs = document.getElementsByTagName('a');
    for (var i=0; i<allAs.length; i++) {
        if (!allAs[i].id)
            allAs[i].id = new Date() + '-' + i;
        if (!allAIds[allAs[i].id])
            // hier bist du richtig
            allAs[i].target = '_blank';
    }

</script>
*/
 
?>
Whiteknight KKK

RANG Deckschrubber

#3 - 17.12 21:24

Hey vielen Dank erstmal. Find ich echt klasse das Du dir Gedanken gemacht hast.

Ich habe dein Code getestet, leider findet er keinen "neuen" Link. Also er springt nie in die Zeile
code:
allAs[i].target = '_blank';

hinein. Wenn ich die Variable "i" in beiden JS am Ende der Schleife ausgeben lasse, findet er exakt jeweils 37 Links. Aber zwischen den JS-Codes wird der Fremdcode eingebunden und dieser stellt definitiv einen Link dar, wie auch immer.

Sehr merkwürdig :(
*al!ve* - will code for food

RANG Master of Clanintern

#4 - 17.12 21:50

Was genau macht der Link denn und an welcher Stelle im Code wird der positioniert? Kann s evtl. sein dass der Link nicht prozedural sofort ein document.write macht sondern sich erst auf document.onload registriert? Welche externe Seite rufst du denn auf? Dann kann ich mir das mal anschauen.
Whiteknight KKK

RANG Deckschrubber

#5 - 18.12 07:58

Aber gerne.

pagead2.googlesyndication.com/pagead/show_ads.js

Frag mich bitte nicht wie der Link da zusammen gefrickelt wird. Ich finde diesen Code absolut katastrophal. Hab ne Zeitlang versucht diesen zu verstehen, es dann aber frustriert aufgegeben. Ich habe keine Ahnung wie genau die Links zusammen gesetzt werden.

Mal sind es mehrere verlinkte Texte, mal ein verlinktes Bild was dabei heraus kommt.



Man kann doch mit JS prüfen, ob ein Benutzer die aktuelle Seite verlassen will, oder? Wie wärs wenn man dann einfach ein "false" zurück gibt (sofern eine fremde Seite aufgerufen wird) und dann halt den Link den er aufrufen wollte mit dem Ziel "_blank" verseht? Geht soetwas nicht? Wahrscheinlich nicht hm?
*al!ve* - will code for food

RANG Master of Clanintern

#6 - 18.12 21:58

Ich hab mir fast gedacht, dass es dabei um Google geht. Dass die Google-Inclusions eher schlecht verständlichen Code liefern ist normal und vermutlich gewollt. Auch, dass sich dabei wenig manipulieren lässt.

Probiers mal, den zweiten Teil auf ein document.onload zu registrieren. Ich vermute, dass die der Content von Google aufgrund der Ladezeit erst kommt, wenn mein Javascriptblock bereits ausgeführt wurde.
Whiteknight KKK

RANG Deckschrubber

#7 - 19.12 10:58

Jep, bei Google macht sich keiner die Mühe den Code zu verstehen *g*.

Hab jetzt ne halbe Stunde vergeblich rumprobiert. Wo soll das unload denn genau hin? In den script-tag geht ja nicht, oder? In den Bodytag wäre ja falsch, weil nach der Werbung ja noch mehr Links folgen bis zum Seitenende. Es muss ja aufgerufen werden sobald das Script geladen wurde, nicht die komplette Seite.
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#8 - 19.12 15:14

PHP-code:
<?php 
/*
<script type="text/javascript">
document.onload = function() {
    var allAs = document.getElementsByTagName(&#039;a&#039;);
    for (var i=0; i<allAs.length; i++) {
        if (!allAs[i].id)
            allAs[i].id = new Date() + &#039;-&#039; + i;
        if (!allAIds[allAs[i].id])
            // hier bist du richtig
            allAs[i].target = &#039;_blank&#039;;
    }
}

</script>

*/
 
?>

^^ Ist so zwar unschön weil onload= leider nur ein mal existieren darf aber zu Testzwecken kann man das schon mal machen.
Whiteknight KKK

RANG Deckschrubber

#9 - 19.12 21:18

Hey nochmal,

also wenn ich document.onload durch window.onload ersetze springt er in die Funktion rein und findet auch viele Links. Leider nur nicht die aus dem includierten JS.

Ich habe die Funktion mal etwas umgeschrieben und lasse mir einfach per alert alle Linknamen ausgeben:

code:
<script type="text/javascript">
window.onload = function() {
var allAs = document.getElementsByTagName('a');
var linkname;
for (var i=0; i<allAs.length; i++) {
linkname = allAs[i].toString();
alert(linkname);
    }
}
</script>


Ergebnis: Er findet nur "meine Links", nicht jedoch die aus dem includierten JS.
*al!ve* - will code for food

RANG Master of Clanintern

#10 - 20.12 12:24

Dann stellt sich die Frage, ob das Ding überhaupt Links erzeugt. Nachdem es dabei nämlich ohnehin um Inhalte geht die nur mit aktiviertem JS angezeigt werden können, spricht nicht viel dagegen, statt einem a ein normales span (oder ähnliches) zu verwenden und dem ein onclick zu verpassen. Nimm mal Firebug oder vergleichbares und sieh dir die Links genauer an.
Whiteknight KKK

RANG Deckschrubber

#11 - 21.12 22:35

Ich denke auch mal das die Links mit einem OnClick und location.href versehen sind und nicht mit dem 'a'-Tag. Wenn dem so ist, kann man nichts machen, richtig?

Oder könnte man dann auch versuchen location.href zu ändern, dass es ein neues Fenster öffnet?

Ich glaube das wird mir zu kompliziert und ich schmeisse die Flinte ins Korn :o(

Wenn Du noch eine Idee hast, sehr gerne, andernfalls vielen lieben Dank für deine Mühe!
aaf

RANG Lord of Clanintern

#12 - 22.12 04:52

hm hast du mal probiert das script zu saugen, zu bearbeiten und lokal auf deinem webserver auszuführen?
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#13 - 22.12 07:58

Ich kann dir mittlerweile auch sagen woran es liegt: Google bindet keine a-Tags in deine Seite sondern einen IFrame.
aaf

RANG Lord of Clanintern

#14 - 23.12 00:23

worin möglicherweise a tags liegen?
dann würde stephans ansatz funktionieren, mit dem richtigen window als ziel...
*al!ve* - irgendwo zwischen Semester 4 und 7

RANG 0wn3r

#15 - 23.12 13:15

^^ Jo Claudius, das das wollte ich damit auch sagen. War und bin mir nur nicht sicher, ob document.getElementsByTagName lediglich die Child-Nodes von (i-)frames nicht einschließt oder ob ich grundsätzlich nicht auf Inhalte innerhalb eines (i-)frames zugreifen kann. Ersteres könnte ich mir als strukturelle Trennung vorstellen, letzteres aus Gründen der Sicherheit. Müsste nur mal jemand ausprobieren. Ich hab dazu aber grade weder Lust noch Zeit.
Whiteknight KKK

RANG Ruler

#16 - 25.12 22:36

Ihr meint also document.getElementsByTagName('a') bezieht sich nur auf das eigene Dokument, nicht aber auf I-Frames die aus einem fremdem Skript angezeigt werden?

Hab nochmal genau hingeschaut. AdSense wird erst angezeigt wenn die komplette Seite geladen wurde. Das ist bei mir immer das letzte Objekt was dargestellt wird. Das erschwert das ganze nochmal...