Avatar billede brownghost Nybegynder
04. august 2007 - 18:21 Der er 39 kommentarer og
2 løsninger

Funktion åbner side der ikke er fra eget dormæne, nyt vindue

den virker i IE
men ikke i FF :(

kan den laves om så den virker i firefox ??

function targetLinks() {
    var url
    for (i=0; i < document.links.length; i++) {
        url = document.links(i).href
        if (!((url.indexOf("test.dk")>-1)||(url.indexOf("www.test.dk")>-1)||(url.indexOf("javascript")>-1)||(url.indexOf("localhost")>-1))) {
            document.links(i).target = "_blank"
        }
    }
}

Nogle der ved noget om det?
Tak :)
Avatar billede thesurfer Nybegynder
04. august 2007 - 18:27 #1
Forstod jeg ikke helt.. :-)

Og så er det [] i stedet for (), i document.links..:

        url = document.links[i].href;
Avatar billede thesurfer Nybegynder
04. august 2007 - 18:30 #2
Og det er overflødigt at teste på "www.test.dk" når du allerede har testet på "test.dk", da "test.dk" jo indgår i "www.test.dk".. :-)
Avatar billede w13 Novice
04. august 2007 - 18:31 #3
du bør også erstatte "document.links" med "document.getElementsByTagName('a')"

Det andet er vist kun til IE.
Avatar billede thesurfer Nybegynder
04. august 2007 - 18:36 #4
Umiddelbart ligner det, at du prøver på at komme uden om, at XHTML (eller HTML 4.01 Strict) ikke tillader TARGET attribut i et A-tag..

Er det det du prøver på? :-)
Avatar billede w13 Novice
04. august 2007 - 18:37 #5
thesurfer>> ;)
Avatar billede thesurfer Nybegynder
04. august 2007 - 18:55 #6
Hvis det er det jeg skrev i 04/08-2007 18:36:22, kig lige på http://www.eksperten.dk/spm/790208

Som w13 og jeg deltog i, sammen med olebole og erikjacobsen.. :-)

Løsning blev (mere eller mindre):


<script type="text/JavaScript">
function appendEvent(a,b,c){
    if(a.attachEvent){a.attachEvent("on"+b,c)}
    else if(a.addEventListener){a.addEventListener(b,c,false)}
    else{a["on"+b]=c}
}

appendEvent(window,"load",function(){
    lnx=document.links;
    for(i=0,len=lnx.length;i<len;i++){
        lnk=lnx[i];
        href=lnk.href;
        if(lnk.className.indexOf("eksternside") != -1) lnk.onclick=function(){return dowindow(href)}
    }
})

function dowindow(url){window.open(url,'_blank','');return false}
</script>

og linket ser sådan ud:

<a href="http://www.eksperten.dk" class="eksternside">test</a>


Læg mærke til indlæggene:

03/08-2007 23:15:59 om: brugen af rel-attributten

03/08-2007 23:36:56 om: brugen af class-attributten, hvis rel-attributtens værdi er begrænsede

03/08-2007 23:54:17 om: className vs .getAttribute("class")
Avatar billede thesurfer Nybegynder
04. august 2007 - 19:06 #7
Rettelse: document.links er nu erstattet af document.getElementsByTagName("a")
---

Hvis det er det jeg skrev i 04/08-2007 18:36:22, kig lige på http://www.eksperten.dk/spm/790208

Som w13 og jeg deltog i, sammen med olebole og erikjacobsen.. :-)

Løsning blev (mere eller mindre):


<script type="text/JavaScript">
function appendEvent(a,b,c){
    if(a.attachEvent){a.attachEvent("on"+b,c)}
    else if(a.addEventListener){a.addEventListener(b,c,false)}
    else{a["on"+b]=c}
}

appendEvent(window,"load",function(){
    lnx=document.getElementsByTagName("a");
    for(i=0,len=lnx.length;i<len;i++){
        lnk=lnx[i];
        href=lnk.href;
        if(lnk.className.indexOf("eksternside") != -1) lnk.onclick=function(){return dowindow(href)}
    }
})

