Autor | Zpráva | ||
---|---|---|---|
Duchaplny Profil |
#1 · Zasláno: 15. 1. 2014, 12:46:53
Zdravím,
ako sa prosím Vás prepisuje link v <a> tagu pomocou JS pri načítaní stránky ?
Chcem tento kód: <a id="prvy" href="stranka.html">Stránka</a> pomocou JS prepísať na toto: <a id="prvy" href="#stranka">Stránka</a> skúšal som niečo takéto, ale nefunguje to: function zmenlink() { document.getElementById("prvy").href=#stranka; } window.onLoad = zmenlink() Priznám sa, že JS je moja slabina, možno mi tam niečo chýba, neviem. |
||
Kcko Profil |
#2 · Zasláno: 15. 1. 2014, 12:54:41
function zmenlink() { document.getElementById("prvy").href= "#stranka"; } |
||
Str4wberry Profil |
#3 · Zasláno: 15. 1. 2014, 12:56:43
1) Obsah
href u musí být v uvozovkách.
2) Při přiřazování do událostí se používají malá písmena ( window.onload ).
|
||
Duchaplny Profil |
#4 · Zasláno: 15. 1. 2014, 13:04:59
Prepísal som to a aj tak sa nič nezmenilo.
Testovací script: <script type="text/javascript"> function zmenlink() { document.getElementById("prvy").href= "#stranka"; } window.onload = zmenlink() </script> <a id="prvy" href="stranka.html">Stranka</a> |
||
Chamurappi Profil |
Reaguji na Duchaplnyho:
3) Do události chceš asi přiřadit funkci zmenlink , nikoliv to, co funkce vrací (tj. nic), takže bez závorek () , viz Rozdíl mezi voláním funkce a funkcí.
Nebo nepoužívej onload a dej skript za odkaz (doporučuji).
|
||
Duchaplny Profil |
#6 · Zasláno: 15. 1. 2014, 14:04:31
skúsil som tú poslednú možnosť, pretože to chcem hneď pri načítaní stránky.. problém je, že ani takto to nefunguje..
<script type="text/javascript"> window.onload = document.getElementById("prvy").href= "#stranka"; </script> <a id="prvy" href="stranka.html">Stranka</a> |
||
Micruss Profil |
#7 · Zasláno: 15. 1. 2014, 14:10:12
zkus zapnout konzoli "prozkoumat prvek" apod. a tam máš errory v pravo dole, třeba tam je něco napsaný ;-)
|
||
Chamurappi Profil |
#8 · Zasláno: 15. 1. 2014, 14:10:48
Reaguji na Duchaplnyho:
Jakou poslední možnost? Napsal jsem ti, ať umažeš závorky, ne ať přiřadíš do window.onload řetězec "#stranka" .
„pretože to chcem hneď pri načítaní stránky“ Skripty vložené do stránky se vykonávají hned, jak na ně prohlížeč narazí při čtení HTML. Takže když za odkaz umístíš skript měnící href , změní se href prakticky hned.
„Keby to aspoň písalo prečo to nefunguje, jak je to u PHP“ Nemáš to syntakticky špatně, chybu máš v logice — takovou si musíš najít sám v jakémkoliv programovacím jazyce, PHP nevyjímaje. |
||
Duchaplny Profil |
#9 · Zasláno: 15. 1. 2014, 14:29:24
Micruss:
V preskúmaní prvku (v prehliadači) nie je nič napísané, ak myslíš iné skúmanie prvku, tak netuším, čo máš na mysli.. Chamurappi: skúšam a stále nič.. už som písal, že v JS sa neorientujem, z môjho pohľadu by to malo fungovať, ale nefunguje.. ak je tam syntaktická chyba, tak to už vážne neviem, pretože to mám priamo zo stránky skopírované.. http://stackoverflow.com/questions/13207287/javascript-rewrite-replace-text-into-href-link-on-page Nový pokus, tiež nejde.. <script type="text/javascript"> document.getElementById("prvy").href= "#stranka"; </script> <a id="prvy" href="stranka.html">Stranka</a> |
||
pcmanik Profil |
#10 · Zasláno: 15. 1. 2014, 14:33:40
Duchaplny:
Vlož ten js kód pred </body>. |
||
Chamurappi Profil |
#11 · Zasláno: 15. 1. 2014, 14:40:41
Reaguji na Duchaplnyho:
„už som písal, že v JS sa neorientujem“ Ale formulaci „když za odkaz umístíš skript“ bys rozumět mohl. |
||
Duchaplny Profil |
#12 · Zasláno: 15. 1. 2014, 14:50:23 · Upravil/a: Duchaplny
pcmanik:
v podstate tam vôbec žiadne tagy nemám, ale aj keď ich pridám, tak to nič neurobí.. Chamurappi: Ale formulaci „když za odkaz umístíš skript“ bys rozumět mohl. hej sry, jak som to zle prečítal a vyskúšal ten predchádzajúci nezdar s tým onload, tak som toto už nedočítal.. keď to dám za to, tak mi to spraví čosi nežiadúce.. miesto: <a id="prvy" href="stranka.html">Stranka</a> <a id="prvy" href="stranka.html#stranka">Stranka</a> jednoduchá vec, ale vždy to musí byť jeden problém za druhým.. existuje ešte aj iná metóda, ktorá by prepísala ten link aj keď je tam znak "#" ? Chcem len, aby to fungovalo takto: JS off: <a id="prvy" href="stranka.html">Stranka</a> <a id="prvy" href="#stranka">Stranka</a> |
||
Duchaplny Profil |
#13 · Zasláno: 15. 1. 2014, 18:09:26
ok, vyriešené, stačilo to vyskúšať na reálnej situácii, bo v prázdnom testovacom súbore to ukazovalo inak..
|
||
Kubo2 Profil |
#14 · Zasláno: 15. 1. 2014, 21:28:08
Duchaplny:
Vytvoril som živú ukážku. Zamení href-y všetkých odkazov na stránke, ak končia reťazcom .html , za /#... , kde ... je názov stránky.
Teda napríklad URL stranka.html bude zamenená za /#stranka , ale aj cesta/stranka.html za /#cesta/stranka .
„stačilo to vyskúšať na reálnej situácii, bo v prázdnom testovacom súbore to ukazovalo inak“ Chyba určite nebola spôsobená prázdnym testovacím súborom. Všimni si svoje príspevky vyššie. |
||
Duchaplny Profil |
#15 · Zasláno: 16. 1. 2014, 15:33:57
Kubo2:
vytvoril som živú ukážku díky moc, uložil som si ju a možno ju ešte využijem.. už som inak tiež prišiel k jednému riešeniu, to zas mení všetko kde je page= na #stranky: for (var i = 0, links = document.links; i < links.length; ++i) { if (links[i].search.indexOf("page=") > -1) links[i].href = "#" + links[i].search.split("page=")[1].split("&")[0] } Chyba určite nebola spôsobená prázdnym testovacím súborom. Chyba bola v tom, že som to neskúsil na živej stránke.. síce to doplní k tomu odkazu napr. #stranka, takže to vyzerá zhruba takto main.php?page=register#stranka, ale podstatné je, že to funguje a spustí to modal okno, keď je JS zapnuté, a to je to čo som potreboval.. |
||
Str4wberry Profil |
#16 · Zasláno: 16. 1. 2014, 15:53:02
Mimochodem, k čemu je tento postup dobrý?
|
||
Kubo2 Profil |
Str4wberry:
„Mimochodem, k čemu je tento postup dobrý?“ Predpokladám, že mu ide o automatické prepisovanie URL adries odkazov pre AJAX (ale je pravda, že by mohol adresy ponechať, v udalosti pri kliknutí na niektorý z odkazov pomocou event.preventDefault(); zrušiť východziu akciu (prekliknutie odkazu) a načítať obsah trebárs s pridanou HTTP hlavičkou X-Requested-With . Hash by do adresy mohol pridať priamo v tej udalosti.)
Duchaplny: Odkazy aktualizované, v živej ukážke zohľadnené Chamurappiho pripomienky [#18]. |
||
Chamurappi Profil |
#18 · Zasláno: 16. 1. 2014, 21:57:10
Reaguji na Kuba2:
„ event.preventDefault() “
Nefunguje ve starších Explorerech. Proč ne prostě a jednoduše return false ? V odkázané ukázce ho koukám máš, takže preventDefault tam je jen na to, aby způsobil problém.
„načítať obsah trebárs s pridanou HTTP hlavičkou X-Requested-With “
Větvit obsah podle vymyšlených HTTP hlaviček asi není dobrý nápad, keše nemusí vědět, že na nich záleží. Šlo by jim to poradit ještě hlavičkou Vary: X-Requested-With , ale rozumnější mi přijde brát jiný druh obsahu z jiné URL.
„ var event = event || ev “
Co by mělo dělat tohle? Když lokální proměnná event není naplněna, je v ní undefined , takže je to stejné, jako bys napsal var event = ev .
|
||
Kubo2 Profil |
#19 · Zasláno: 16. 1. 2014, 23:34:07
Chamurappi:
„Proč ne prostě a jednoduše return false?“ Presne som očakával od teba túto reakciu, už keď som tú ukážku písal a rozhodoval sa, či tam event.preventDefault() dať alebo nedať. Nakoniec som ho tam dal, ale v podstate už ani neviem prečo. Vždy musím urobiť podobnú hlúposť ;-)
> „var event = event || ev“ > Co by mělo dělat tohle? Když lokální proměnná event není naplněna, je v ní undefined Okrem lokálnej premennej sa takto dá pristupovať naviac k vlastnosti objektu window , a to aj v kontexte funkcie, ak sa nemýlim. Po odskúšaní: Nie, nemýlim sa.
Tento prístup funguje tak, že ak je lokálna premenná nedefinovaná (nie neinicializovaná, a inicializovať sa dá aj hodnotou undefined), hľadá sa ešte vlastnosť objektu window s týmto názvom, a ak taká existuje, použije sa jej hodnota. Ak neexistuje ani tá, hodí to ReferenceError .
Ak je však lokálna premenná minimálne definovaná cez var , prípadne aj inicializovaná, vráti to vždy hodnotu tejto premennej alebo undefined , nikdy však nie hodnotu rovnomennej vlastnosti objektu window , aj keby bola definovaná - musí sa pristupovať explicitne cez window.názovVlastnosti .
Na otázku „Co by mělo dělat tohle?“ ti odpoviem takto: Malo by to implicitne priradiť do lokálnej premennej event hodnotu vlastnosti objektu window.event , a pokiaľ je undefined , bude tam namiesto nej hodnota parametru callbacku menom ev .
Po odskúšaní: pozerám, že ak premenná event nie je definovaná, hádže to, ako som už vyššie písal, ReferenceError . Takže podmienku musím vlastne otočiť ako ev || event alebo hodnotu explicitne ťahať z window.event , čo v prípade neexistencie vlastnosti vráti undefined , ktoré sa vyhodnotí ako false , a teda operátor OR použije hodnotu pravého operandu:
var event = window.event || ev; Príklad vyššie opravený zohľadňujúc Chamurappiho pripomienky, odkaz na príklad v príspevku [#17] aktualizovaný. |
||
Chamurappi Profil |
Reaguji na Kuba2:
„Takže podmienku musím vlastne otočiť ako ev || event “
To by nepomohlo. Pochopil jsem, o co ses snažil, tvá závěrečná varianta s window.event || ev je správně, tak nějak to obvykle píšu já.
„ak je lokálna premenná nedefinovaná (nie neinicializovaná, a inicializovať sa dá aj hodnotou undefined), hľadá sa ešte vlastnosť objektu window s týmto názvom“
Rozsah platnosti proměnné je vždy celá funkce, od začátku do konce, nerozhoduje, kde přesně je var . Interpretr prochází blok skriptu ve dvou krocích, v prvním zjišťuje proměnné (včetně funkcí), v druhém teprve vykonává. Nejnázorněji by to šlo ukázat asi takhle:
var x = 7; pokus(); function pokus() { alert(x); return true; var x = 4; } undefined , protože lokální x v pokus u má v době zavolání alert u tuto výchozí hodnotu. Lokální je kvůli var u uvnitř funkce, takže s globálním x nemá (krom názvu) vůbec nic společného. Ale k přiřazení čtyřky do tohoto x nikdy nedojde, to by se opravdu dělo až v místě, kde je x = 4 .
|
||
Duchaplny Profil |
Str4wberry:
Mimochodem, k čemu je tento postup dobrý? rieši to situáciu, keď má niekto vypnuté JS.. miesto aby odkazy boli nefunkčné, budú fungovať a presmerujú užívateľa na príslušnú adresu.. pokiaľ má JS zapnuté, tak to užívateľa nikam nepresmeruje, len mu vyskočí pohodlné modal okno.. |
||
Časová prodleva: 10 let
|
0