ugrás a tartalomhoz

Nativ osztályok bővitése

Karvaly84 · 2011. Feb. 11. (P), 20.30
Hello guruk! Aszt hiszem ez a legjobb hely hogy feltegyem a kérdésemet!

Mondjuk, hogy kezdő vagyok a témában, nekem túl bonyolult a cikk, de a szerző vagy más olvasó lehet tudna nekem segíteni.

példának egy konkrét problémámat vetem fel.

a Event constructor-t szeretném úgy módosítani, hogy amikor az létre hoz egy új event objektumot akkor automatikusan ellenőrizze le, hogy a objektumnak van e 'target' tulajdonsága, és ha nincs akkor keresse meg a srcElement-et és másolja bele a target-be. Persze ezt úgy akarom, hogy beavatkozás nélkül történjen meg, lehetséges ez valahogy hogy a nativ osztályokat valahogy ki bővíteni egy olyan kóddal ami automatikusan lefut létrehozás után vagy a legvégén?

Hálás lennék ha valaki segítene ebben itt vagy mailben: karvaly007[kukac]gmail[pont]com cimen.

Előre is köszönöm. és ha már volt akkor elnézést.
 
1

Saját konstruktor

Poetro · 2011. Feb. 11. (P), 21.17
Csinálhatsz saját Event objektumot, pl MyEvent néven, ami az Event objektumot terjeszti ki, bár nem tudom ennek mi az értelme. Mivel egyébként is saját eseménykezelőt kell írni a böngészők különbségeinek elrejtésére, abban meg tudod valósítani, amit szeretnél.
2

Úgy, ahogy te szeretnéd nem

inf · 2011. Feb. 12. (Szo), 01.27
Úgy, ahogy te szeretnéd nem lehetséges. Nem lehet hozzáférni az Event osztályhoz úgy, mint mondjuk az Array vagy Object osztályokhoz. Ez van. A konstruktoros dolgokba nem lehet belenyúlni, nem név alapján érik el a konstruktorokat, szóval ha felülírnád a konstruktort, akkor sem érnél el semmit, mert ugyanúgy a régi konstruktorral hozná létre az objektumot. Szóval js-ből nem lehet megcsinálni, csak úgy menne, ha átírnád a motort, ami js-t futtatja.
3

Láttam valaki át tette a

Karvaly84 · 2011. Feb. 12. (Szo), 03.36
Láttam valaki át tette a fórumba a témát! Ritkán fórumozgatok, boccs ha rossz helyre írtam.

Minden esetre akkor marad a régi megoldás, miszerint a Event egy példányát átadjuk egy függvénynek ami megcsinálja a dolgokat, sokat gondolkodtam ezen a dolgon, de így már nem töröm tovább a fejem ez miatt.

És köszi a törődést! BéKE!
4

Ja, amúgy az osztály

inf · 2011. Feb. 12. (Szo), 19.18
Ja, amúgy az osztály ellipszilonos :-)
5

ja igyekszem it hejesen irni

Karvaly84 · 2011. Feb. 14. (H), 04.22
ja igyekszem it hejesen irni de a j egy karakter a ly meg kettö és a egy gyorsabb mint a kettö, ált gyorsan irok ha nem hivatalos és nem hejesen,lol de probáltam oda figyelni mert tom h forumon ebbe mindig bele kötnek,lol
6

Igényesség

janoszen · 2011. Feb. 14. (H), 09.22
Ha valakitől kérsz valamit, inkább igényes legyél, mint gyors. Tehát igyekezz megkönnyíteni a válaszadó dolgát és odafigyelni a heLYesírásra, központozásra, nagy mondta kezdőbetűkre, stb.

A másik, hogy itt kialakítasz magadról egy képet. Én szakmai interjún meg szoktam kérdezni a jelölttől, hogy milyen fórumokon aktív. Ha azt látom, hogy slendrián, igénytelen irományokat ad ki a kezéből, az erősen ellene szól, mert azt feltételezem, hogy akarva-akaratlan ilyen dokumentációkat, e-maileket fog írni.
7

+1

zzrek · 2011. Feb. 14. (H), 10.18
Ez tényleg nagyon fontos. Egy komoly ember mindig odafigyel arra, hogy hogyan mutatkozik. Ha meglátom, hogy a kérdés címében az van, hogy "osztáj", már tudom (úgy érzem), hogy ez egy komolytalan, gagyi kérdés lesz. A rossz helyesírás, és a hanyagul megfogalmazott mondatok negatív előítéletet szülnek. (Sajnos ez van). (Más kérdés, hogy ez az LY-J kettősség szerintem elég butaság, jó lenne ha egyszer kireformálnák a helyesírásból és maradna a pontos J)
8

