Autor Zpráva
Chamurappi
Profil
Moderátor Str4wberry: Zkopírováno z vlákna pridávanie záznamov.

Doporučuji používat místo setAttribute a getAttribute standardní vlastnosti HTML DOMu, jsou spolehlivější.
Str4wberry
Profil
Vysvětli bys prosím, Chamurappi, čím jsou standardní vlastnosti HTML DOMu spolehlivější?
Chamurappi
Profil
Reaguji na Str4wberryho:
cokoliv.setAttribute("class", "třída") — selže v Exploreru.
cokoliv.setAttribute("onclick", "alert('Hurá!')") — selže v Exploreru.
cokoliv.setAttribute("style", "color: red") — selže v Exploreru.
input.setAttribute("value", "hodnota") a input.getAttribute("value") — selže částečně v Mozille, tluče se s vlastností „value“ (v input.value může být něco jiného než v atributu).
input.getAttribute("type") — selže v Mozille i Opeře při neuvedeném atributu type.
checkbox.setAttribute("checked", "") — selže v Opeře.
checkbox.setAttribute("checked", false) — uspěje v Exploreru (nemělo by).
input.setAttribute("name", "novéJméno") — selže částečně v Exploreru, neaktualizuje se struktura <form>u, takže pořád existuje formulář.původníJméno.
odkaz.getAttribute("href") — vrací v Exploreru absolutní URI a v ostatních prohlížečích přesně to, co je v atributu href.

Na ostatní problematické situace jsem buď nenarazil, nebo jsem si na ně teď nevzpomněl.
Standardní vlastnosti HTML DOMu budou asi také nepatrně rychlejší.
hal_sk
Profil
Chamurappi
Taký blbý dotaz. Tie standardní vlastnosti HTML DOMu je napríklad čo.
Chamurappi
Profil
Reaguji na hal_sk:
cokoliv.className = "třída"
cokoliv.onclick = function() { alert("Hurá") }
cokoliv.style.color = "red"
input.value = "hodnota"
proměnná = input.type
checkbox.checked = false
input.name = "novéJméno"  // tohle také částečně selže v Exploreru :-) … nemá rád žádné přejmenovávání.
proměnná = odkaz.href
imploder
Profil
• input.name = "novéJméno" // tohle také částečně selže v Exploreru :-) … nemá rád žádné přejmenovávání.
Takže to potom asi nezbývá než javascriptem měnit celý kód prvku, přes atribut innerHTML nějakého obalového (třeba <span>u s id).
Chamurappi
Profil
Ještě jsem si všimnul:
checkbox.getAttribute("checked") — selže v Mozille i Opeře, vrací při HTML kódu „<input type="checkbox" checked>“ prázdný řetězec, přestože hodnota toho atributu je „checked“.


Reaguji na implodera:
Naštěstí není přejmenovávání <input>ů tak často potřeba a ten, kdo je přejmenovává, už na ně asi stejně někde má reference.
Mimochodem, vlastnost innerHTML není atribut, zejména v tomto vlákně si lze dobře uvědomit rozdíl mezi vlastnostmi a atributy.
peta
Profil
Tak, name se da zmenit pres inner/outher HTML, kdyby na tom zalezelo, ale tez si myslim, ze se to nepouziva. Spis se pres vnejsi prvek, pres innerHTML prepise cely obsah, napriklad pro propojene selecty.
anonymní
Profil *
houby, name stejně jako usemap, normálně přes setAttribute, stačí jedno písmeno uppercase a funguje všude. setAttribute('Name','něco');setAttribute('useMap','#xxx')
Chamurappi
Profil
Reaguji na anonymního:
Ukázku bys neměl? Ve jménech atributů nezáleží na velikosti písmen, takže pochybuji, že to jedno velké písmeno bude mít vliv.
anonymní
Profil *
nemůžu najít konkrétní ukázky na to co jsem sem posílal, ale něco je tu http://www.quirksmode.org/bugreports/archives/2005/07/Setting_accesskey_attribute_using_setAttribute_is_.html
Chamurappi
Profil
Reaguji na anonymního:
Odkázaná stránka hovoří o tom, že název atributu by se měl ve velikosti písmen shodovat s názvem vlastnosti DOMu (což je dáno tím, že Explorer trochu míchá atributy a vlastnosti — proto ostatně nefunguje setAttribute("class", "něco") atd.). Ale tady byla řeč o atributu „name“ a u něj se ekvivalentní vlastnost DOMu jmenuje také „name“, takže se ho uvedená chyba nijak netýká. Příště si ty „houby“ odpusť, pokud je nedokážeš obhájit.

Navíc jsem ani nepsal, že „name“ nejde změnit, psal jsem, že v Exploreru má změna skrytá úskalí.
Leo
Profil
Moderátor Chamurappi: Přesunuto z DOM - ziskanie podriadeneho prvku na Leovu žádost.