function dowindow(url){window.open(url,'_blank','');return false}
</script>

og linket ser sådan ud:

<a href="http://www.eksperten.dk" class="eksternside">test</a>


Læg mærke til indlæggene:

03/08-2007 23:15:59 om: brugen af rel-attributten

03/08-2007 23:36:56 om: brugen af class-attributten, hvis rel-attributtens værdi er begrænsede

03/08-2007 23:54:17 om: className vs .getAttribute("class")
Avatar billede brownghost Nybegynder
04. august 2007 - 19:46 #8
nej prøver ikke at omgå det med target.

det er fordi jeg eks vil undgå at man nåpr man skriver i tekst editor skal hen og lave åbne i ny side hvis linket ikke er til egen side, så skal det altid åbnes i nyt vindue.

er det til egen side så skal det åbne i samme vindue.

det er det funktionen er til,
den er lavet for godt 5 år siden.
Nu bruger jeg selv FF og det er der mange der gør, så ville jeg bare opdatere den så den virker i FF også :)

det er det jeg prøver på.

du siger så jeg bare skal i min funktion lave det om så det er:
document.getElementsByTagName("a")

men det syntes jeg ikke kan komme til at virke ??

Såden her virker min nuværnde funktion.

<body onLoad="targetLinks();">


<script language="JavaScript" type="text/JavaScript">
function targetLinks() {
    var url
    for (i=0; i < document.links.length; i++) {
        url = document.links(i).href
        if (!((url.indexOf("test.dk")>-1)||(url.indexOf("javascript")>-1)||(url.indexOf("localhost")>-1))) {
            document.links(i).target = "_blank"
        }
    }
}
</script>

Hvor skal det skrive om henne så ?
det du bruger: document.getElementsByTagName("a")
Syntes at være en anden funktion ??
Avatar billede w13 Novice
04. august 2007 - 19:49 #9
function targetLinks(){
    for(i=0;i<document.getElementByTagName("a").length;i++){
        var url=document.getElementByTagName("a")[i].getAttribute("href");
        if(!((url.indexOf("test.dk")>-1)||(url.indexOf("javascript")>-1)||(url.indexOf("localhost")>-1))){document.getElementByTagName("a")[i].setAttribute("target","_blank")}
    }
}
Avatar billede brownghost Nybegynder
04. august 2007 - 19:58 #10
virker ikke, hverken IE eller FF :(
Avatar billede w13 Novice
04. august 2007 - 19:59 #11
Så må du da få en JavaScript-fejlmeddelelse?
Avatar billede w13 Novice
04. august 2007 - 20:00 #12
Jeg manglede et par s'er.

getElementsByTagName

Altså:

function targetLinks(){
    for(i=0;i<document.getElementsByTagName("a").length;i++){
        var url=document.getElementsByTagName("a")[i].getAttribute("href");
        if(!((url.indexOf("test.dk")>-1)||(url.indexOf("javascript")>-1)||(url.indexOf("localhost")>-1))){document.getElementsByTagName("a")[i].setAttribute("target","_blank")}
    }
}
Avatar billede thesurfer Nybegynder
04. august 2007 - 20:04 #13
w13> Hehe.. Jeg ved ikke lige, hvad det er du har imod orden.. :-)

function targetLinks()
{
    lnx = document.getElementsByTagName("a");
    for(i = 0, len = lnx.length; i < len; i++)
    {
        lnk = lnx[i];
        url = lnk.getAttribute("href");

        if( !( (url.indexOf("test.dk") > -1) || (url.indexOf("javascript") > -1) || (url.indexOf("localhost") >-1) ) )
        {
            lnk.setAttribute("target","_blank")
        }
    }
}
Avatar billede w13 Novice
04. august 2007 - 20:06 #14
Du kalder det rod, jeg kalder det et kompakthedsflip.. fik det her for nylig.. så nu fjerner jeg ubevidst alle overflødige mellemrum. Sorry! :)
Avatar billede thesurfer Nybegynder
04. august 2007 - 20:08 #15
IF-sætningen kan skrives om, så den er nemmere at læse..

Læg mærke til, at jeg har tilføjet et ":" til "javascript":

        if( url.indexOf("test.dk") == -1 && url.indexOf("java script:") == -1 && url.indexOf("localhost") == 1 )
Avatar billede brownghost Nybegynder
04. august 2007 - 20:52 #16
Virker så næsten

function targetLinks()
{
    lnx = document.getElementsByTagName("a");
    for(i = 0, len = lnx.length; i < len; i++)
    {
        lnk = lnx[i];
        url = lnk.getAttribute("href");

        if( !( (url.indexOf("test.dk") > -1) || (url.indexOf("javascript") > -1) || (url.indexOf("localhost") >-1) ) )
        {
            lnk.setAttribute("target","_blank")
        }
    }
}

Den åbner bare alle sider i FF i nyt vindue.

Nogle gode ideer ?
Avatar billede w13 Novice
04. august 2007 - 22:00 #17
Prøv lige at bruge thesurfers opdaterede if: if( url.indexOf("test.dk") == -1 && url.indexOf("java script:") == -1 && url.indexOf("localhost") == 1 )
Avatar billede olebole Juniormester
04. august 2007 - 22:02 #18
<ole>

- ked af det, men er thesurfer ikke testet positiv her ...?!??!!!  ;D

if( url.indexOf("test.dk") == -1 && url.indexOf("java script:") == -1 && url.indexOf("localhost") == -1 )

/mvh
</bole>
Avatar billede olebole Juniormester
04. august 2007 - 22:03 #19
*hint* ... der manglede vist et minus ved: url.indexOf("localhost") == -1
Avatar billede w13 Novice
04. august 2007 - 22:04 #20
jo :)
Avatar billede brownghost Nybegynder
04. august 2007 - 22:49 #21
Gør bare det samme virker i IE men ikke i FF

function targetLinks()
{
    lnx = document.getElementsByTagName("a");
    for(i = 0, len = lnx.length; i < len; i++)
    {
        lnk = lnx[i];
        url = lnk.getAttribute("href");

if( url.indexOf("shop.qcode.dk") == -1 && url.indexOf("java script:") == -1 && url.indexOf("localhost") == -1 )
{
            lnk.setAttribute("target","_blank")
        }
    }
}


