« Linkeljünk JavaScript-tel »

Sztanahov írt róla, hogy megjelenőben van egy újabb linkelési formátum, ahol a href="" tulajdonságba nem egy statikus címet írunk, hanem egy JavaScript funkciót. Valahogy így:

<a href="javascript:showLink('abc123');">ez egy link</a>

Ezzel igazából egy probléma van: nem biztos, hogy az adott böngésző rendelkezik JavaScript-tel, de ha rendelkezik is, nem biztos, hogy minden böngésző egyformán kezeli. Viszont van erre egy rendkívül jó megoldás, ami a JavaScript hiányában, vagy hibás kód bevitelekor nem bántja az eredeti linket, valamint a link megnyitható új lapon is, nem úgy, mint egy szabványos JavaScript link.

Mindenképpen szükségünk lesz egy különálló fájlra, ahol a kódunkat tároljuk. Ezt az adott HTML oldalon meghívjuk, mondjuk a <head> részben, valahogy így:

<script language="javascript" type="text/javascript" src="kod.js" ></script>

Megjegyezném, hogy XHTML 1.1 esetében a language="" tulajdonság megadása nem szükséges.

Tehát, van egy kódunk, ami az oldal betöltésekor betöltődik. A kód annyit fog tenni, hogy bizonyos linkeknek a kattintáskor történő eseményét módosítja, de maga a hivatkozást nem módosítja. Ehhez egy saját függvényre, egy ciklusra, és a getElementsByTagName(); függvényre lesz szükségünk. A mi függvényünk, az oldal betöltésekor megkeresik az összes <a> elemet, és amelyikhez egy egyéni rel="" tulajdonság van rendelve, annak módosítja az onClick(); eseményét. A ciklusra értelemszerűen azért lesz szükség, mert több elem is lehet egy oldalon. Én a mostani kódnál a rel="jslink" tulajdonságot fogom alkalmazni.

function setLinks()
{
  var aTagek = document.getElementsByTagName("a"); // az aTagek változó lesz az a tömb, ami az összes <a> elemet foglalja magába
  for(var i = 0; i < aTagek.length; i++ ){
    if(aTagek[i].getAttribute("rel") == "jslink" && (aTagek[i].getAttribute("href"))){ // itt történik az ellenőrzés, hogy van-e megadva href és rel tulajdonság, illetve utóbbinak értéke "jslink"-e
    tagA[i].onclick = function () { showLink(this); } // a showLink(); természetesen bármi más lehet, amire szükségünk van, akár egy egyéni függvény is
    }
  }
}

Ezen kívül szükség lesz még egy apró módosításra a HTML fájlban, mégpedig ez a saját függvényünk meghívása lesz.

<body onload="setLinks();">

Ezzel tulajdonképpen készen is volnánk, az oldal betöltésekor betöltődik a fájlunk, és az általam setLinks(); elnevezést kapó függvény végrehajtódik, ami az összes rel="jslink" tulajdonságú hivatkozás kattintáskor való eseményét módosítja.

Gábor hívta föl a figyelmemet, hogy a <body> elemnek megadott onLoad="" esemény kerülendő, ezért célszerű inkább a kód utolsó sorába ezt az apróságot beszúrni: window.onload = setLinks;, vagy a hozzászólásban említett módszert használni.
Kommentek RSS ikon
A bejegyzéshez érkezett kommentek, amiket RSS csatornán is követhetsz.
A body attributumakent atadott onload megoldas kerulendo, javasolt helyette a diszkret addEvent(window, „load”, setLinks) megoldas inkabb.
ld a kommentem sztahanovnal :)
Ennek a megoldásnak mi az előnye a hagyományos mosóporral szemben?
Gábor: módosítottam, köszi.

Shamalt: igazad van, de azért a JavaScript-tel jóságokat lehet ám készíteni. Gondolok például a GMail-re, vagy a Google Calendarra.

csaba: ez akkor jó, ha valamilyen js műveletet szeretnél végrehajtatni kattintáskor, de nem szeretnéd, hogy a js nélküli böngészők ne ütközzenek bele.
mefi: ertsd jol, en nem javascript-, hanem felesleges javascript hasznalat-ellenes vagyok ;)
és ez miért jobb, mint a direkt linkelés?
Shamalt: okok, értem. :)

Dani: mondjuk ha valaki YACA-t, vagy HaloScan-t használ, annak például jó lehet. :)
Sztahanov által említett módszer nyilván alapvetően káros. A fenti módszer úgy gondolom, hogy igazából teljesen másról szól, és így akár hasznos is lehet – például ha egy hagyományos linket használva egy adott div-be szeretnél betölteni egy új HTML részletet. A sportklub.tv-n én most hasonlóan oldottam meg a TV műsor lapozóját. Ez azért lehet jó, mert akiknek nincsen JS-e, azok is meg tudják nézni a műsort, igaz, nem túl szépen.
Nem teljesen jó így, direkt nem úgy írtam. Diszkrétebb, de amennyire én tudom, nem kezelik egységesen a böngészők azt a sémát. Mellékelném a számos projekt által alkalmazott, eredetileg Simon Willisontól származó kis snippetet:


