Avatar billede w13 Novice
03. august 2007 - 22:03 Der er 40 kommentarer og
1 løsning

Target i <a> accepteres ikke af HTML 4.01 Strict

Hej Eksperter.

Jeg læste lige et par artikler på nettet omkring forskelle på HTML 4.01 Transitional og Strict. Tilsyneladende er attributten "target" ikke accepteret i et anchor-tag (<a>), men hvor'n Shaitan skal man så åbne en URL i et nyt vindue uden brug af JavaScript?
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:15 #1
Med java script:

<script type="text/JavaScript" language="JavaScript">
lnx = document.links;
for(i = 0, len = lnx.lenght; i < len; i++)
{
lnx[i].target = "navnet";
}
</script>
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:16 #2
..hvis det er alle links..

Ellers skal du indsætte en selvdefineret parameter i de pågældende links..

Eksempel:

<a href="side.htm" rel="eksternside">test</a>

<script type="text/JavaScript" language="JavaScript">
lnx = document.links;
for(i = 0, len = lnx.lenght; i < len; i++)
{
if (lnx[i].rel == "eksternside") lnx[i].target = "navnet";
}
</script>
Avatar billede w13 Novice
03. august 2007 - 22:19 #3
Jo, men hvis man nu vil gøre det med HTML, så Google kan være med også, eksempelvis?
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:20 #4
Google er fuldstændig ligeglad, om siderne åbner i et nyt vindue eller ej.
Det kigger den overhovedet ikke på, så vidt jeg ved.
Avatar billede erikjacobsen Ekspert
03. august 2007 - 22:22 #5
Man kunne også lade være med at bruge HTML 4.01 Strict
Avatar billede w13 Novice
03. august 2007 - 22:25 #6
Nej, men Google kan ikke køre JavaScript, og hvis jeg nu gerne vil have Google til at indeksere linket, går det desværre ikke at benytte JavaScript på linket. Æv!

Jeg mener, de kan da ikke bare fjerne muligheden for at åbne et link i et nyt vindue med HTML!? Eller det kan de åbenbart?
Avatar billede w13 Novice
03. august 2007 - 22:26 #7
:P Ja det kunne man selvfølgelig, Erik, jeg havde bare fået det indtryk, at det var mere hensigtsmæssigt - mere "fremtidsvenligt".
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:30 #8
w13> Google kan stadig se linket, som det er, selvom Google ikke kan afvikle JavaScript.
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:34 #9
Taget fra http://www.accessify.com/features/tutorials/the-perfect-popup/archive/:

function externalLinks() {
    if (!document.getElementsByTagName) return;
    var anchors = document.getElementsByTagName("a");
    for (var i=0; i<anchors.length; i++) {
        var anchor = anchors[i];
        if (anchor.getAttribute("href") &&
        anchor.getAttribute("rel") == "external")
        anchor.target = "_blank";
    }
}
window.onload = externalLinks;
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:36 #10
Det var lidt for hurtigt.. prøver lige igen..


Taget fra http://www.accessify.com/features/tutorials/the-perfect-popup/archive/:

function externalLinks() {
    if (!document.getElementsByTagName) return;
    var anchors = document.getElementsByTagName("a");
    for (var i=0; i<anchors.length; i++) {
        var anchor = anchors[i];
        if (anchor.getAttribute("href") &&
        anchor.getAttribute("rel") == "external")
        anchor.target = "_blank";
    }
}
window.onload = externalLinks;

Og linket:

<a href="file.htm" onclick="window.open(this.href);return false;" rel="external">


Som du kan se, vil Google kunne læse at der skal loades "file.htm"..
Samtidigt giver man de såkaldte JavaScript-enabled (kan afvikle JavaScript) browsere mulighede for at åbne i et nyt vindue..
Avatar billede olebole Juniormester
03. august 2007 - 22:37 #11
<ole>

Meningen er, at en HTML 4.01 Strict parser ikke skal kikke efter en target-attribut. Så er det rystende ligegyldigt, om den er skrevet i koden eller sat med JavaScript.

Vil man åbne et vindue i HTML 4.01 Strict skal det gøres med window.open. Så er det ligemeget, om man sætter event-handlers med JS eller skriver dem i koden  =)

<a href="http://www.dengodekode.dk" onclick="window.open(this.href, '_blank')">Link</a>

- er helt lovlig i HTML 4.01 Strict og Google har fin adgang til at finde og indeksere linket  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
03. august 2007 - 22:38 #12
Ups ... der skal lige returneres falsk:
    <a href="http://www.dengodekode.dk" onclick="window.open(this.href, '_blank');return false">Link</a>
