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 |
#2 · Zasláno: 13. 9. 2011, 09:46:07 · Upravil/a: _es
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 * |
#3 · Zasláno: 13. 9. 2011, 13:46:22
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 |
#4 · Zasláno: 13. 9. 2011, 13:57:14
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 * |
#5 · Zasláno: 13. 9. 2011, 14:00:55
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 |
#6 · Zasláno: 13. 9. 2011, 14:13:37
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 Object u 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 * |
#7 · Zasláno: 13. 9. 2011, 14:43:12
diky, tak hold zustanu o klasického zápisu.
|
||
Nicolas Profil * |
#8 · Zasláno: 13. 9. 2011, 15:15:16
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 |
#9 · Zasláno: 13. 9. 2011, 15:41:46
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 * |
#10 · Zasláno: 13. 9. 2011, 16:25:15
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 * |
#11 · Zasláno: 13. 9. 2011, 16:30:52
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 |
#12 · Zasláno: 13. 9. 2011, 18:03:27
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 * |
#13 · Zasláno: 13. 9. 2011, 18:58:05
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 |
#14 · Zasláno: 13. 9. 2011, 19:12:59
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 |
#15 · Zasláno: 13. 9. 2011, 19:27:01
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 * |
#16 · Zasláno: 13. 9. 2011, 20:11:35
Diky, všem zučastněným:)
|
||
Časová prodleva: 3 dny
|
|||
Witiko Profil |
#17 · Zasláno: 16. 9. 2011, 18:10:50 · Upravil/a: Witiko
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.
|
||
Časová prodleva: 13 let
|
0