Más kérdés, hogy ez az LY-J

bb0072 · 2011. Feb. 14. (H), 11.17
Más kérdés, hogy ez az LY-J kettősség szerintem elég butaság, jó lenne ha egyszer kireformálnák a helyesírásból és maradna a pontos J


ÚJ MAGYAR HEJESÍRÁSI SZABÁJZAT

Télleg király lenne :)))))
9

A hagyományok sokszor

inf · 2011. Feb. 15. (K), 00.01
A hagyományok sokszor értelmetlenek, de azért illik betartani őket, legalább akkor, ha ilyen alapvető dologról van szó, mint az írás. Az angolok is írhatnának fonetikusan, még sem teszik, stb...
10

nagyon elszakadtunk a témától

Karvaly84 · 2011. Feb. 15. (K), 01.05
nagyon elszakadtunk a témától :)
11

Na most ott tartok, hogy az

Karvaly84 · 2011. Feb. 18. (P), 07.56
Na most ott tartok, hogy az Event konstruktort egy az egybe átírtam egy másikra!

var Event = function(e){
    if (!e) return;
    e.date= new Date();
    for ( var i in e) {
                this[i] = e[i];
            }       
};
Imigyen használom:

addEvent(element, 'click', function(e){
   e = new Event(e);
   alert(e.date) // ok
   e.stopPropagation(); // ok, de mégsem
});
A stopPropagation() megállítja a esemény félkúszását, és evvel együtt hiba üzenetet is dob!

IE 8 - Az objektum nem támogatja ezt a tulajdonságot vagy metódust.
FF 3.6 - "uncaught exception: [Exception... \"Illegal operation on WrappedNative prototype object\" nsresult: \"0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)\" location: \"JS frame :: http://localhost/core/test.js :: anonymous :: line 27\" data: no]"
Chrome 9 - Uncaught TypeError: Illegal invocation (anonymous function)
Opera 11 - Uncaught exception: Error: WRONG_THIS_ERR

Szóval mind a 4 böngésző hibát dob, de ugyan akkor végbe is megy a stopPropagation().

Ezt tudja valaki miért lehet?
12

Nincs ilyen

Poetro · 2011. Feb. 18. (P), 13.56
Mivel az Internet Explorer eleve nem ad át Event objektumot, ezért kapod a hibát. Valamint IE alatt nincs is stopPropagation metódusa az Event objektumnak. Mint említettem erre más megoldást kell használnod.

A for..in nem biztos hogy minden tulajdonságot lemásol, mivel vannak olyan tulajdonságok amik nem enumarable-ok, és ezeket a for..in ciklus kihagyja.

Mozilla böngészők alatt, és lehet hogy Webkit és Opera alatt is az Event egy natív objektum típus, ezért felüldefiniálása nem szerencsés. Ez mindenfajta hibát szülhet, ami kihathat az egész oldal működésére. Használj valami más nevet az objektumod konstruktorához.

Nemrégiben írtam egy böngésző független eseménykezelő könyvtárat, érdemes lehet azt megnézni, annak módszereit használni.
13

//

Karvaly84 · 2011. Feb. 18. (P), 15.32
Amit be szúrtam kódot az egy részlet csak, firebug-ban olvasva lemásolt mindent, igazad van, más nevet kell kitaláljak, megnézem a könyvtáradat, remélem nem olyan bonyolult mint a többi, mert túrtam a DOMAssistant, Prototype, jQuery-t is de az nekem magas....

Valószínű az lesz, hogy inkább az eredeti event objektumot terjesztem ki és nem újjat csinálok belőle...

És bocs ha esetleg hülyeségeket írok, de csak hobbiból scriptelgetek és a magyar könyvek nagyon gagyik, angolul meg alig tudok, hogy valami külföldi site-on nézzek utána az implementációknak és ajánlásoknak...

Több kérdésem nincs egyenlőre, köszönöm az eddigieket... BéKE!
14

Nekem az extjs-es Observable

inf · 2011. Feb. 19. (Szo), 10.40
Nekem az extjs-es Observable ami tetszett. Nem néztem a kódját, csak az a megközelítés tetszik, hogy nem csak dom-hoz oldották meg a problémát. Én mondjuk kapásból úgy indulnék el, hogy az Object.prototype-ba írnék eseménykezelést. ;-) A tiltott dolgok valamiért sokkal vonzóbbak :D

Én valahogy így képzelem el:


(function ()
{
	var observableMap=new HashMap();
	Object.override(
	{
		listeners: function (event,build)
		{
			var observerMap=observableMap.get(this) || (build && observableMap.put(this,new Map()));
			if (observerMap)
			{
				var listeners=observerMap.get(event);
				if (!listeners && build)
				{
					listeners=observerMap.put(event,new HashSet());
					this.fire("eventset",event,listeners);
				}
				return listeners;
			}
		},
		on: function (event,listener)
		{
			this.listeners(event,true).add(listener);
			this.fire("eventappend",event,listener);
			return this;
		},
		un: function (event,listener)
		{
			var listeners=this.listeners(event,false);
			if (listeners)
			{
				this.fire("eventremove",event,listener);
				listeners.remove(listener);
				if (listeners.empty())
				{
					this.fire("eventdestroy",event,listeners);
					observableMap.get(this).removeKey(event);
				}
			}
			return this;
		},
		fire: function (event)
		{
			var params=arguments.callee.argumentList();
			params.shift();
			if (event!="eventfire")
			{
				this.fire("eventfire",event,params);
			}
			var listeners=this.listeners(event,false);
			if (listeners)
			{
				listeners.each(function (listener)
				{
					listener.apply(this,params);
				},this);
			}
			return this;
		}
	});
})();
A dom node-k fölé tennék saját osztályokat, amiknél az eventset és eventdestroy eseménykezelőknél beállítanám listenernek az addEventListenert meg a removeEventListenert. Az addEventListenernél az egyedüli eseménykezelő fire-t hívná meg az eseményre. Ahogy nézem a params tömböt át tudom adni, és mivel pointer, ki tudom cserélni benne az event objectet sajátra. Nice. :-)

Szerintem elég elvadult ötlet eseménykezelőkkel csináltatni az eseménykezelők hozzáadását meg elvételét, de ezért szeretem :D Utóbbi időkben nagyon rákattantam az eseménykezelőkre, mert nagyon egyszerű velük lazán csatolt kódot létrehozni.
15

Ext.Element

T.G · 2011. Feb. 20. (V), 17.35
Az ExtJS annyiból nem jó példa erre, hogy az Ext.Element nem az Ext.Observable származik. Azaz a DOM elemeknél használt eseménykezelésnél ők is erősen a böngésző eseménykezelésére hagyatkoznak. Például emiatt sincs az Element-nél fireEvent.

Az eldurvult ötletekkel sokszor az a baj, hogy nem nagyon hatékonyak, pedig az nem elhanyagolható szempont. :)
16

Hogyan teszteljem rajta a

inf · 2011. Feb. 20. (V), 17.48
Hogyan teszteljem rajta a hatékonyságot? :D
17

Köszönöm!

Karvaly84 · 2011. Feb. 24. (Cs), 02.29
Helló!

Ma (vagyis tegnap) átnéztem az oldaladon a könyvtárat amit írtál esemény kezelésre! Azon a vonalon haladva és a jQuery-ből merített ötletek alapján végre megoldottam a böngésző független esemény kezelést, sikerült megoldani az automatikus paraméter átadást, és a kapott event már a szabvány szerint müködik!

Kössz Poetro!
18

target vs. this

Karvaly84 · 2011. Már. 3. (Cs), 19.58
Bocsánat, hogy zöldfülűként bele szolok de hát hogyha hasznos:

Amikor megnéztem a library-t amit linkeltél készítettem én is egy hasonlót, a függvényt, ami lekezeli a eseményt ugye dinamikusan gyártjuk le. Te valahogy így:

function prepareCallback(func) {
    // Olyan függvényt állítunk elő amiben a this már az esemény célpontja.
    return function (event) {
      var target = normalizeEvent(event),
          returnValue = func.call(target, event);
 
      if (returnValue === false) {
        event.preventDefault();
        event.stopPropagation();
      }
 
      return returnValue;
    };
  }
Csak arra lettem figyelmes hogy ha egy egymásba pakolt elemekre végig megadunk mondjuk egy click esemény figyelőt, és egy buborékban többször kiváltódik az esemény akkor jön a bibi. Még pedig az történik hogy a függvényen belül a this folyamatosan arra az elemre mutat ami kiváltotta az eseményt, ami ekvivalens az event.target-el. A natív addEventListener-el definiált változatnál pedig a this mindig arra az objektumra mutat aminél a buborékban éppen kiváltódott az esemény. Tehát ha a