Avatar billede olebole Juniormester
03. august 2007 - 22:39 #13
thesurfer >> Hvad skal scriptet gøre godt for?  =)
Husk i øvrigt, at window.open _skal_ have mindst to argumenter
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:41 #14
olebole> At man ikke behøver at indsætte onclick="..." på samtlige links.. :-)
Avatar billede w13 Novice
03. august 2007 - 22:43 #15
Ja, det må være løsningen, hvis det skal være google-venligt. Jeg stødte bare lige på denne her fact, at target ikke duede, og det overraskede mig lidt, så følte lige, det måtte undersøges.
Avatar billede olebole Juniormester
03. august 2007 - 22:46 #16
thesurfer >> "At man ikke behøver at indsætte onclick="..." på samtlige links"

Er det da ikke det, du gør i eksemplet?  =)
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:47 #17
Jo, men det var copy&paste.. se min kode i 03/08-2007 22:16:51.. som iøvrigt ikke ser ud til at virke.. :-)
Avatar billede olebole Juniormester
03. august 2007 - 22:50 #18
okay ... men undlad at sætte et target - da det jo ikke er tilladt. Sæt i stedet en onclick-handler, der åbner vinduet med window.open. Så bliver den lovlig  ;o)
Avatar billede erikjacobsen Ekspert
03. august 2007 - 22:51 #19
thesurfer: Hvad med at teste sin kode, inden man giver den videre? Eller i det mindste skrive: utestet

w13: Joh, HTML 4.01 Strict er nok "vejen frem" mod mindre HTML og mere CSS og Javascript, en opdeling der nok er godt. Men når man nu ikke ved hvad det indebærer, og du kan ikke regne med at olebole kommer og redder dig hver gang, så kan man jo vælge at holde sig til det fremragende HTML 4.01 Transitional, alle kender, som virker, og som man kan få hjælp til. Det var bare det jeg ville sige ... ;)
Avatar billede w13 Novice
03. august 2007 - 22:58 #20
Erikjacobsen>> Ja, nu fandt jeg lige en liste over forskelle på transitional og strict, og det viser sig (også i følge w3c's validator), at jeg faktisk overholder standarden, på nær dette her target-sjov. :) Så jeg tror, jeg har fundet "min" doctype.

Den store sum point går til Thesurfer for hans kodeeksempler, som jeg har gemt i mit kodearkiv, men også tak til Ole og Erik for deres gode kompetencer! ;)
Avatar billede thesurfer Nybegynder
03. august 2007 - 22:59 #21
Ahh.. fejlen i min kode var en stavefejl, i ordet "length".. Det skal være: lnx.length

erikjacobsen> Ja, det ville have været en god ide.
Men jeg mente at det her var så simpelt, at jeg sagtens kunne skrive et funktionelt eksempel, direkte i Ekspertens kommentar-fejl.

Koden virker også, hvis man lige retter min stavefejl.
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:02 #22
w13> Husk at rette stavefejlen.. :-)

Evt:

<script type="text/JavaScript" language="JavaScript">
window.onload = function()
{
    lnx = document.links;
    for(i = 0, len = lnx.length; i < len; i++)
    {
        if (lnx[i].rel == "eksternside") lnx[i].target = "navnet";
    }
}
</script>

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

olebole og erikjacobsen> Sig endeligt til, hvis jeg bruger den anonyme funtioner forkert, i window.onload..


- Svar
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:05 #23
Takker for points :-)
Avatar billede olebole Juniormester
03. august 2007 - 23:06 #24
- men stadigvæk:
Det eneste, scriptet hjælper med, er at snyde W3C's validator. Det er stadig ikke valid kode, at bruge target i HTML 4.01 Strict.

Fidusen med en standard er, at indsnævre de ting, browseren skal forholde sig til. Jo mere stringent standarden er, jo bedre er muligheden for mindre klienter og mere økonomisk overkommeligt arbejde med at udvikle nye browser versioner.

Derfor er meningen ikke at snyde et tilfældigt stykke software på nettet (validatoren), men at skrive hensigtsmæssig kode  ;o)

Skal tingene give mening, skal vinduerne med andre ord åbnes med window.open  =)
Avatar billede erikjacobsen Ekspert
03. august 2007 - 23:08 #25
Det kan godt være det virker at skrive
  lnx[i].target = "navnet";
i HTML 4.01 Strict, men target findes som sådan ikke. Det er bare browseren, der er flink ved dig. Som olebole siger: I HTML 4.01 Strict skal man bruge window.open. Og så kan man iøvrigt gøre det li'så elegant.
Avatar billede erikjacobsen Ekspert
03. august 2007 - 23:11 #26
Og ja, thesurfer, du bruger den anonyme funktion forkert, for du udelukker at brugeren kan få et andet script til at virke, der også skal bruge window.onload. Men du kan jo stille et spørgsmål i Javascript kategorien ... ;)
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:13 #27
erikjacobsen> Den med window.onload = overskriver tidligere window.onload, havde jeg faktisk allerede tænkt over.. :-)

