"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Verwijderd
Je zou een functie kunnen schrijven die je bij de trigger van onload laat oproepen. Deze functie loopt dan met getElementsByTagname("a") alle <A> elementen af binnen het geladen document en wijst aan ieder element van de teruggekregen DOM-tree een andere standaard CSS class toe dan dat interne links krijgen ( met regexp of andere functie checken op 'http:' zoals in je voorbeeld ). Je zou ook nog de standaard class verwijzingen van de interne links achterwegen kunnen laten en verwerken in de functie. Ik denk dat dit een eventuele work-around zou zijn.
[ Voor 3% gewijzigd door Verwijderd op 28-12-2005 20:15 ]
Update:
Dit werkt wel:
1
| <a href="#">local</a> |
1
2
3
4
5
6
7
8
| var links = document.getElementsByTagName('a'); for(var i = 0; i < links.length; i++) { // geeft http://host/# alert(links[i].href); // geeft # alert(links[i].attributes['href'].value); } |
[ Voor 53% gewijzigd door MTWZZ op 28-12-2005 20:44 ]
Nu met Land Rover Series 3 en Defender 90
1
| <a href="#" rel="external">blaat</a> |
Met CSS kan je vervolgens de kleur (voor standards-compliant browsers) veranderen met iets als:
1
2
3
| a[rel="external"] { color:#FF0000; } |
Voordeel is dat je er nu met javascript veel makkelijker dingen aan kan hangen. Zo gebruik ik een script dat de "external" links in een nieuw venster opent, maar ik denk dat je op die manier ook relatief eenvoudig de kleur kan veranderen
Dat is dus niet mogelijkZoefff schreef op woensdag 28 december 2005 @ 20:52:
Ik zou niet bekijken of er "http://" in een link staat, maar een apart attribuut aan externe links toevoegen (als dat mogelijk is natuurlijk).
Ik gebruik nu overigens het volgende scriptje:
1
2
3
4
5
6
| var links = document.getElementsByTagName('a'); for(var i = 0; i < links.length; i++) { if ((links[i].attributes['href'].value).indexOf('http://')) { document.links[i].setAttribute('class', 'external'); } } |
Het is alleen bizar dat juist de links die niet beginnen met "http://", als class 'external' meekrijgen?
Ik ga dit scriptje eerst eens goed testen overigens. Er zullen ook wel wat regexpen bij komen kijken, om bv. een interne link naar een subdomein, niet mee te nemen...
[ Voor 53% gewijzigd door Reveller op 28-12-2005 21:15 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
1
2
3
4
5
6
7
| var links = document.getElementsByTagName("a"); for(var i = 0; i < links.length; i++) { var links_single = links[i]; if(links_single.getAttribute("rel") == "external") { links_single.style.color = "#FF0000"; } } |
Zie voor een voorbeeldje http://zoefff.gotdns.com/got/atribute_selectors.html
disjfa - disj·fa (meneer)
disjfa.nl
Verwijderd
Als http:// als eerste staat, dan staat hij dus op positie nummer 0.Reveller schreef op woensdag 28 december 2005 @ 21:09:
[...]
Dat is dus niet mogelijkIk kan alleen zaken veranderen nadat de pagina gerendered is, door bv. mbv. javascript de DOM aan te passen.
Ik gebruik nu overigens het volgende scriptje:
JavaScript:
1 2 3 4 5 6 var links = document.getElementsByTagName('a'); for(var i = 0; i < links.length; i++) { if ((links[i].attributes['href'].value).indexOf('http://')) { document.links[i].setAttribute('class', 'external'); } }
Het is alleen bizar dat juist de links die niet beginnen met "http://", als class 'external' meekrijgen?
Ik ga dit scriptje eerst eens goed testen overigens. Er zullen ook wel wat regexpen bij komen kijken, om bv. een interne link naar een subdomein, niet mee te nemen...
En aangezien 0 ook als false gezien kan worden, wordt de code achter if niet wordt uitgevoerd.
Daarom kan je beter zoiets gebruiken:
1
| if (links[i].attributes['href'].value).indexOf('http://') != -1) |
neeReveller schreef op woensdag 28 december 2005 @ 19:46:
is er een cross-browser pure css oplossing hiervoor?
nee, in ieder geval nog niet in IE7 voor zover bekendis er bekend wanneer IE css3 selectors gaat ondersteunen?
ja, maar een simpele expression kan hier ook wonderen verrichten:zou dit probleem anders met javascript op te lossen zijn
1
2
3
4
5
6
7
8
9
| <!--[if IE]> <style type="text/css"> a { color: expression((new RegExp('^http://')).test(this.getAttribute('href')) ? 'lime' : 'inherit'); } </style> <![endif]--> |
Intentionally left blank
Maar dat is dan alleen een oplossing voor IE. Voor FF heb je dan nog steeds een andere oplossing nodig. Ik denk dat het dan duidelijker is om een generieke javascript oplossing te maken?crisp schreef op woensdag 28 december 2005 @ 23:26:
HTML:
1 2 3 4 5 6 7 <!--[if IE]> <style type="text/css"> a { color: expression((new RegExp('^http://')).test(this.getAttribute('href')) ? 'lime' : 'inherit'); } </style> <![endif]-->
Het volgende javascriptje werkt trouwens perfect in FF, maar in IE wordt de class niet gezet. Toch zit er volgens mij geen fout in:
1
2
3
4
5
6
7
| var links = document.getElementsByTagName('a'); for(var i = 0; i < links.length; i++) { if ((links[i].attributes['href'].value).indexOf('http://') != -1) { document.links[i].setAttribute('class', 'external'); alert(links[i].attributes['class'].value); /* leeg in IE */ } } |
[ Voor 48% gewijzigd door Reveller op 29-12-2005 16:32 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
1
2
3
4
5
6
7
8
9
10
11
| var links = document.getElementsByTagName('a'); var i=links.length; while(i--) { if ((links[i].attributes['href'].value).indexOf('http://') != -1) { if(typeof links[i].className=='undefined') { links[i].className='external'; }else{ links[i].className+=' external'; } } } |
[ Voor 36% gewijzigd door djluc op 29-12-2005 16:44 ]
Het probleem met setAttribute en class is overigens dat IE het enkel op deze manier doet (wat weer niet werkt in standard-compliant browsers):
1
| links[i].setAttribute('className', 'external'); |
(ja, zelfs de DOM-implementatie van IE rammelt aan alle kanten
Zelf gebruik ik overigens mijn eigen methods om makkelijk met classes te werken: http://therealcrisp.xs4all.nl/meuk/classdealer.js
[ Voor 20% gewijzigd door crisp op 29-12-2005 16:57 ]
Intentionally left blank
Nogmaals bedankt voor je oplossing!
[EDIT]
@Crisp - dan klopte dat artikel in quirksmode toch
[ Voor 16% gewijzigd door Reveller op 29-12-2005 17:07 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."