;( andre ideer ?
Avatar billede olebole Juniormester
04. august 2007 - 23:02 #22
<ole>

Det her virker da både i IE og FF:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
<style type="text/css">
html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
</style>
<script type="text/JavaScript">
function targetLinks()
{
    lnx = document.getElementsByTagName("a");
    for(i = 0, len = lnx.length; i < len; i++)
    {
        lnk = lnx[i];
        url = lnk.getAttribute("href");

        if( url.indexOf("shop.qcode.dk") == -1 && url.indexOf("java script:") == -1 && url.indexOf("localhost") == -1 )
        {
            lnk.setAttribute("target","_blank")
        }
    }
}

window.onload = function() {
    targetLinks();
}
</script>
</head>
<body>

<p>
    <a href="http://www.google.dk">Google</a></p>
<p>
    <a href="http://www.dengodekode.dk">Den gode kode</a></p>
<p>
    <a href="http://www.eksperten.dk">Eksperten</a></p>
<p>
    <a href="http://localhost/">Localhost</a></p>

</body>
</html>

/mvh
</bole>
Avatar billede thesurfer Nybegynder
05. august 2007 - 00:05 #23
Jeg har testet 04/08-2007 23:02:58, og det virker også fint hos mig.


Det som jeg ikke synes er optimal, er den måde man undersøger hvor vidt et link er har en ekstern destination (ude på nettet).

Den nuværende kontrol, vil f.eks. tro at følgende er en lokal (på samme computer/server) destination

http://www.eksperten.dk/localhost/

fordi den sidste betingelse ( url.indexOf("localhost") == -1 ) ikke længere bliver opfyldt, da "localhost" jo findes i href'en.
Avatar billede olebole Juniormester
05. august 2007 - 00:11 #24
Man kunne spørge på location.host i stedet
Avatar billede olebole Juniormester
05. august 2007 - 00:12 #25
- glem dén!  :D
Avatar billede olebole Juniormester
05. august 2007 - 00:14 #26
- og dog ... man må kunne spørge, om location.host er en del af variablen 'url'. Hvis det er tilfældet, så skal linket ikke åbne i nyt vindue
Avatar billede olebole Juniormester
05. august 2007 - 00:16 #27
Prøv:
    if( url.indexOf(location.host) == -1 && url.indexOf("java script:") == -1  )
Avatar billede olebole Juniormester
05. august 2007 - 00:24 #28
- men det giver også fejlmuligheder. Hvis en side på www.eksperten.dk linker til http://www.domain.dk/sti/til/side.php?site=eksperten , vil linket ikke åbne i et nyt vindue.

Det kommer anpå, hvor nøje det skal være - men er det meget 'hysterisk', må man nok ud i en RegExp
Avatar billede brownghost Nybegynder
05. august 2007 - 11:13 #29
det virker forsat kun i IE. måske der skal tilføjes noget.

det er ser den nu som et Externt link, det er det jo ikke.
det er kun firefox der har det problem.

<a title="Information" href="/shop/info/" class="menu">» Information</a>

jeres script sætter simpelthen target="_blank" ind i linket.
i min kode er der ikke: target="_blank"
men jeres script sætter det ind.

kan i lave det script om ?
det jo kun links væd fra siden der skal åbne i nye vinduer.
alt på egen side skal åbne på egen side.

tak :)
Avatar billede olebole Juniormester
05. august 2007 - 13:06 #30
Ja, det kan jeg godt se. Jeg troede i min naivitet, at FF mente, hvad den skriver i statuslinjen ... men det var vildt overoptimistisk.

Der er ikke andet at gøre end at kaste sig ud i en større RegExp - men husk, den skal tjekke for med/uden 'http://', med/uden 'www' og med/uden subdomæne.
En anden bruger 'ljweb' lavede engang en 'tagster' i PHP, som genkendte forskellige former for links. Der kunne man sikkert score en fordelagtig begyndelse på RegExp'en - men jeg tror desværre ikke, den findes på WWW længere ... og jeg orker ikke sidde og rode med den ligenu  =)
Avatar billede brownghost Nybegynder
07. august 2007 - 10:38 #31
Ahh okay mente ellers jeg har skrevet FireFox også haha.