func.call(target, event);
sort úgy modosítjuk, hogy a első paraméternél a this-t nem a event.target-re állítjuk, hanem arra az objektumra amihez éppen csatoljuk a függvényt akkor ugyan úgy működik mint a addEventListener.
19

appendChild

Karvaly84 · 2011. Már. 20. (V), 11.15
Sziasztok guruk!

Egy újabb problémába ütköztem! Aki ráér segíthetne pár okossággal!

Van egy div-em amibe appendChild-el beteszek egy elemet, és azt akarom, hogy ilyenkor lefusson egy kód. Ezt úgy gondoltam hogy felülirom a Node.prototype.appendChild függvényt. Most csak részleteket közölnék:

extend(Node.prototype, {
			appendChild : function(_appendChild){
				return function appendChild(child){
					_appendChild.call(this, child);
					alert('append');
				};
			}(Node.prototype.appendChild)
	}, true);
A probléma az, hogy ez csak Operában müködik!, Explorerben nincs Node, Firefoxban meg a HTMLDivElement nem a Element-töl örökli ezt a metódust, amit elvileg a a W3C szerint a Node definiál először és úgy örökli az Element, majd pl a HTMLELement, és így tovább. Firefoxban ők valahonnan máshonnan kapják csak nem tudom honnan.

Ha a Element-et, vagy a HTMLElement-et babrálom, Explorerben és Firefoxban akkor sem működik pl egy HTMLDivElement-el mert itt mindig új metódust kapnak. Csak akkor megy ha közvetlen a HTMLDivElement-et írom át, de ha ezt tenném akkor a specifikációban szereplő összes elemre egyenként kéne ezt megtenni hogy minden fajta elemre alkalmazni tudjam.

Gondolom ti már foglalkoztatok ilyen kérdéssel, és tudtok segíteni.

Közben tovább folytattam a kisérletet:

Explorer-ben akkor sem megy ha közvetlen a HTMLDivElement-et egészítem ki, míg Chrome-ban működik ha a Node-ot írom felül.

Tehát:

Opera és Chrome - Node.prototype.appendChild öröklődik a HTMLDivElement-re rendesen.

Firefox - csak akkor működik, ha a HTMLDivElement.prototype.appendChild-et írom felül.

Explorer - itt meg semmi sem működik, müködik az appendChild de nem ugrik fel az alert ablak.
20

Nem érdemes

janoszen · 2011. Már. 20. (V), 11.17
Kicsit offtopic, kicsit nem az, de nekem az a tapasztalatom, hogy nem érdemes ennyire mélyen belenyúlni a default cuccok lelkivilágába. Ha egyszer jön szembe egy olyan feladat, hogy mondjuk a saját dolgaidat együtt kell használnod valami jQueryvel vagy Prototype.JS-el, akkor csúnya dolgok fognak történni. Nekem pont a minap kellett a rendszeremet összegyógyítani egy szerver oldali proxy segítségével egy másik rendszerrel és összetettem a két kezem, hogy a JS megírásakor nem nyúltam hozzá a natív osztályokhoz, így ugyanis tudott szépen működni a két JS egyszerre.
21

Értem

Karvaly84 · 2011. Már. 20. (V), 12.58
Mondjuk én csak tanulom a JavaScript erejét, és ezeket a dolgokat csak azért csinálom, hogy megértsem, megtanuljam, és megtapasztaljam mi hogy és miért működik úgy ahogy... Az előbbi példa is egy tanulmány része csupán, ha majd egyszer elérek arra a szintre gondolni fogok természetesen hogy ne legyen konfliktus más lib-ekkel.

Amúgy köszönöm a hozászolást, elsőre én is arra gondoltam, hogy ezt így nem érdemes megoldani, de hát úgy voltam vele, hogy mindent ki kel próbálni. :)

Most pl. annyit levontam az esetből, hogy ugyan a DOM osztályok között van öröklődés de csak a működésben, és a konkrét metódusok nem öröködnek csak létre jönnek ugyan azzal a névvel és funkcióval (Firefox), ritkán a tényleges öröklődés előferdül (Opera, Chrome), és olyan is van, hogy van ugyan HTMLDivElement osztály definíció de ami abból származik ez nem örököl semmit a natív metódusokból, nem hogy a Node-tol örököljön valamit (Internet Explorer).

De ha definiálunk egy rohadjMegInternetExplorer tulajdonságot az öröklödik.
22

Nem mondtam

janoszen · 2011. Már. 20. (V), 21.50
Lehet érdemes, pusztán én nem szoktam ilyet csinálni, mert az esetek töbségében portolható kódot kell írnom. Attól még nem az ördögtől való.