javascript - xml nodeset
Üdv.
Van egy elég komoly problémám msie xml node-jaival. Egyrészt objektumokhoz szeretném kötni őket, másrészt pedig ha Set-be teszem őket, akkor szeretném kizárni az egyezőségeket (szóval hogy ugyanaz a node többször szerepeljen). Az a gond, hogy nem lehet egyedi azonosítót rendelni a node-okhoz.
Ezt úgy próbáltam, hogyA gond ott van, hogy az xml node valamiért nem Object, ezért ilyen klasszikus dolgok, mint mondjuk egy tulajdonság beállítása nem működnek rajta. Van valakinek bármi ötlete, hogy hogyan lehetne azonosítani a dom node-okat?
(Egyelőre arra gondoltam, hogy az attribútumok közé teszem be a hashcode-ot, csak az a gond, hogy nem minden node-nak vannak attribútumai... :S)
■ Van egy elég komoly problémám msie xml node-jaival. Egyrészt objektumokhoz szeretném kötni őket, másrészt pedig ha Set-be teszem őket, akkor szeretném kizárni az egyezőségeket (szóval hogy ugyanaz a node többször szerepeljen). Az a gond, hogy nem lehet egyedi azonosítót rendelni a node-okhoz.
Ezt úgy próbáltam, hogy
Object.prototype.hashCode=(function ()
{
var code=0;
var property="HASHCODE";
return function ()
{
if (!Object.prototype.hasOwnProperty.call(this,property))
{
this[property]=++code;
}
return this[property];
}
})();
var dom=new ActiveXObject("MSXML2.DOMDocument.3.0");
dom.async=false;
dom.loadXML(
'<cars>'+
'<car><id>1</id><name>Volvo</name></car>'+
'<car><id>2</id><name>VW</name></car>'+
'<car><id>3</id><name>Mercedes</name></car>'+
'<car><id>4</id><name>Bugatti</name></car>'+
'</cars>'
);
var hashCode=Object.prototype.hashCode.call(dom);
(Egyelőre arra gondoltam, hogy az attribútumok közé teszem be a hashcode-ot, csak az a gond, hogy nem minden node-nak vannak attribútumai... :S)
setAttribute
Tudtommal csak
szerk:
A konstruktort lekérni le lehet, de beállítani ugyanúgy nem. Úgy néz ki, hogy esélytelen a dolog.
Még annyit lehet tenni, hogy a NodeSet-emet úgy írom meg, hogy minden új node hozzáadásánál végigmegyek rajta, és megnézem, hogy szerepel e már a node a gyűjteményben. Ez viszont eléggé lassít, szóval inkább hagyom az egészet.
Na jó, végülis jobb, mint a semmi:
Ha nem retardáltak írták volna msie-t, akkor jó lenne Model-nek MVC mintához. Talán még XHTML custom tagekkel lehetne valami hasonlót tenni, de őszintén szólva már elment a kedvem ettől az egésztől. Több értelme van építeni egy saját fát, aztán azon navigálni, mint XML-en, az xpath,xslt,xsd miatt jelentett volna valami előnyt.
htc-vel meg lehet oldani
htc azért jobb egy fokkal, mert az attribútumokhoz való hozzáférés nagyon lassú
XML-nél még mindig nem találtam megoldást, csak az attribútumozás jöhet szóba
Hát szerintem elég gáz dolog, hogy ilyen gyermeteg hiba miatt nem lehet egy normális keretrendszert tákolni XML-hez. Ha az ember belegondol, úgy logikus, hogy az Object.prototype-ban levő dolgokat minden objektum örökölje, nem értem, hogy ettől miért kell vagy miért jó eltérni??? Mondjuk azt sem tudom, hogy a w3c ajánlást miért nem lehet követni. Ennyi év után sem tudom felfogni...
Hello!
A kísérleteimet XHTML 1.0 Strict DTD mellet hajtottam végre, és elég érdekes és bosszantó következtetéseket vontam le.
Röviden a lényeg:
A Node "appendChild" metódusát akartam felülírni úgy hogy csinálja meg a dolgát meg plusz amit hozzá írok.
Ezt teszteltem egy div-ben, ami a HTMLDivElement származéka.
Opera, Chrome: hibátlanul müködött,
Firefox: csak akkor ment ha a HTMLDivElement appendChild metódusát írtam felül,
Explorer: Itt nincs Node->(agyrém), Element van, átírtam, nem ment, átírtam a HTMLDivElement-et, de még úgy sem ment.
A másik már nem tudom melyiknél de volt olyan böngésző is ahol pl.: Element.prototype.valami = 'valamiszöveg' és utána ha ki kapsz a sorból mondjuk egy div-et és átírod a valami tulajdonságát arra h 'másikszöveg' akkor a többi elem valami tulajdonsága is megváltozik arra, hogy 'másikszöveg'.
Ezek alapján, simán lehet, hogy Explorer-ben az Object.prototype nincs hatással a DOM osztályokra.
Esetleg egy cikk jó lenne ebben a témában, mert agyrém, hogy egyes gyártók mennyire nem kompatibilisek a W3C DOM ajánlásával.
Az alap böngésző objektumok
Világos, tisztában vagyok a
Egyébként mit akarsz kezdeni
Hát én most már semmit nem
pl:
A másik, hogy az XML Node-ok fölé ugyanígy saját osztályú objektumokat lehetne tenni, úgy, hogy az xpath támogatottság megmaradna a fa bejárására.
Nagyjából az volt a terv, hogy a model xml-t vagy annak egy részét visszaküldöm a szervernek, ahol xsd-vel ellenőrzöm, majd ha valid, akkor meghívom rá az aktuális action-t. Kirajzolásnál a model xml megjönne a szervertől, ráküldenék egy xsl-t, ami html-re transzformálná, és ennyi. A dolgot még XML adatbázissal lehetett volna megbonyolítani, de úgy látszik, hogy nem lesz belőle semmi, mert nagy munka lenne, és már ennél a résznél elakadt.
Lebutított változatban lehetne olyat, hogy az xsl-el létrehozom a view részt, plusz párhuzamosan json-ra konvertálom az xml-t, aztán a js objektumokkal dolgozok, majd a visszaküldésnél átkonvertálom őket xml-re.
Szuper ötlet, és szerintem
Az XML-ben valóban nagyon nagy a potenciál, én már jóideje játszom XSLT transzformációkkal, és nagyon pozitív eredményeket értem el, csak idő hiányában még egyszerűen nem tudtam publikálni.
Jah, én is szeretem az XML-t
Úgy gondoltam, hogy minden
Bocsi csak hogy tanuljak is valamit, leírnád nekem röviden mit értesz az alatt, hogy hogy fölé teszel egy objektumot, és hogy hogyan?
Ja bocs, úgy értem, hogy fölé
Ha a fenti példánál maradunk, akkor vannak a piros autók, mondjuk csinálsz egy olyan metódust, hogy CarListProxy.getRedCars(), ami a piros autókat adja vissza, és neked nem kell minden alkalommal megadni, hogy mi alapján választod ki az autókat. Mondjuk a RedCars az Selection típusú dolgot ad vissza, és a CarList.onAppend-jét figyeli. Ha az onAppend-nél vörös kocsit adnak hozzá, akkor felveszi az új kocsit a benne lévő elemek közé. (Persze ezt úgy is meg lehet oldani, hogy minden egyes használatkor végigmegy a teljes kocsi listán, és kiválasztja a vöröseket, kinek hogy tetszik.)
Ha van egy ilyen fád, akkor csinálhatsz hozzá CarListView-t, ami először végigmegy az összes kocsin, kirajzolja őket táblázatba, aztán utána figyeli az CarList.onAppend-et, és ha új kocsi kerül a listába, akkor frissíti a táblázatot. Így elég csak a CarList-el, szóval az adatokkal foglalkozni, a CarListView pedig automatikusan követi a változásokat. Gányoltam anno egy ilyen rendszerrel csak XML nélkül. Ott drag-droppal módosítottam egy fát, és egy oldal layout-ját rajzoltattam ki az alapján.
Ha HTML-t vesszük, akkor pedig a Proxy-kat ki lehet egészíteni setStyle meg hasonló metódusokkal. Az egésznek a kulcsa ott van, hogy a Node alapján meg kell tudni találni a hozzá tartozó Proxy-t.
Ha mondjuk csinálsz egy olyat, hogy Node.firstChild, akkor az az első gyereket adja vissza. Maradjunk a kocsis példánál:
Na most a nameNode az ugye itt XML Node, a hozzá tartozó Proxy-t meg le kell kérni valami alapján. Az Object.prototype.hashCode azért lenne jó ilyen célra, mert minden egyes objektumnak egy egyedi azonosítószámot ad, az azonosítószámok alapján pedig már lehet csinálni egy ProxyMap-et:
ProxyMap[nameNode.hashCode()] => nameProxy
Ez a ProxyMap visszaadja az adott Node-hoz tartozó Proxy-t. Így garantálható, hogy egy Node-hoz csak egy Proxy tartozik, és az végzi rajta az összes kényes műveletet. Ha több Proxy lenne egy Node-hoz, akkor nem tudnának egymás eseménykezelőiről, és teljes lenne a káosz...
Szóval az egésznek a kulcsa az, hogy be lehessen azonosítani 1-1 Node-ot az XML fán. Ha ez nem megy, akkor nem lehet új réteget építeni az XML fölé. Ha nem lehet egyedi azonosítót adni, akkor viszont a Proxy-t kell eltárolni valamilyen Node tulajdonságban, mondjuk
de ezt sem lehet megoldani, mert a Node-okhoz nem lehet tulajdonságokat adni. Ezért bukó az egész.
HTML-ben msie-nél htc-vel megoldható ElementNode-okra, de XML-el nem. (A többi böngészőben örökli az Object.prototype-ot a Node, szóval azokkal nincs gond.)
Értem
Helyettes (Proxy) Szerkezeti
Szerkezeti objektumminta
Adott objektumot képviselőn vagy helyőrzőn keresztül irányítani, hogy szorosabban felügyelhessük a működését.
Megfigyelő (Observer)
Viselkedési objektumminta
Objektumok között egy-sok függőségi kapcsolatot létrehozni, így amikor az egyik objektum állapota megváltozik, minden tőle függő objektum értesül erről és automatikusan frissül.
Ilyen és ehez hasonlók?
Itt a weblabor-on vagy máshol.
Közbe már rá is keresek ezekre :)
Erich Gamma,Richard
Design Patterns: Elements of Reusable Object-Oriented Software
Martin Fowler:
Refactoring: Improving the Design of Existing Code
Joshua Kerievsky:
Refactoring to Patterns
Robert C. Martin
Clean Code: A Handbook of Agile Software Craftsmanship
Többségét megtalálod magyarul is, de nincs sok értelme, mert a programozás nyelve az angol.
(Ettől függetlenül a Design Patterns nekem is Programtervezési Minták címmel van meg :-) )
Megnéztem a könyvet ma, de az
A mintáknál pont az a lényeg,