Autor | Zpráva | ||
---|---|---|---|
Jana008 Profil * |
#1 · Zasláno: 25. 8. 2008, 18:20:19
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 * |
#2 · Zasláno: 25. 8. 2008, 20:12:14
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 |
#3 · Zasláno: 25. 8. 2008, 20:52:15
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 * |
#4 · Zasláno: 25. 8. 2008, 21:24:51
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 * |
#5 · Zasláno: 25. 8. 2008, 21:32:44
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 |
#6 · Zasláno: 25. 8. 2008, 22:07:23
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 |
#7 · Zasláno: 26. 8. 2008, 07:56:21
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. |
||
Časová prodleva: 16 let
|
0