jQuery bind DOM változásra
Sziasztok!
Egy weboldalon, utólag, ajax-szal injektált (appendChild) div tartalmára kell stílusokat aggatnom. Ismerem az azonosítókat, kizárólag abban akadtam el, hogy hogyan tudok jQuery-vel a DOM változására eseményt kreálni!
Segítsetek egy kicsit, merre kutakodjak?
■ Egy weboldalon, utólag, ajax-szal injektált (appendChild) div tartalmára kell stílusokat aggatnom. Ismerem az azonosítókat, kizárólag abban akadtam el, hogy hogyan tudok jQuery-vel a DOM változására eseményt kreálni!
Segítsetek egy kicsit, merre kutakodjak?
css osztály? callback?
miért nem jó, ha különböző classokat adsz az elemeknek, amiket a css fájlban definiálsz? ha ez nem felel meg valamiért akkor miért nem jó egy callback függvény, ami az ajax kérés visszatérése után fut le?
firefoxban vannak dom-események, de ezek ie-ben biztosan nem fognak működni, így semelyik js framwork-ben sem. megkerülni settimeoutos folyamatos figyeléssel tudnád, de az egy kicsit talán pazarló lehet.
Távoli a szkript.
Van egy weboldal, ahova egy távol szkript (én nem tudom szerkeszteni, de ismerem a tartalmát, hiszen a távoli cím be van illesztve a html kódba) ajax-szal injektál (appendChild) egy div-et.
Ennek a div-nek a megjelenését szabom testre (keret szín, betűméret, betűszín stb.). A dekoráló rutinom már kész, működik is, azonban nem automatikusan.
Az a cél, hogy a DOM bővülésére, ez a dekoráló függvény lefusson.
még mindig css
szerk: guglival pedig ezt találtam:
Részleteiben...
Az elemek, amiket dekorálnom kell, nem rendelkeznek egyedi azonosítóval (mindegyik div), és sajnálatosan a legkülső konténer sem azonosítható, hogy azt mondhatnám css-el hogy:
Ismerem azokat a funkciókat a távoli szkriptből, amik az injektálást végzik. Lehetne a dokumentumra olyan megfigyelőket akasztani, amik ezen függvények lefutását figyelik?
változhat
egyébként szerintem nem is nagyon tudnál egy függvényhívásra eseményt akasztani.
child selectorokkal sem?
és talán egyszerűbb is, mint a live query-s megoldás.
szerk: a külső script mi alapján végzi a beillesztést? ha ő megtalálja azt, hogy hova kell beszúni az eredményt akkor te is meg fogod. css-sel is, js-sel is.
Hova illeszti be?
megoldás 1
win alatt ff, chrome, opera, safari jó. ie6-7-8 nem jó. firebuggal töröld az utolsó div-et, az előtte lévő már nem lesz piros.
Megoldás 1
Nem látom át teljesen
Az ajaxnak van callbackja, erre nem lehet eseményt akasztani?
A diveknek nincs azonosítójuk, de a saját részeden nem érsz el egy divet (-vagy bármilyen elemet- melybe majd a div belekerül melybe a div belekerül melybe az ajax beszúrja a divet:-)) aminek egyedi azonosítót tudsz adni és alapul szolgálhat a css-hez?
Fontos a beszúrt elemek struktúrája? Esetleg egyedi azonosítókat tudnál adni nekik a callbackban ha egy ciklussal megszámolod a beszúrt elemeket, és azonosítód adsz nekik (div1 div2 stb)
Vagy teljesen rosszul látom a dolgot?
Felépítés
A beillesztett struktúra kb. így néz ki:
jQuery-vel kidolgoztam már az azonosítást, így minden egyes szükséges div-et meg tudok szólítani, ezzel nincs is probléma! Kidekorálni már kitudom az injektált tartalmat, a gond az, hogy ennek a bizonyos kidekorálásnak automatikusan kellene bekövetkeznie akkor, mikor a document.createElement("div")-et kitölti tartalommal a TargetDiv.innerHTML = html;
Van egy eseményem, ami az ajax request callback függvénye, a HandleResponse, az jó lenne, ha erre tudnék akasztani egy megfigyelőt.
megoldás 2
aztán persze lehet hogy most már én sem látom a fától az erdőt és van sokkal egyszerűbb megoldás. :)
Nem teljesen értem.
Ha azt teszem, amit mondasz:
Tovább elemeztem a helyzetet:
A legkülső befoglaló div így jön létre (a távoli szkriptből):
Hogyan tovább?
ps.:
Egyébként tárgyalok a gyártóval, bele is egyezett a dekorálásba, sőt megígérte, hogy a következő fejlesztésbe belevesznek egy egyedi dekorációs callback függvényt, viszont az lehet akár egy év is!
én ez(eke)t tenném
2. közölném a megrendelővel hogy a script készítői egyelőre nem támogatják a dekorálást
2.a. szóval keressünk erre egy másik scriptet
2.b. de itt a css-es megoldás ami a látogatók nagy részét lefedi. conditional commentben pedig meghívnék egy kis js-t, ami másodpercenként figyeli, hogy az utolsó div-nek még mindig footer-e az id-ja. amint nincs footer id kapna egy másik id-t, amire már tudnék css-t írni. ezzel lefedném az ie-ket is, viszont nem terhelném a többi böngészővel érkező látogatót.
3. felháborodott levelet írnék
3.a. a microsoftnak a last-child kiválasztó hiánya miatt
3.b. majdnem mindenkinek a dom-manipuláló események hiánya miatt
van ami vicc és van ami hipotetikus (nem ismerjük még mindig a pontos részleteket, azaz mi ez a script, mit csinál, kiváltható-e másikkal).
szerk: én a css-es megoldást tartom a legtisztábbnak (ez megjelenítés, azaz a css dolga), így a gyártónak is azt javasolnám, hogy a callback függvény helyett (ami később persze jó lehet rengeteg más dologra is) előbb egy egyedi azonosítót adjanak a generált divnek. az nem lenne olyan nagy feladat és lehet hogy nem kéne egy évet várni rá.
Cross domain kommunikáció
Ez egy olyan alkalmazás, amitől egy webes felületen megjelenő ablakba beírt üzenet valós időben jut el egy adminisztrátorhoz és az adminisztrátor válaszolni is tud rá.
Mint egy privát szoba chat-en, csak ez browser kliensről OS-re telepített programba egy közvetítő szerver segítségével.
jQuery live
semmi köze a dom-hoz
Live Query
nem ugyanaz
globalis Ajax callback
en megprobalnak egy callback fuggvenyt irni az (osszes) Ajax hivasra es a vegrehajtando hivas urljet szurve dekoralnam ki a visszajovo adatot, hozzaillesztve a megfelelo css osztalyokat. Termeszetesen ha nem tul surun valtozik a visszajovo tartalom es nem iframe / cross-domain esetrol van szo.
-cs-
Sanyi
ez jó
szerk: pedig prototype-ban is van.
Kifejtenéd bővebben?
ajaxPool
-cs-
Sanyi
szerk: a golbalis ajaxot, extjs eseten hasznaltam sikerrel, most kijott az MIT liszenszes valtozat, hatha benne van ez a lehetoseg, de szerintem, ahogy gex is irta minden fuggvenykonyvtarban van ilyenre lehetoseg.
szerk2: arra hasznaltam, hogy loadereket mutassak az oldalon, amig fut az ajax :), majd a callback hivasban eltuntettem
Fától az erdőt...
Fejtegettem a szkriptet ami távolról jön és a következőt találtam:
Mikor az ajax hívás sikeresen végbemegy, megépíti az alkalmazás az ablakot, létrehozza a node-ot és beleteszi az innerHTML-jébe, de a dokumentumhoz még nem append-eli. Ezen a ponton a megérkezett adatokra ráereszt az alkalmazás egy logikai ellenőrző függvényt, ami azt vizsgálja, hogy minden visszatérési érték megfelelő formátumú-e. Ha minden rendben van beteszi az értékeket az arra fenntartott szövegmezőbe és append-eli a node-ot.
Na ezt a függvényt elegánsan kimásoltam a távoli szkriptből, a szkript include-olása után adtam neki null értéket, és újradefiniáltam úgy, hogya benne van az én egyedi függvényhívásom!
Remekül működik!