Autor Zpráva
Nicolas
Profil *
Jak zpravit object prototyp v IE. Potřebuji udělat funkci třeba getElementByClass a bude to vypadat třeba takto.

Object.prototype.getElementByClass

kde funkce by pak byla tak

document.getElementById("main").getElementByClass("button")

v Mozzile mi to funguje ale v IE to nejde. Když jsem hledal na internetu tak jsem nic funkčího nenašel.

Moderátor Chamurappi: Titulek „Object prototype IE“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
_es
Profil
Nicolas:
v Mozzile mi to funguje ale v IE to nejde.
Asi preto, že IE, nejaká verzia, nepíšeš aká, nepodporuje metódu getElementByClass. Aký prehliadač ju vlastne podporuje? Nemyslel si metódu getElementsByClassName?

kde funkce by pak byla tak
Aká funkcia? Kde tam máš nejakú funkciu?
Nicolas
Profil *
neextistuje, tu si vytvořim, to je jen přiklad..

Object.prototype.test = function(value){
  this.style.display = value;
};

main = document.getElementById("main");
main.test();


To funguje, ale IE nepodporuje Object prototype, proto se ptám jak to zpravit.
Yur4Y
Profil
Podporuje, akurát HTML elementy nededia z Objectu. Napíš to ako klasickú funkciu s tým, že element, v ktorom sa má vyhľadávať, posunieš ako argument funkcie.
Nicolas
Profil *
jo to mě taky napadlo. Ale tenhle zápis je mnohem přehlednější. A určitě to nějak zpravit jde neboď to JQuery třeba tak využivá.
Chamurappi
Profil
Reaguji na Nicolase:
neboď to JQuery třeba tak využivá
Nevyužívá. Vyrábí kolem elementu (či elementů) vlastní obalující objekt a ten má teprve vlastní metody.
Viz Propašování nové funkce k prototypu libovolného elementu.

Rozšiřování prototypu Objectu je mimochodem docela nebezpečné, doplňovaná metoda se objeví ve všech for..in smyčkách a některé s tím nemusejí počítat.
Nicolas
Profil *
diky, tak hold zustanu o klasického zápisu.
Nicolas
Profil *
Tak maly dotaz, co si myslíte o tomto zapisu?

Array.prototype.mouseover = function(func){
  for(i=0;i<this.length;i++){
    this[i].onmouseover = function(){
      func.apply(this);
    }
  }
}

onload = function(){ 
  getElementByClass('button').mouseover(function(){
    alert("Test"); 
  });
};


kde getElementByClass('button') je pole elementu.
Chamurappi
Profil
Reaguji na Nicolase:
Připadá mi nesmyslný, protože metoda mouseover se hodí jen na specifické množině polí. Není důvod mít ji na všech.
Nicolas
Profil *
však, getElementByClass('button') vrací jen elementy s třídou button které to po onmouseover maji vykonat, jelikož mi metoda getElementByClass vrací pole elementu které maji hodnotu třídy button tak to musím vyvolat na jednotlivých elementech nebo to jde i jinak?

ma to dělat to že po najetí na div s názvém třídy button to změní pozadí div, a těch button je víc samozřejmě.

a timto zápisem to nejde

getElementByClass('button').onmouseover = function(){
  ...
};


jedině takto

getElementByClass('button')[0].onmouseover = function(){
  ...
};

ale to funguje samozřejmě pouze na prvnim buttonu

jak si to myslel ty?
Nicolas
Profil *
dejmetomu že mám
<div class="button"></div>
<div class="button"></div>
<div class="button"></div>


a potřebuji na jednotlivych buttonech po najeti myši změnit pozadi a nechci to dávát přimo to tágu.
Chamurappi
Profil
Reaguji na Nicolase:
jak si to myslel ty?
Že dávat na všechna pole metodu, která se hodí jen na jednom specifickém druhu polí, je nesmysl. Pochopil jsem, o co ti jde, ale je to čuňárna. Už i ten kód v [#1] byl.

Pokud potřebuješ něco udělat s prvky pole, projeď pole cyklem a udělej to.
Pokud potřebuješ vyrobit nějakou metodu na speciálním druhu pole, vyrob ji na speciálním druhu pole při jeho vzniku, ne na všech polích.
Nicolas
Profil *
Ok chtěl jsem ať je to ten kod nemusím stále vícekrat opakovat ale ok no.

Takže jestli jsem tě pochopil tak buď to projet cyklem takto:

pole = getElementByClass('button');
for(i=0;i<pole.length;i++){
  pole[i].onmouseover = function(){
    ...
  }
}


u te metody nevim jistě jak si to myslel, můžeš hodit přiklad?
Promiň že otravuji, ja jen chci ať tam nemam jak tomu říkaš nějaké čuňárny:)
Chamurappi
Profil
Reaguji na Nicolase:
ať je to ten kod nemusím stále vícekrat opakovat
Napiš si funkci.
Nebo si zkopíruj Array.prototype.forEach, to je docela obecná metoda užitečná i na jiných druzích polí.

u te metody nevim jistě jak si to myslel
Funkce getElementByClass vrací pole, ale před tím, než ho vrátí, mu může přidat novou metodu. Zjednodušeně něco na způsob:
funtion getElementByClass(něco)
{
  var výsledek = [];
  // ... naplňování výsledku
  výsledek.mouseover = function(funkce)
  {
    // tady můžeš mít smyčku, která projede všechny this[index] a nastaví jim onmouseover = funkce
  };
}
Witiko
Profil
Chamurappi:
zkopíruj
Osobně mi přijde jejich definice zbytečně zdlouhavá. Stačí podle mě něco takového:
Array.prototype.forEach = function(f, context) {
  if(!this || !(f instanceof Function)) return;
  for(var i = 0, l = this.length; i !== l; i++)
    if(i in this) f.call(context, this[i], i, this);
}
Nicolas
Profil *
Diky, všem zučastněným:)
Witiko
Profil
Chamurappi:
ne na všech polích
Tohle mi přijde jako misinterpretace. Funkce není tvořena u všech polí, jen je reference na ni uložena v objektu, jehož reference je v Array.prototype. Dopad na výkon minimální, maximálně bude třeba nahlédnout do dvou hashových tabulek (nejdříve na objektu pole, poté v prototypu) místo jedné, což je ale vyvážené faktem, že není třeba fyzicky přidávat metodu každé Array instanci, namísto toho pasivně spočívá v prototypu.

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