Ještě jeden rozdíl mezi

objectelementu.setAttribute("onclick","alert('ok')")

a

objectelementu.onclick = function(){alert('ok')}

Pokud pak čtete kód stránky nebo její části přes innerHTML, pak v 1. případě tam onclick bude, v 2. případě ne (zkoušel jsem jen letmo v IE6, 7 a FF3). Leo
Chamurappi
Profil
Reaguji na Lea:
pak v 1. případě tam onclick bude, v 2. případě ne
Ale v prvním případě nebude v Explorerech reagovat na událost, ne? To je docela smrtící nevýhoda podporující druhý případ.
Leo
Profil
Chamurappi:

"Ale v prvním případě nebude v Explorerech reagovat na událost, ne?"

Nemusi to být tak smrtelné, pokud vaším cílem je ten innerHTML (v JS editoru kódu chci do elementu přidat ovladač události jako html atribut). Ten innerHTML se pak uloží a na stránky načítá přes php, pak to samozřejmě běží. Chtěl jsme jen připomenout, že i setAttribute("onudálost",...) může být užitečná. Tohle onclickem jakožto vlastností v JS neudělám.
Davex
Profil
Leo:
Neměla by se raději pro registraci zpracování událostí používat metoda addEventListener() nebo attachEvent() pro IE? Má tato varianta nějaké nevýhody (kromě nefunkčnosti ve starších IE)?

Kdybych chtěl zpracovat událost více funkcemi, tak se mi nebudou navzájem přepisovat a nezbude jen ta poslední. Typická je situace, když se více různých skriptů snaží zinicializovat při dokončení nahrání stránky.
Leo
Profil
Davex:

Vidim, ze jsem ještě pořád nepochopen. Pokud máte div, v něm třeba odkaz a chcete JavaScriptem tomu odkazu přiřadit onclick jakožto atribut html, pak použijete setAttribute. Má to smysl (jen) tehdy, pokud pak obsah toho divu čtu přes innerHTML, ukladám do db, atd. Leo
Chamurappi
Profil
Reaguji na Davexe:
Má tato varianta nějaké nevýhody (kromě nefunkčnosti ve starších IE)?
Je to zbytečně upovídané a myslím, že nemáš úplně jisté pořadí, v jakém se budou funkce vykonávat. V Explorerově attachEventu navíc nesedí this.

Kdybych chtěl zpracovat událost více funkcemi, tak se mi nebudou navzájem přepisovat
To jde snadno vyřešit. Navíc to může být záměr. Naopak pokud přiřazuješ události přes addEventListener a potřebuješ nějakou odebrat, musíš mít uschovanou referenci na ni. Je pravda, že odebírání funkcí není moc častá akce, ale přidávání vícero funkcí také využiješ jen výjimečně.

když se více různých skriptů snaží zinicializovat při dokončení nahrání stránky
Většinou se mohou zavolat normálně z patičky. Lidi dávají skripty do <head> jen ze zvyku a pak se zbytečně složitě pachtí s tím, aby se něco stalo po načtení patičky.
Jan Tvrdík
Profil
Týká se tohle i removeAttribute?
Darker
Profil
Nastavit vlastnost wrap pro textarea se vám bez funkce setAtribute nepodaří.
Kajman
Profil
S atributem for u tagu label bude práce bez těchto funkcí asi také složitá.
Chamurappi
Profil
Reaguji na Kajmana:
Ani ne, label.htmlFor.


Reaguji na Jana Tvrdíka:
Metoda removeAttribute se ve vzáchných případech hodit může. Atributy vyjadřující řetězce nejdou bez ní úplně vymazat.
Joker
Profil
Možná bude potřeba tu informaci aktualizovat: Ve standardním režimu IE9 přístup přes DOM funguje pouze pro předdefinované atributy daného prvku. Pro rozšiřující uživatelem definované atributy nefunguje. Zdroj.

Příklad:
HTML
<input type="text" id="priklad" mujAtribut="moje hodnota">
JS
var element = document.getElementById("priklad");
/* V IE9 ve standardním režimu:
element.id: "priklad"
element.type: "text"
element.mujAtribut: undefined
element.getAttribute("mujAtribut"): "moje hodnota"
*/
Chamurappi
Profil
Reaguji na Jokera:
To se změnilo oproti starším verzím Exploreru. V ostatních prohlížečích jsou neznámé atributy od vlastností oddělené odjakživa, takže u nich je getAttribute jedinou možností.
Str4wberry
Profil
Je otázka, zda můžeme element.mujAtribut zařadit mezi „standardní vlastnosti HTML DOMu“. :–)
Joker
Profil
Chamurappi:
Aha, no zrovna kód kde jsem na to narazil se jiných prohlížečů netýkal :)
Bylo by asi dobré to napsat i do poučných debat, takhle asi málokoho napadne, že pro nestandardní atributy musí používat jiný přístup.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0