Jeg har endda også set løsningen før.. jeg overvejede at skrive bemærkningen tidligere, men glemte det.. :-)
Avatar billede erikjacobsen Ekspert
03. august 2007 - 23:15 #28
Og når du skriver rel="eksternside", så har du også læst og forstået:
http://www.w3.org/TR/html401/types.html#type-links ?
Avatar billede w13 Novice
03. august 2007 - 23:17 #29
Er fixet med

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}
}

"a" er det, som eventen skal høre til.
"b" er selve proceduren (click, load, mouseover, etc.)
"c" er functionen, som tilføjes.
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:21 #30
Great.. så er rel="eksternside" heller ikke tilladt..

Så skal man fuske lidt med rel="ekstern-filnavn-som-ikke-eksisterer.css".. :-)
Men det giver garanteret bare andre problemer..


Jeg tænkte det med "åbne vinduer = window.open", og har lavet følgende rettelser til min tidligere kode:

<script type="text/JavaScript" language="JavaScript">
window.onload = function()
{
    lnx = document.links;
    for(i = 0, len = lnx.length; i < len; i++)
    {
        lnk = lnx[i];
        href = lnk.href;
        if (lnk.rel == "eksternside") lnk.onclick = function() { return dowindow(href); };
    }
}

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

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


Ja, den overskriver stadig tidligere window.onload.. :-)

Nu håber jeg, at koden er nogenlunde acceptabel.. ellers må jeg bare flytte ud på en øde ø, hvor jeg ikke kan komme i nærheden af en computer.. :-)
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:23 #31
Man kan også bruge det "inline":

lnk.onclick = function() { window.open(href, '_blank',''); return false; };

Men jeg foretrækker en seperat funktion, da det er nemmere og mere overskueligt, hvis man nu skulle tilføje flere kodelinier..
Avatar billede w13 Novice
03. august 2007 - 23:25 #32
Har lige læst, at "language" ikke er en understøttet attribut heller. :)

Koden må så blive:
-----------------------------------------------------
<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.rel=="eksternside")lnk.onclick=function(){return dowindow(href)}
    }
})

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

<a href="http://www.eksperten.dk" rel="eksternside">test</a>
Avatar billede w13 Novice
03. august 2007 - 23:26 #33
appendEvent skulle så også bruges på onclick!
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:27 #34
Så vidt jeg ved, så tilføjer man language="JavaScript" for at opretholde kompabilitet med ældre browsere..

Man burde vel også bruge

<script... >
<!--

indhold her

-->
</script>

Det er noget jeg tit ser.. det er vist til de helt gamle browsere (fra 1200-tallet).. :-)
Avatar billede olebole Juniormester
03. august 2007 - 23:27 #35
Vi begynder at nærme os - men husk: Det er koden ... ikke dig, der bliver 'kritiseret'  ;o)
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:31 #36
Jeg lærer mere at kritik, end af ros.. eller noget i den stil.. :-)

Hvis jeg laver fejl, vil jeg gerne have det at vide.. så kan jeg forhåbentligt lære af mine fejl, og blive bedre.. :-)
Avatar billede w13 Novice
03. august 2007 - 23:34 #37
Hvis man bruger ældgamle browsere fortjener man kun at blive straffet med at få smidt en uforståelig JavaScript-fejl i hovedet! :)
Avatar billede erikjacobsen Ekspert
03. august 2007 - 23:36 #38
' Great.. så er rel="eksternside" heller ikke tilladt.. '  - ja, det kommer jo an på hvad der står hos w3.org. Jeg kan ikke gennemskue det, og bruger derfor ikke rel-attributten som sådan. Men man kan jo proppe en class-attribut på, og så checke dens navn.
Avatar billede olebole Juniormester
03. august 2007 - 23:47 #39
- og der er ingen, der forbyder dig at bruge mere end én klasse på et element:
  <a href="#" class="minCSSklasse denDerTargetTing" .....>Link</a>

- og så spørge noget à la:
    if (aLinks[i].className.indexOf("denDerTargetTing")!=-1)
Avatar billede thesurfer Nybegynder
03. august 2007 - 23:49 #40
Yay! Endeligt noget der er tilladt.. :-)
Avatar billede olebole Juniormester
03. august 2007 - 23:54 #41
For nu lige at komme evt. spørgsmål i forkøbet:
Naturligvis burde jeg bruge DOM:
    if (aLinks[i].getAttribute("class").indexOf("denDerTargetTing")!=-1)

- men dette er et af de tilfælde, hvor DOM ikke er ordentlig/ens implementeret. IE kræver 'className' og alle andre kræver 'class' ... både, når der skal læses og sættes en klasse. Derfor bruger jeg den gamle 'JavaScript' property, indtil der bliver koncensus om 'class'.

Det samme gælder aflæsning af dynamiske værdier på form-elementer. Dér har jeg zq også givet fortabt  :o|

thesurfer >> mange kjøvenhavnere påstår jo om Sverige, at dér er alt, hvad der ikke er forbudt, påbudt. Så slemt står det dog ikke helt til omkring webkode  ;o)
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