Autor Zpráva
Darker
Profil
var zlomky=new Array();
zlomky=document.getElementsByClassName("zlomek");


Napadá někoho proč mi IE vyhazuje Chyba: Objekt tuto vlastnost nebo metodu nepodporuje.?
Ve firefoxu vše v pořádku.
Chamurappi
Profil
Reaguji na darkera:
Protože objekt tuto metodu nepodporuje. Co je na té hlášce nejasného?
Nemůžeš efektivně vybírat elementy podle třídy, najdi si jiný společný znak. K čemu to potřebuješ?

Proč přiřazuješ do zlomky nové pole, když ho stejně chceš vzápětí nahradit kolekcí elementů? (Která není pole, přestože ho připomíná.)
Darker
Profil
Dobře, asi jsem zapoměl dodat, že bych docela potřeboval vědět, co udělat, aby to chodilo...
Chamurappi
Profil
Reaguji na darkera:
Doprogramovat si vlastní metodu s názvem document.getElementsByClassName. Nebo si najít na webu nějakou hotovou.
K čemu to potřebuješ?
Suta
Profil
Třeba ti pomůže moje.

function getElementsByClassName(className,parentElement) {
    var elements = [];
    var parentElement = parentElement || document.getElementsByTagName("html")[0];
    var nodes = parentElement.getElementsByTagName('*');

    for (var i = 0, child; child = nodes[i]; i++) {
      if (child.className && hasClassName(child,className)) {
        elements.push(child);
      }
    }
  return elements;
}

function hasClassName(element,className) {
	return element.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"));
}


parentElement nemusíš uvádět, pokud ale víš, že hledáš pouze elementy s danými třídami, které se nacházeji uvnitř určitého prvku, můžeš výběr zúžit.
Chamurappi
Profil
Reaguji na Sutu:
Pěkně napsaná funkce. Ale stejně je lepší se nedostat do situace, kdy je potřebná.

document.getElementsByTagName("body")[0]
Proč ne prostě document.body?
Nebylo by lepší použít jako výchozího rodiče přímo document? I elementy <body> a <html> mohou mít třídu.

new RegExp("(^|\\s)" + className + "(\\s|$)")
Pro běžné použití to stačí, ale není to úplně universální — u exotičtějších názvů hledaných tříd by takové hledání mohlo selhat. Ono totiž neexistuje (prakticky, ani teoreticky) žádné omezení pro znaky použitelné v názvech tříd. V třídě tedy můžou být i všelijaké závorky, pomlčky, zpětná lomítka…
Kcko
Profil
darker:
Pouzij framework, napriklad jQuery

pak to co chces ziskas velmi snadno

$("element.trida")
Suta
Profil
Reaguji na Chamurappiho:

Naprosto souhlasím.

Proč ne prostě document.body?
Já osobně ve funkci používám

var parentElement = parentElement || body;


, kde odkaz na tag <body> ukladam po nacteni stranky. Pro forum jsem použil document.getElementsByTagName("body")[0] z toho důvodu, že u document.body nemám ověřenu kompatibilitu ve všech prohlížečích. Nicméně díky za postřeh ohledně <body>, asi mi dříve nechybělo, že funkce neprocházela také tento element. Otestoval jsem funkci s parentElement = getEl...("html")[0] a žádný prohlížeč s tím nemá problém. (edit: v mém prvním příspěvku nyní změněno <body> na <html>)

Pro běžné použití to stačí...

Z toho jsem vycházel. Osobně kvůli prevenci nepoužívám exotické názvy, tak si s tímto výrazem bohatě vystačím. Na druhou stranu ano, máš pravdu, výraz není nejuniverzálnější.
Chamurappi
Profil
Reaguji na Sutu:
u document.body nemám ověřenu kompatibilitu ve všech prohlížečích
Tuším, že je neznatelně lepší než u metody getElementsByTagName.

Nicméně díky za postřeh ohledně <body>
… a <html>. To ani nyní upravený skript nenajde. Proto jsem říkal, že by jako výchozí rodič byl ideální document, tedy objekt zastřešující celý DOM.

nepoužívám exotické názvy, tak si s tímto výrazem bohatě vystačím
Ještě by ho šlo optimalizovat, aby třetí argument určoval jména hledaných elementů (většinou člověk ví, že hledá třeba jen <div>y, není tedy nutné kontrolovat všechny elementy).
Suta
Profil
Díky za postřehy, ve všem máš pravdu.
Darker
Profil
Dík za odpovědi, včera jsem to už doma rozlouskl. Vymyslej jsem si podobnou funkci jako mi ukázal Sutu.
Vypadá asi takto, ale vypíšu jen skript, funkci mám doma a nechce se mi ji psát znovu.
if(document.getElementById &&! document.all) {
 zlomek=document.getElementsByClassName("zlomek")
} else {
 dataforgetelement=document.all;
 for(i=0;i<dataforgetelement.length;i++) {
  if(dataforgetelement[i].className=="hledanatrida") {zlomek[zlomek.length]=dataforgetelement[i];}
 }
};

volám jí pak : neco=vyplivniclasy("klasa")
Na co jsem to chtěl ukážu až budu doma, rád se pochlubím.
Chamurappi
Profil
Reaguji na darkera:
if(document.getElementById &&! document.all)
Co to je za podmínku? Proč document.all? Proč prostě netestuješ, jestli prohlížeč podporuje document.getElementsByClassName?

zlomek[zlomek.length]=dataforgetelement[i]
Proč ne zlomek.push(dataforgetelement[i])?
Yur4Y
Profil
Nebolo by dobré pridať ešte kontrolu, či prehliadač nepodporuje document.querySelectorAll? To by zahŕňalo síce iba IE8, ale predišlo by sa zbytočnému prechádzaniu všetkými elementami. Pre IE6 a 7 by sa použil doterajší spôsob.
Darker
Profil
Yur4Y:
pridať ešte kontrolu
Moc práce :)
Když mi napíšeš jak tuhle funkci upravit tak, jak to navrhuješ (jak upravit podmínku) tak ti budu vděčný. Ale jinak to asi ykoumat nebudu, funkce se stejně používá jen jednou, ne v cyklech.
kód funkce zde.
Příklad zde.
Už jsem doma takže jsou tu slíbené odkazy.
Další využití zde:http://jmareda.sweb.cz//rovnice.html

Chamurappi:
Proč document.all
Ani nevím. Nenapadlo mě to. Máš pravdu, asi to opravím. Ale bude nutné testovat i document.all. To taky neberou všechny
Witiko
Profil
Darker:
To taky neberou všechny

Rozhodně jich to bere méně, než metodu document.getElementById se kterou si vystačíš a document.all (nevalidní, obsolete zápis) můžeš zcela vypustit. Prakticky se dá říct, že se ti nestane, že by prohlížeč podporující document.all nepodporoval document.getElementById. Jen je třeba dát si pozor na to, že jde o volání funkce, je dobré vyhnout se několikanásobnému volání, když to není nutné.

darker:
Na co jsem to chtěl ukážu až budu doma, rád se pochlubím.
Chlouba by měla být opodstatněná. Kromě toho, že http://jmareda.sweb.cz//rovnice.html po stránce funkční nic nedělá kromě vytvoření input elementu, samotný kód je poměrně spatlaný.

zlomek = document.getElementsByClassName("zlomek") - pokud nemáš zlomek definovaný jako globální proměnnou mimo funkci, vzniká ti zde nedefinovaná globální proměnná.
dataforgetelement = document.all; - to samé.
if(this.value.length>20) - na onkeyup eventu input elementu - velmi nepřesné, šířka fontu se liší, po 20ti znacích už uživatel může být dávno "přes" a zvětšování input pole poté jen mate.
//kompitabilita - opomenu-li češtinářskou syntaktickou chybu :) tak je zde několik zcela zbytečných volání funkcí, ptám se proč, když vše jde vyřešit jednou podmínkou, která otestuje existenci daných atributů.
2* <script> tag. Proč nemůže být vše definované v jednom tagu mi není jasné, navíc má script atribut type.

var zlomek=new Array()
zlomek=getElementsByClassName("zlomek")


Nechápu. Nejprve vytvoříš novou instanci objektu Array, ihned poté referenci na instanci vyměníš za odkaz na element, důvod existence prvního řádku mi uchází.

function novarovnice() {
vstupni=document.getElementById("vstupnipole");  /*  Nedefinovaná globální proměnná */
polerovnice=document.getElementById("rovnice");  /*  Nedefinovaná globální proměnná */
panelnastroju=document.getElementById("tools");  /*  Nedefinovaná globální proměnná */


hledanivtextu.js

poradikonce="nezjisteno";  /*  Nedefinovaná globální proměnná */
delkaslova="nezjisteno";  /*  Nedefinovaná globální proměnná */
silent=false;  /*  Nedefinovaná globální proměnná */
nahradit=false;  /*  Nedefinovaná globální proměnná */
repeatreplacing=true;  /*  Nedefinovaná globální proměnná */
nahraditvse=false;  /*  Nedefinovaná globální proměnná */
function spusteno() {
if(document.getElementById("casesensitive").checked) {slova=document.getElementById(poletextu).value;  /*  Nedefinovaná globální proměnná */hledam=document.getElementById("hledanytext").value;   /*  Nedefinovaná globální proměnná */}
else {slova=document.getElementById(poletextu).value.toLowerCase();hledam=document.getElementById("hledanytext").value.toLowerCase()}
 if(slova.indexOf(hledam)!=-1) {
  while(repeatreplacing) {
   var polepismenka=slova.split("");
   var hledane=hledam.split("");
   var nezmenenytext=document.getElementById(poletextu).value.split("");  /*  Nedefinovaná globální proměnná */
   n=0;  /*  Nedefinovaná globální proměnná */
   starti="baf";  /*  Nedefinovaná globální proměnná */
   for(i=0;i<=polepismenka.length;i++){
    if(polepismenka[i]==hledane[n]) {
     n++;
     if(starti=="baf") {starti=i};
     if(n==hledane.length){poradikonce=1*i+1*1;delkaslova=n;i=polepismenka.length}}
    else {n=0}
    }
   if(!nahradit) {alert("Slovo začíná "+starti+" písmen od začátku\n"+"Slovo končí "+poradikonce+" písmen od začátku\n"+"Slovo má "+delkaslova+" písmen\n")}
   if(nahradit) {
    prvnipulka="";  /*  Nedefinovaná globální proměnná */
    druhapulka="";  /*  Nedefinovaná globální proměnná */
    for (i=0;i<starti;i++) {prvnipulka=prvnipulka+nezmenenytext[i];};
    for (i=poradikonce;i<nezmenenytext.length;i++) {druhapulka=druhapulka+nezmenenytext[i];}
    document.getElementById(poletextu).value=prvnipulka+document.getElementById("replace").value+druhapulka
   }
   if(document.getElementById("casesensitive").checked) {slova=document.getElementById(poletextu).value;hledam=document.getElementById("hledanytext").value}
   else {slova=document.getElementById(poletextu).value.toLowerCase();hledam=document.getElementById("hledanytext").value.toLowerCase()}
   
   if(nahraditvse&&slova.indexOf(hledam)!=-1) {repeatreplacing=true;}
   else {repeatreplacing=false;nahraditvse=false}

  }
 }
else{if(!silent) {alert("Nic nenalezeno")}}
silent=false;
repeatreplacing=true;
}


menu.js

/* Slyšel jsem o takové věci, které se říká css třídy
Definice css stylů přes javascript, které se kodér snaží vyhnout, je-li to možné. */

function najel(polickonajeti) {document.getElementById(polickonajeti).style.border='1px outset #d4d0c8'};
function sjel(polickonajeti) {document.getElementById(polickonajeti).style.border='none'};
function stisk(polickonajeti) {document.getElementById(polickonajeti).style.border='1px inset #d4d0c8'}
function najel2(polickonajeti) {document.getElementById(polickonajeti).style.background='darkblue';document.getElementById(polickonajeti).style.color='white'};
function sjel2(polickonajeti) {document.getElementById(polickonajeti).style.background='#d4d0c8';document.getElementById(polickonajeti).style.color='black'};


okna.js

var okna=new Array();
var aktualniokno;
function zesediveni(newwindow) {
if(aktualniokno!=newwindow) {
aktualniokno=newwindow;
pridej=true  /*  Nedefinovaná globální proměnná */
for (i=0;  /*  Nedefinovaná globální proměnná */ i<okna.length;i++) {
if(newwindow==okna[i]) {pridej=false;i=okna.length}
}
...


Protože viditelně naprosto netušíš jak se proměnné definují nemluvě o rozdílech mezi proměnnou lokální a globální, odkazuji na tuto diskuzi:
http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=110622&page=-1#12
Darker
Profil
Wow, ty se ale umíš rozohnit. Skript menu.js je starý, a je tam omylem. Až ho budu potřebovat, předělám ho.
Skript na hledání v textu je taky omylem, mám ty skripty jako součást šablony a nemažu je.
A ve skriptu na hledání textu jsi označil několik globálních proměnných jako nedefinovaných, což je nezmysl, protože fungují.
Kompatibilitu klidně smažu, také součást šablony.
Chyby opravuju postupně, a to na cos mě odkázal už znám, ale, jak říkám, staré skripty ještě nejsou opravené.

A jen tak pod okraj, určitě byl den, kdy by ses s tím, co jsem vytvořil já, taky chlubil.
_es
Profil
Darker:
A ve skriptu na hledání textu jsi označil několik globálních proměnných jako nedefinovaných, což je nezmysl, protože fungují.
On predsa nikde nenapísal, že by to fungovať nemalo.
Len je beh kódu horšie optimalizovateľný a pri istých situáciách môžu nastať ťažko odhaliteľné chyby.
Darker
Profil
Tak to jo. Opravím to.
Ale s problémem to nesouvisí.
Witiko
Profil
Darker:
Wow, ty se ale umíš rozohnit.

Já jsem naprosto v klidu. Píšeš na diskuzní fórum, můžeš očekávat zpětnou vazbu. :)

A ve skriptu na hledání textu jsi označil několik globálních proměnných jako nedefinovaných, což je nezmysl, protože fungují.

U globálních proměnných nedefinice nevadí, jen to o programátorovi cosi vypovídá, u lokálních proměnných už je to větší průšvih, protože jsou dostupné i mimo funkce a mohou takto kolidovat s jinými globálními proměnnými.

/* Definice globální proměnné */
/* Fuj: */

function funkce() {
 ...
 foo = 2;
}

/* Ok: */

var foo;

function funkce() {
 ...
 foo = 2;
}

/* Definice lokální proměnné */
/* Netvoří se lokální, ale globální proměnná: */

function funkce() {
 ...
 foo = 2;
}

/* ok: */

function funkce() {
 ...
 var foo = 2;
}



Kompatibilitu klidně smažu, také součást šablony.

Kompitabilitu nemaž, přepiš.

var winH=0;
var winW=0;
if (parseInt(navigator.appVersion)>3) {
	if (navigator.appName=="Netscape") {
	winW = window.innerWidth;
	winH = window.innerHeight;
	}
	if ((navigator.appName.indexOf("Microsoft")!=-1) || (navigator.appName.indexOf("Opera")!=-1)) {
	winW = document.body.offsetWidth;
	winH = document.body.offsetHeight;
	}
}

--> nějak takto -->

var winW = innerWidth?innerWidth:document.body.offsetWidth;
var winH = innerHeight?innerHeight:document.body.offsetHeight;
_es
Profil
Witiko:
var winW = innerWidth?innerWidth:document.body.offsetWidth;
To asi nebude správny postup.
Ak innerWidth nebude existovať, nastane chyba skriptu a bude ukončený.
"Správne" by to malo byť nejako takto:
var winW = window.innerWidth || document.body.offsetWidth;
Tu nehrozí, že by mala prvá z tých vlastností nulovú alebo false hodnotu.
No pri iných takýchto nápravách nekompatibilít, kde to môže nastať, to musí byť o trochu zložitejšie.
Witiko
Profil
_es:
"Správne" by to malo byť nejako takto

Smím se zeptat proč? Pokud bude jeden ze zadaných atributů neexistující, dojde k výjimce při obou zápisech.

Oba vyhodí výjimku:
javascript:NOT_EXISTANT?NOT_EXISTANT:1;
javascript:NOT_EXISTANT || 1;


Žádný nevyhodí výjimku:
javascript:1?1:NOT_EXISTANT;
javascript:1 || NOT_EXISTANT;


Zajímá mě rozdíl. Jinak bych asi použil:

javascript:typeof NOT_EXISTANT == "undefined"?1:NOT_EXISTANT;
_es
Profil
Witiko:
Pokud bude jeden ze zadaných atributů neexistující, dojde k výjimce při obou zápisech.
Nie, vyskúšaj si tieto JS odkazy:
javascript:alert(abcd);
javascript:alert(window.abcd);
Teoreticky, pre všeobecný JS, je asi ešte správnejšie použiť namiesto objektu window objekt this.
"Najekonomickejší" je, aj pre zarátanie nulovej hodnoty, asi tento príkaz:
var winW = window.innerWidth !== void 0 ? window.innerWidth : document.body.offsetWidth;
prípadne nejaké zachytávanie chýb - výnimiek.
Darker
Profil
Je moc hezké že řešíte tuhle část html kódu, ale je to bohužel k ničemu, jelikož mi jí tam cpe seznam, spolu s reklamou. Já už mám kompatibilitu ulořenou v proměnné nn6 a ie.
Ale klidně pokračujte, je to zajímavé a poučné.
Chtěl bych se zeptat co je to void 0 v posledním zápisu, a co to dělá. Zatím znám void jen z bookmarkletů.
A NOT_EXISTANT je podmínka? Jako že když neco není, vrátí to true?
A klidně pokračujte :)))
Witiko
Profil
Darker:

void(0);

<a href="javascript: void(0)">I am a useless link</a>
<a href="javascript:var myNum; void(myNum=10);alert('myNum = '+myNum);">I'm a less useless link.</a>


To samé co znáš z bookmarkletů, operátor zajišťující návratovou hodnotu null. NOT_EXISTANT je název neexistující proměnné (jak sám název napovídá)
_es
Profil
Darker:
A klidně pokračujte :)))
Je to debata, ktorá sa ťa skoro netýka, len sa nachádza v téme, čo si založil.
Ak sa ti to nepáči, môžeš sa sťažovať.

co je to void 0 v posledním zápisu, a co to dělá
Je to to isté, ako void(0) alebo void(1) alebo void 8.
Nerobí to nič iné, len vracia JavaScriptovú hodnotu undefined.
Je to len použitie operátora void.
_es
Profil
Witiko:
operátor zajišťující návratovou hodnotu null
Asi by si si to mal lepšie pozrieť, aby si iných omylom neuvádzal do omylu.
Vyskúšaj si tento JS odkaz:
javascript:var x; alert(void(0)===undefined); alert(void(0)===x); alert(void(0)===null); alert(x===null);
Witiko
Profil
I see!

void 0 != null && void 0 !== null
void 0 == undefined && void 0 === undefined
undefined == null && undefined !== null

Pak ale:
var winW = window.innerWidth !== undefined ? window.innerWidth : document.body.offsetWidth;

je ekvivalentem k

var winW = window.innerWidth !== void 0 ? window.innerWidth : document.body.offsetWidth;
_es
Profil
Witiko:
Nerozumiem, čo si tým posledným posledným príspevkom myslel.
Operátor void nemá nič spoločné s hodnotou null.
Tie posledné dva kódy nie sú celkom ekvivalentné, undefined je len obyčajná premenná s hodnotou undefined, takže môže byť predtým prepísaná na inú hodnotu, void 0 dá vždy ten istý výsledok.
Darker
Profil
_es:
môžeš sa sťažovať.
Ale já si nechci stěžovat. Nehledej ironii, tak kde je prostý smysl pro humor.

Witiko:
NOT_EXISTANT je název neexistující proměnné
A k čemu je to dobré? A navíc, proměnných které neexistují je mnoho (měl jsem chuť říct nekonečně, ale tady všichni všechno berou tak doslova, že jsem si to rozmyslel), takže to může být název libovolné z nich.
Jan Turoň
Profil *
Zprovoznění getElementsByClassName() ve všech prohlížeších:
if(document) if(!document.getElementsByClassName)
document.getElementsByClassName = function(cl) {
  var retnode = [];
  var myclass = new RegExp('\\b'+cl+'\\b');
  var elem = document.getElementsByTagName('*');
  for(var i=0; i<elem.length; i++) {
    var classes = elem[i].className;
    if(myclass.test(classes)) retnode.push(elem[i]);
  }
  return retnode;
}

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