function addEvent(func)
{
var oldonload = window.onload;
if (typeof window.onload != 'function'){
window.onload = func;
} else {
window.onload = function(){
oldonload();
func();
}
}

}
1.) Nekem is az jutott eszembe, hogy minek ez a javascript mizéria, amíg nem olvastam a hozzászólásokat. Valóban, például ha azt akarod, hogy adott linkeknél teszem azt azt szeretnéd, hogy a link képe lassan elhalványodjon kattintásra, jól jöhet egy olyan megoldás, ami nem zárja ki a javascript-től tartózkodó felhasználókat. Szóval biztos lehet használni valami hasznos vagy haszontalan dologra.

2.) Ahogy Gábor írta, a html kód végébe hozzáírt window.onload nem diszkrét szemléletű. Nincs külön a javascript és a html kód. Hogy miért nem említette meg a cikkét András? http://weblabor.hu/cikkek/diszkret[…]

function addEvent(obj, evType, fn){
if (obj.addEventListener){
obj.addEventListener(evType, fn, false);
return true;
}else if (obj.attachEvent){
return obj.attachEvent("on"+evType, fn);
}
return false;
}
Megjegyezném, hogy XHTML 1.1 esetében a language="" tulajdonság megadása nem szükséges.


Inkább tilos. Egyébként nem XHTML 1.1-nél se szükséges.
peldaul ez is egy „szep” pelda :) http://thedailywtf.com/forums/7066[…]
Gábor: igen, ezzel valahol (talán a LightBox kódjában) találkoztam már. Kiegészítettem ezzel a hivatkozással az írást, köszi megint. :)

Levente: igen, tudom, hogy nem lehet megadni, a validátor is kiakad tőle.

Maat: Sztahanov is ezt a linket említi a fentebb jelölt bejegyzésénél, de ez mindenképpen rossz módszer.
lehet hogy kicsit OFF, de nem tudjátok hogy hogy oldható meg JS-ben, hogy ha kattintok egy linkre akkor ne hajtódjon végre..
pl van ez a link: <a href="valami.php" class="link">
a hasonló módon mint ami a cikkben van a JS megtalálja a linket és betölti egy div-be. a prototype ajax.update osztály segítégével, a gond az hogy miután betöltötte a div-be a cuccot a böngészőben a valami.php-t nyitja meg…

amit eddig próbáltam az a return(false); volt a függvény utolsó sorában, de ezzel sem jutottam közelebb az igazsághoz :(
Szerintem ezzel a módszerrel, és egy általad is említett return:false; megoldással működőképes lenne.
mefi:
most láttam hogy te is használsz „e-mail védelmet”
javaslom próbáld ki az alábbi dolgot, én a weblaboron találtam és használom is.. :P
annyit kell tenni, hogy a függvény fusson le a lap betöltödésekor..
function whatCorrector() {
var replaces = 0;
var alltags = document.all ? document.all.tags("A") : document.getElementsByTagName("*");
for (i=0; i < alltags.length; i++) {
if (alltags[i].className == 'whateffect') {
while (alltags[i].innerHTML.indexOf('#|'+'KUKAC|#') != -1 && replaces < 10000) {
alltags[i].innerHTML = alltags[i].innerHTML.replace('#|'+'KUKAC|#', String.fromCharCode(64));
replaces++;
}
}
}
}

u.i: átírtam az általad használt formátumot ;)
Igen, ezt a módszert ismerem, de megmondom őszintén, hogy nem foglalkoztat – a GMailnek tökéletes a spamszűrője. :)
Tény, hogy XHTML 1.1 kivételével valid a language attribútum, de mi értelme megadni?
Még régebben olvastam valamit, hogy az Internet Explorer nem kezeli rendesen – nem tudom, hogy ebből mi igaz.
nem értem hogy ez miért új. :)
Az új az mint ironikus, ráadásul rossz linkelési formula, ez inkább arra való, hogy JS-sel linkeljünk, de azok, akiknek nincs JS, szinténtudjanak kattintani.
Új komment

Itt az adott bejegyzésben elhangzottakhoz szólhatsz hozzá. Ha primitív, csúnya, vagy bunkó erkölcsről teszel tanúbizonyságot, tuti, hogy kimoderállak és rosszat mondok rólad. A hozzászólás nem kötelező, amit írsz vállald föl!

Ezeket az adatokat - ha a böngésződ kezeli a kukikat - csak egyszer kell megadnod, később módosíthatod.

Ha van gravatarod - és a gravataros e-mail-címeddel kommentálsz -, akkor az megjelenik. Ha nincs, vagy nem tudod miaz, akkor olvasd el az útmutatót és regisztrálj.

Neved: E-mail címed (nem jelenik meg): Webszájtod (ha van): Kommented: Mennyi négy és négy összege?
Ez védelmi célokat szolgál, szimplán írd be a fenti összeadás összegét!

A kommentedet írhatod nagyobb mezőbe vagy akár formázhatod is, de ha nem szalonképes, akkor moderálom!

Ajánló
Ebben a témában, esetleg ezen a napon voltak még ilyenek is:

BlogTalkRadio (2006. július 28., 02:15:57)
Mama CD (2006. április 26., 04:25:24)
Birthday Forever (2006. április 05., 07:43:51)

Érdekességek
Száraz számok, pusztán csak tények:

Ez a bejegyzés 2213 napja született, 686 szóból, és 3689 karakterből áll. Ajánlhatod bizonyos linkgyűjtő oldalaknak: