Autor Zpráva
hypot
Profil
Situace - chci mít všechen javascriptový kód týkající se stránek jednoho webu v jednom externím souboru odkazovaném na všech stránkách webu; kódem týkajícím se stránek nemám na mysli jen kód vztahující se k naprosto všem stránkám, nýbrž i ten, který najde uplatnění jen na některých jednotlivých stránkách nebo jen na jedné; část onoho kódu jsou funkce, část však jen několik po sobě jdoucích příkazů (např. var p1 = document.querySelector("#menu1"); var p2 = document.querySelector("#menu1 ul"); if (!p2) {p1.style.paddingTop = 0}).
Problém - veškerý kód onoho externího souboru se načte na všech stránkách, i na těch, pro které určité úryvky kódu nejsou určené, takže se pak v konzoli objevují chybová hlášení typu TypeError: p2 is null, což někdy nevadí, ale při určitém pořadí zápisu v externím souboru to může znefunkčnit jiné podobné úryvky kódu.
Řešení - ?; kdyby byl web sestaven ze statických stránek, takové drobné úryvky kódu by se vložily někam do příslušné stránky, ale co dělat, když všechny stránky jsou založené na nějaké (PHP) šabloně?; jde přesto spolu s funkcemi do jednoho externího souboru dát nějaké takové drobné (do funkcí neobalené) úryvky kódu a nějak je upravit?
Radek9
Profil
hypot:
takže se pak v konzoli objevují chybová hlášení typu TypeError: p2 is null
No a co to asi znamená? :-) Že se snažíš s proměnnou, ve které je null, pracovat jako s objektem. Což logicky nejde. Takže musíš ověřovat, že v té proměnné nějaký objekt je, než s ní začneš pracovat. Úplně jednoduše takto:

var p1 = document.querySelector('nějaký selektor');

if (p1) { // pokud v p1 něco je
  // něco udělej
}

Jinak bych ale trochu doporučil tvůj způsob přehodnotit. Proč nemůžeš mít jeden soubor se společnou funkcionalitou (knihovny atp.) a potom soubor pro každou podstránku (nebo pro různé skupiny podstránek)?
hypot
Profil
Radek9:
Proč nemůžeš mít jeden soubor se společnou funkcionalitou (knihovny atp.) a potom soubor pro každou podstránku (nebo pro různé skupiny podstránek)?
Jak jsem psal v otázce, všechny stránky jsou založené na jedné šabloně (v redakčním systému) a já potřebuju kód jen pro potřeby jedné konkrétní (pod)stránky. Všechny (pod)stránky mají vše, co je jim společné, definováno v samostatných souborech, které určují například záhlaví stránky, zápatí, boční panel atd. a samostatný soubor je pak určen pro samotný obsah (uživatelům určený) specifický pro danou podstránku. Když potřebuju dva-tři řádky Javascriptu jen pro konkrétní podstránku, musel bych ten kód vložit přímo do souboru, v němž je specifický obsah dané podstránky, aby se vyhovělo tomu, že jiné podstránky založené na téže šabloně s ním nepřijdou do styku, jenže to nejde, neboť soubor se samotným jedinečným obsahem podstránky je editovatelný WYSIWYG editorem a kdokoli by tak editací obsahu stránky dotyčný javascriptový kód mohl nechtěně smazat. Takže jediný bezpečný způsob je dle mého vložit odkaz na externí soubor s Javascriptem do toho souboru šablony, s nimž se uživatel editující obsah (pod)stránky vůbec nesetká.
Radekí
Takže musíš ověřovat, že v té proměnné nějaký objekt je, než s ní začneš pracovat.
Tímto směrem jsem uvažoval, ale až teď jsem si uvědomil, ve kterém okamžiku vlastně dojde k oznámení chyby. Právě takové řešení jsem hledal, děkuju tedy za nasměrování žádoucím směrem. I tak by mě nicméně zajímala odpověď na výše uvedené ohledně umístění javascriptového kódu specifického pro určitou (pod)stránku v prostředí stránek založených na společné šabloně.
Radek9
Profil
hypot:
umístění javascriptového kódu specifického pro určitou (pod)stránku v prostředí stránek založených na společné šabloně
Pokud ho tedy nemůžeš vložit přímo do konkrétní podstránky, zbyde ti nejspíš jen nějakým způsobem ověřovat URL adresu, nebo využít tu šablonu, která by do JS proměnné uložila např. kód té podstránky.

V případě adresy tě bude nejspíš zajímat window.location.pathname a příp. i window.location.search:
if (/^\/kus-url-adresy\//.test(window.location.pathname)) { // použitím regexu
  // tady se vykoná kód pro adresy, které začínají /kus-url-adresy/
}

if (window.location.pathname === '/presna-shoda/') {
  // tady se vykoná kód pro přesně danou stránku
}

V případě šablonovacího systému (nevím, jaký používáš, zkusím to univerzálně) bych na to šel nějak takto:
<div class="page">
  <h1>{title}</h1>
  
  <div class="content">
    {content}
  </div>
</div>

<script>
var PAGE_CODE = '{code}'; // Tohle může být například název stránky, který se zobrazí v url (např. něco ve stylu nazev-stranky), ID (číselné) apod.
</script>

Ve tvém JS kódu bys potom ověřoval existenci a obsah proměnné PAGE_CODE:
if (typeof PAGE_CODE !== 'undefined' && PAGE_CODE === 'moje-skvela-stranka') {
  // tady se provede kód pro stránku moje-skvela-stranka
}

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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