kender slat ikke det der: RegExp...
jeg tror så at jeg dropper at få det til at virke i FF :(
Lyder til det er noget være noget.. ;(
Avatar billede w13 Novice
30. oktober 2007 - 00:07 #32
Lukketid? =)
Avatar billede thesurfer Nybegynder
30. oktober 2007 - 11:38 #33
Det er muligvis denne her, olebole skrev om:

http://www.eksperten.dk/spm/616080
Avatar billede thesurfer Nybegynder
30. oktober 2007 - 11:39 #34
Hvis der skulle ske noget med det andet spørgsmål, smider jeg koden her ind:

http://www.eksperten.dk/spm/616080

function tagster_url($str, $target, $css_class) {
        $ins_str = "";
        if ($css_class) $ins_str .= " class=\"".$css_class."\"";
        if ($target) $ins_str .= " target=\"".$target."\"";
        $str = tagster_expand($str);
        $str = preg_replace ("/(ftp|http|https|telnet|news|nntp|file|irc):\/\/([a-z0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "<a href=\"\\1://\\2\"".$ins_str.">\\1://\\2</a>", $str);
        $str = preg_replace ("/(\s|tp\:|\(|\[|\&gt;)(www\.)([a-z0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "\\1<a href=\"http://\\2\\3\"".$ins_str.">\\2\\3</a>", $str);
        $str = preg_replace ("/(\s|tp\:|\(|\[|\&gt;)(ftp\.)([a-z0-9~#%@&:;=!',_æøå\(\)\?\/\.\-\+\[\]\|\*\$\^\{\}]+)/i", "\\1<a href=\"ftp://\\2\\3\"".$ins_str.">\\2\\3</a>", $str);
        return tagster_reduce($str);
    }


    function tagster_email($str, $css_class="") {
        $ins_class = "";
        if ($css_class) $ins_class = " class=\"".$css_class."\"";
        $str = tagster_expand($str);
        $str = preg_replace ("/([\s\"])([\w\.\-_]+)@([\w\-_]+)\.([\w\.\-_]+)/i", "\\1<a href=\"mailto:\\2@\\3.\\4\"".$ins_class.">\\2@\\3.\\4</a>", $str);
        return tagster_reduce($str);
    }


    function tagster_fix_endchar($str) {
        $str = preg_replace ("/([\'\"\)\]\.\,\?\!]+)\">/i", "\">", $str);
        $str = preg_replace ("/([\'\"\)\]\.\,\?\!]+)\" (target|class)=\"/i", "\" \\2=\"", $str);
        $str = preg_replace ("/([\'\"\)\]\.\,\?\!]+)<\/a>/i", "</a>\\1", $str);
        return $str;
    }

    function tagster_fix_longword($str, $maxlen = 10) {
        $sw = 0;
        $in_tag = false;
        $str_size = strlen($str);
        $res = "";

        for ($i=0; $i<$str_size; $i++){
            if ($str[$i] == '<') $in_tag = true;
            else if ($str[$i] == ' ') $sw = 0;

            if (!$in_tag && (($sw++) > $maxlen)) {
                $res .= '&shy;';
                $sw = 0;
            }
           
            if ($str[$i] == '>') $in_tag = false;
            $res .= $str[$i];
        }
       
        return $res;
    }

    function tagster_expand($str) {
        return " ".$str." ";
    }

    function tagster_reduce($str) {
        return substr($str, 1, -1);
    }
Avatar billede brownghost Nybegynder
30. oktober 2007 - 17:47 #35
lukker, den er for gammel :(
Avatar billede thesurfer Nybegynder
31. oktober 2007 - 10:34 #36
Så vidt jeg kan læse i reglerne, og finde frem til via søgefunktionen i min browser (Opera), er der ikke noget der hedder "for gammel".. :-)

Hvis en eller anden bruger oversætter PHP koden til JavaScript kode, så burde løsningen belønnes.
Avatar billede brownghost Nybegynder
31. oktober 2007 - 13:29 #37
lav svar så lukker og acceptere jeg :)
Avatar billede thesurfer Nybegynder
31. oktober 2007 - 14:22 #38
Det er nok olebole deer skal have points, for det er ham der kommer ind på "tagster" i indlægget 05/08-2007 13:06:32.

Jeg har bare lavet en søgning på "ljweb" og "tagster"..

Vent lige til du hører fra olebole.. ellers snupper du bare pointsne om 5 dage, eller deromkring..
Avatar billede olebole Juniormester
31. oktober 2007 - 14:33 #39
Jeg kunne jo også 'bare' have lavet den søgning - men havde ikke tid. Thesurfer, du har arbejdet betydeligt mere i denne tråd, end jeg har ... og så har du jo slået et godt slag for undertegnede ved at pointere, at bare fordi man er ved at være gammel, betyder det ikke nødvendigvis, man skal 'lukkes'  ;D

thesurfer >> Læg et svar. Jeg afstår i denne omgang  ;o)
Avatar billede brownghost Nybegynder
31. oktober 2007 - 15:47 #40
jer alle har jo hjulpet til, så lav svar alle sammen :)
Avatar billede thesurfer Nybegynder
31. oktober 2007 - 20:45 #41
olebole> :-)

brownghost> Svar fra mig :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester