Autor Zpráva
Duchaplny
Profil
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
    function zmenlink() {
 
        document.getElementById("prvy").href= "#stranka";
 
    }
Str4wberry
Profil
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
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
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>
Keby to aspoň písalo prečo to nefunguje, jak je to u PHP napr., tak by sa to ľahšie ladilo aj chápalo, ale takto mi to JS robí stále problémy pochopiť..
Micruss
Profil
zkus zapnout konzoli "prozkoumat prvek" apod. a tam máš errory v pravo dole, třeba tam je něco napsaný ;-)
Chamurappi
Profil
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
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
Duchaplny:
Vlož ten js kód pred </body>.
Chamurappi
Profil
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
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>
mi to dá:
<a id="prvy" href="stranka.html#stranka">Stranka</a>
skúšal som napr. stranka2.html, čo sa prepíše, ale keď je tam znak "#", tak sa priradí.. nepomôže ani entita toho znaku, bo tá sa bohužiaľ nespracuje a vypíše sa jak je napísaná..

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>
JS on:
<a id="prvy" href="#stranka">Stranka</a>
Duchaplny
Profil
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
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
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]
}
problém však bol, že nezdieľali rovnaké adresy.. keď napr. bez JS by odkaz vyzeral main.php?page=register, tak so zapnutým JS odkaz vyzeral #singup.. keďže ich bolo docela dosť, tak som chcel jednoduchšie riešenie -> [#9], akurát odkaz musí byť pred scriptom..

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
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:
Zdrojový kód aktualizovaný zdroják toho, čo som popísal vyššie Str4wberrymu+živá ukážka.
Odkazy aktualizované, v živej ukážke zohľadnené Chamurappiho pripomienky [#18].
Chamurappi
Profil
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
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;
Dospel som k záveru, že toto by malo teda spoľahlivo fungovať.


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;
}
Tento kód zahlásí 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..

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: