Autor Zpráva
Jana008
Profil *
Ahoj všem,
témeř sama jsem udělala funkci která přepíše všechny odkazy na stránce > to funguje
ta funkce měla otevřít v novém okně odkazy s class="popup" > to funguje
a přitom zachovat stávající obsah onclick > tady je onen problém.
Moje ojedinělá funkce je zde:
<body>
<a href="http://nekam1.cz" class="popup" onclick="alert('gj'); return false;">odkaz v novém okně</a>
<a href="http://nekam2.cz">odkaz ve stejném okně</a>
http://statistiky.shopino.cz/o2/url_adresa_na_kterou_odkaz_smeruje
<a href="http://nekam3.cz" class="popup" onclick="alert('bg');">podlední odkaz v novém okně</a>
<script>
function _presmeruj_odkazy(){
if(!document.getElementsByTagName){
return false;
}
var o=document.getElementsByTagName("a");
for(var i=0;i<o.length;i++){
var lol=o[i].onclick+"";
lol=lol.replace(/^(undefined|null)$/,"");
lol=lol.replace(/^function.+\s?{\s?/,"");
lol=lol.replace(/return [A-Za-z]+;?/,"");
lol=lol.replace(/\s?}$/,"");
if(o[i].className.match("popup")){
o[i].onclick=function(){
eval(lol);
this.href=this.href.replace(/^http:\/\//,"http://pres_jiny_server/jeho _script/");
window.open(this.href);
return false;
}
}else{
o[i].onclick=function(){
this.href=this.href.replace(/^http:\/\//,"http://pres_jiny_server/jeho _script/");
eval(lol);
return true;
}
}
}
}
window.onload=_presmeruj_odkazy;
</script>
</body>

Navrchu jsou 3 odkazy, aby jste si to mohli zkusit.
No uvidíte, že problém je poslední onclick, který se při posledním průchodu cyklu nacpe ke všem předchozím odkazům, což neměl.
Takže když kliknete na první odkaz jeho alert bude "bg" a né správný "gj" no už nevím co s tím, pokud někdo vidí chybu a prozradí mi kde je zakopaná udělal by mi tím hodně radost.
ic
Profil *
To je jasné ta funkce přepíše obsah onclick na tu danou funkci, která mi potom v sobě eval(lol); a to také provede, to není jako php, kde se vepíše obsah lol do funkce eval ale to lol je tam stále ve stejném stavu jako proměnná a její hodnota pro všechny je to co zůstalo při posledním průběhu scriptu.
Jinak díky že mi pomáháš s tou funkcí... až příště zas nebudeš vědět zeptaj se rovnů XDD
peta
Profil
Jana008
Mozna by to slo udelat jednoduseji. Obalit A SPANem a jemu tad onlick, ktery provede neco tve a na zaver spusti
document.getElementByTagName('A')[0].onclick();
Nezkousel jsem.

Dalsi mne napada navazat onclick na document
document.onlick = funkce
funkce(e)
{
...
if (this.target.tagName == 'A') {...}
}
Tez jsem nepouzival, takto komplikovane, presneji nevim
Jana008
Profil *
ic
Tak ty jsi už i tady, to bych nečekala, bych prosila o radu někde jinde no trapas.
No už tomu rozumím ale s tou funkcí bych stejně potřebovala trochu poradit.
ic
Profil *
No já jsem právě tam kde mě nejméně očekávají
funkce by mohla vypadat takto:
function _presmeruj_odkazy(){
if(!document.getElementsByTagName){
return false;
}
var o=document.getElementsByTagName("a");
for(var i=0;i<o.length;i++){
lol=o[i].onclick+"";
lol=lol.replace(/^(undefined|null)$/,"");
lol=lol.replace(/^function.+\s?{\s?/,"");
lol=lol.replace(/return [A-Za-z]+;?/,"");
lol=lol.replace(/\s?}$/,"");
o[i].title=lol;
o[i].href=o[i].href.replace(/^http:\/\//,"http://pres_jiny_server/jeho _script/");
if(o[i].className.match("popup")){
o[i].onclick=function(){
eval(this.title);
window.open(this.href);
return false;
}
}else{
o[i].onclick=function(){
eval(this.title);
return true;
}
}
}
}

Tohle je sice funkčtní forma ale pro předávání dat využívá title, což není zrovna ideální páč tam može být nějaké důležizé sdělení
Za úkol můžeš zatím vymyslet nějaký jiný konzorciem schválený atribut na předání dat, který by se ale běžně nepoužíval.
joe
Profil
Nevím jak je na tom v JavaScriptu přiřazení události přes o[i].onclick, ale myslim si, že pomocí addEventListener je možné registrovat pro daný objekt více posluchačů - listenerů - a to by myslím stačilo. Původní onclick co je u odkazu natvrdo napsaný bych tam teda nechal a další událost přidal právě pomocí addEventListener. Pozor na to, že se to v každém prohlížeči dělá trochu jinak, ale to řeší jednoduchá podmínka, je to dohledatelné na internetu, třeba tady.
peta
Profil
ic
do objektu si muzes pridat jakoukoliv promennou:
odkaz.xyz = 'neco';

a na ten regularni vyraz bych prilis nespolehal
function funkce(e) {neco;}
onclick="a = b;"
onclick="funkce"
onclick="funkce()"
onclick="funkce ()"
onclick="funkce();"
onclick="function () {neco;};"
onclick="function () {neco;};"
onclick="function (e) {proved neco s e;}"
A treba posledni a casto pouzivane reseni nemas osetrene, protoze tim replace mu smazes vysledek udalosti ulozeny v e.
Zalezi na tom, zda vis, co vsechno muze byt v tom dokumentu nebo ne. Jestli dela univerzalni reseni, tak ty regularni vyrazy jsou slabe. Priklonil bych se k reseni snimat onclick odjinud, nejlepe s pridaneho span prvku. Ja psal document.onclick, joe by pouzil Listener.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: