Autor Zpráva
Jaro
Profil *
Potřebuju, aby všechny odstavce měly třídu např. class="xyz".

Zkoušel jsem kód

var element = document.getElementsByTagName("p");
element.className += " cz";

... ale nefunguje. Samozřejmě, gůglil jsem, zkoušel i podle sebe, ale nic. Funguje jen tohle, pouze na první odstavec a nepřidává, pouze vymění třídu:

var element = document.getElementsByTagName("p")[0];
element.className = "cz";

Tak nevím. Přitom tu fintu s náhradou mám od jecas.cz, což je většinou spolehlivý zdroj...
Jaro
Profil *
EDIT: Tak to přidání, nikoli nahrazení funguje*, ovšem stále nevím, proč mi to nevybere žádné odstavce, pouze s tím [0] - což teda přiřadí třídu jen tomu prvnímu, ne všem, jak potřebuju!

*Ono to souvisí s mým předchozím zmateným dotazem "Jak změnit parentNode...". Ten nejspíš totiž nerozumí druhé třídě; když je jen jedna, JS funguje, když jsou dvě, zmate jej tam ta mezera a nechytne se - když dám do řádku:

if (node.parentNode.className=="nbsp")

před nbsp mezeru, tak funguje i když má odstavec dvě třídy.

Není v JS nějaké "nebo"? (Tj. if "nbsp" or " nbsp"?)

Samozřejmě hledám, ale zatím nenacházím...


PRO LEPŠÍ PŘEDSTVU PŘÍMO UKÁZKA!

Živá ukázka

Fakt jsem tak blbej, ale netuším v čem je na těch dvou řádkách chyba... :-/
Beavis
Profil
Jaro:
var element = document.getElementsByTagName("p");
for (i = 0; i < element.length; i++) {
  element[i].style.color= "red";
}

Živá ukázka
Jaro
Profil *
Beavis:
Díky moc, funguje!
Akorát tomu tedy vůbec nerozumím... Co je tam to "i" a co to jako dělá?
Keeehi
Profil
Jaro:
i je proměnná. For je cyklus.
Jaro
Profil *
Keeehi:
Dík za trpělivost, já se to snad nakonec naučím :-)
Firibix
Profil
Reakce na Jara:
Metoda getElementsByTagName vrací kolekci elementů a ty potřebuješ každému elementu z té kolekce nastavit nějakou třídu.

Kódem
var kolekce = document.getElementsByTagName('p');
kolekce.className = 'trida';
nastavíš vlastnost className té kolekci (balíčku, seznamu, …) elementů, což je nesmysl.

Musíš jednotlivé elementy prostřednictvím cyklu projít a nastavit className na nich:
var kolekce = document.getElementsByTagName('p');
for (var i = 0; i < kolekce.length; i++) {
    // kód níže se vykoná pro hodnoty proměnné i od nuly až do (počtu elementů v kolekci - 1)
    kolekce[i].className = 'trida'; // i-tému elementu z kolekce nastav vlastnost className (indexuje se od nuly)
}

Všimni si, že Beavis zapomněl před proměnnou i uvést klíčové slovo var, čímž vytvořil globální proměnnou. To je lepší nedělat.



nejspíš totiž nerozumí druhé třídě; když je jen jedna, JS funguje, když jsou dvě, zmate jej tam ta mezera a nechytne se
Pak v podmínce použij raději classList a metodu contains:

if (element.classList.contains('nbsp')) // projde pro class="nbsp", ale i class=" nbsp" nebo class="abc nbsp xyz"
Jaro
Profil *
Firibix:
Jo, snad se pomalu chytám. Dokonce i to kolekce[i].className = 'trida'; jsem si k tomu Beavisovu kódu domyslel sám... Takhle okomentováno to už trochu chápu.

To s tím if (element.classList.contains('nbsp')) mi nefunguje, ale to nevadí, protože já to mezitím obešel takovým sice humusáckým způsobem, ale jede.

Můžu mít ještě jeden dotaz bez zakládání speciálního vlákna? Je to totiž asi trivialita, ani nevím, jak ten "problém" nazvat...

Ten JS, který jsem modifikoval, mi vkládá nbsp entity před patřičné předložky. No a v tom "seznamu", kde jsou uvedeny, jsou i položky s tečkou a na ty se nechytá...:

walker.currentNode.nodeValue = walker.currentNode.nodeValue.replace(/ ([aiAI]|[kosuvzKOSUVZ]|leden|Leden|Bc.|BcA.|ing.|Ing.) /g, " $1\xa0");

Myslel jsem si, jestli nepomůže dát tam lomítko ing\., ale kdepak! Jinak dělá to co má. Jak to tedy napsat?
Jaro
Profil *
Ten "seznam" vypadá, že se nějak chytnul. Ovšem poznatek o lomítcích jsem využil při zadávání km/h, kde jsem skutečně musel napsat km\/h - to já jen tak, aby bylo vidět, že se taky sám snažím! :-)
Kajman
Profil
A escapoval jste ing. i Ing.? Je před i za Ing. opravdu obyčejná mezera?
Jaro
Profil *
Kajman:
To je jen příklad, jestli se ptáte "jak to má být", tak nbsp by měla být jen ZA, ne před (a zamíchal se mi tam ten "leden", tam je to opačně! Aspoň podle online nbsp raplaceru www.nedivse.cz/doplnovani-pevnych-mezer/napoveda.php.

A jak je to tedy s těmi tečkami? Neescapoval jsem je, měl bych? - A vypadá to, že to fakt funguje i tak, dle zkoušek!
Firibix
Profil
Reakce na Jara:
Tečka v regulárním výrazu značí jakýkoliv jeden znak. Tedy výraz „Bc.“ se chytí jednak pro „Bc.“ (kde tečka opravdu znamená tečku), ale i pro např. „BcX“. Správně je tedy před tečku dát zpětné lomítko, které zruší její speciální význam a výraz „Bc\.“ chytí pouze řetězec „Bc.“.
Jaro
Profil *
Firibix:
Díky, provedl jsem. Mám ještě jednu záhadu k tomu: když jsem kontroloval zkopírovnáním z výsledné stránky do wordu, tak Firefox dělá přesně co chci, Chrome a spol. jsou v tom vkládání mezer aktivnější, a dávají ji občas i tam, kde nechápu. Příklad (nbsp značím pomlčkou):

starší-IE-a-Firefox (tedy nikoli jen po "a")
...k-proklikání-zatím (tedy nikoli jen po "k")

V tom JS to mám tu řádku na nbsp nakonec takto:

 walker.currentNode.nodeValue = walker.currentNode.nodeValue.replace(/ ([aiAI]|[kosuvzKOSUVZ]|Bc\.|BcA\.|ing\.|Ing\.|Ing\. arch\.|MUDr\.|MVDr\.|MgA\.|Mgr\.|JUDr\.|PhDr\.|RNDr\.|PharmDr\.|ThLic\.|ThDr\.|Ph\.D\.|Th\.D\.|prof\.|doc\.|CSc\.|DrSc\.|PaedDr\.|Dr\.|PhMr\.|DiS\.|P\.|p\.|Pí\.|pí|Br\.|br\.|Fr\.|fr\.|R\.|r\.|sv\.|tj\.) /g, " $1\xa0");

BTW: mezi číslovkou a jednotkou dělám tenkou nezlomitelnou, zdá se mi to lepší; snad je to OK.

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:

0