| 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
hrefu 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 pokusu má v době zavolání alertu tuto výchozí hodnotu. Lokální je kvůli varu 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: 12 let
|
|||
0