ugrás a tartalomhoz

Ajax?

H.Z. v2 · 2011. Aug. 6. (Szo), 15.21
Viszonylag sok tutorialban látok olyat, hogy Ajax hívásra HTML választ várnak, amit 1:1-ben betöltenek a lap egyik elemének innerHTML-jébe.
Dehát az Ajax-nak már a nevében is ott van az XML! Miért nem ezt mutogatják a tutorialokban? (csak én vagyok figyelmetlen, "jó" szokásomhoz híven?)

Én úgy képzelek egy komolyabb ajaxos feladványt, hogy a szerver, az ajaxos kérésre egy XML dokumentumot küld vissza, amit a responseXML-ből dolgozok fel a DOM metódusok/property-k(??) segítségével.
Tehát ha szükségem van arra, hogy megjelenítsek egy nagy halom képet diafilmszerűen, akkor ajax-ból lekérem a file-ok listáját valami ilyen formában:

<?xml version="1.0" encoding="utf-8">
<images>
  <img>1.file.neve.jpg</img>  
  <img>2.file.neve.jpg</img>  
...
  <img>n.file.neve.jpg</img>
</images>
és a responseXML.getElementsByTagName("img") formában(*) kérem el a képek nevét, majd ezeket illesztem be a megfelelő helyekre.

Mielőtt ennél alaposabban belemásznék a témába: jó ez az elképzelés?
(egyetlen dolgon fennakadtam: IE-ben .text, egyéb browserben .textContent tartalmazza a tagek értékét, ami nem kicsit bosszant - ezt leszámítva ugyanis a FF és az IE9 egyformán működött)


(*) - tudom, előbb az "images"-t kellene kikérni és csak abból az "img"-ket.
 
1

Történelmi

janoszen · 2011. Aug. 6. (Szo), 19.30
Legjobb tudomásom szerint az XML feldolgozás egy pár éve még nem volt az erőssége a JavaScriptnek, kellett mindenféle kompatibilitási dolgot hegeszteni hozzá. Arról nem beszélve, hogy sokkal kevesebb erőforrás beilleszteni egy HTML kódot egy másikba, mint külön utófeldolgozni a kliensben.
2

Köszi! Egyébként kivételesen

H.Z. v2 · 2011. Aug. 6. (Szo), 19.50
Köszi!

Egyébként kivételesen valóban kliensoldali feldolgozásról van szó, szóval kicsit macerás lenne HTML-t visszakérni és abból dolgozni, de így érthető a tutorial szerzők hozzáállása.
(pár napja valaki bedobott egy kérdést valami dia "vetítő" script kapcsán, azt próbálom a saját szórakoztatásomra összetákolni. :-)
3

És mennyivel egyszerűbb ha a

Karvaly84 · 2011. Aug. 6. (Szo), 20.57
És mennyivel egyszerűbb ha a képeket egy sima string-ben kapod majd lemented egy változóba utána string.split(/\s+/) ami 'white space' mentén szét szedi egy tömbbe a file neveket, és onnan szabad a pálya, az xml ebben az esetben kimondottan hülyeség, ha csak nem valami komoly xml szabványon működő alkalmazásról van szó. Szerintem...
4

Pl: mi a biztosíték arra,

H.Z. v2 · 2011. Aug. 6. (Szo), 22.07
Pl: mi a biztosíték arra, hogy nincs space a fájlok nevében?
(azon túl, hogy momentán én neveztem el őket, tehát tudom, hogy nincs ;-) )
De nem is ez a lényeg: csak azon értetlenkedtem, hogy ha egyszer az ajax valójában XML-re épülő kommunikációt jelent, akkor miért nem úgy használják?
5

urlencode

janoszen · 2011. Aug. 6. (Szo), 22.24
urlencode a barátod szerver oldalon. :) Azért nem használjuk, mert az XML feldolgozása pusztán műveletszám szempontjából is sokszorosa a sima splitelésnek, innentől lassabb. Amióta van JSON, gyakorlatilag szinte semmi előnye nincs az XML használatának. Azt, hogy úgy hívják... hát Istenem, egy darabka történelem.
7

A JSON már jobban hangzik

H.Z. v2 · 2011. Aug. 7. (V), 07.31
A JSON már jobban hangzik ellenérvként az XML-lel szemben. :-)
(kb. tudom, mi az, de életemben nem használtam, doksit sem néztem hozzá, XML-lel meg már találkoztam néhányszor)

A szóköz kapcsán: Karway kihagyott egy lényeges apróságot. Most épp arra használom (mert játszom, ismerkedni próbálok a technológiával), hogy képfájlok neveit adogassam vissza a szerverről. De mi van, ha mondjuk egyéb, szöveges adatokat akarok visszaadni, amit a javascriptnek kell feldolgoznia?
A JSON változat (ha szerver oldalon össze bírom rakni) működik, de a szóközök mentén történő szétvagdosás ugye... ;-)
8

Természetesen, a splittelés

Karvaly84 · 2011. Aug. 7. (V), 07.54
Természetesen, a splittelés szóközök mentén nem mindig használható. Amit felhoztam példának azt csak avval szerettem volna szembe állítani, hogy xml-ben jönnek a kép fájlok, mert erre jobb a sima text/plain, nyilván egyéb adatokat is tartalmazó válaszhoz, jobb a json. Pl. nekem van egy ImageLoader osztályom js-ben, amit json-al inicializálok olykor amikor a galériát alkotó képfájlokat a szerver adja meg, és a ImageLoader onload eseményére nyitom meg a galériát, amikor már az összes kép lent van.
9

JSON használatára tudnátok

H.Z. v2 · 2011. Aug. 8. (H), 08.20
JSON használatára tudnátok valami rövidke, konkrét példát mutatni?
Többé-kevésbé felfogtam (ha jól értem, nagy vonalakban egy szerializált objektum küldözgetéséről szól), de a gyakorlati hasznosítással így első nekifutásra nem boldogulok.
Konkrét példa:
PHP-ből json_encode-dal visszadobok egy asszociatív tömböt, ebből kliens oldalon a JSON.parse egy objektumot készít tömb helyett (vagy a hiányos JS ismereteim jelentik a probléma lényegét és JS-ben nincs asszociatív tömb, ezért lesz belőle objektum?)
Ami így első ránézésre azért gáz, mert a visszaadott objektumon nem tudok végigmenni, mint egy tömb elemein... (vagy már megint a JS ismereteim hiánya)
10

Keress!

pp · 2011. Aug. 8. (H), 08.47
találj:
http://www.google.com/search?q=object+iteration+javascript

pp
11

JavaScript

Poetro · 2011. Aug. 8. (H), 11.31
Mivel, mint sok egyéb nyelvben, JavaScript-ben sincs asszociatív tömb, ezért a PHP egy objektumot fog generálni a json_encode-dal. JavaScript-ben pedig a for..in ciklussal tudsz végigmenni az elemen.
Példa:
var obj = {'a': 'x', 'b': 'y', 'c': 'z'},
    hop = Object.prototype.hasOwnProperty,
    prop, val;
for (prop in obj) { // A prop változó veszi fel a kulcsokat stringként.
  if (hop.call(obj, prop)) { // Az elemnek saját tulajdonsága a prop?
    val = obj[prop];
    // Azt csinász az értékkel amit akarsz.
  }
}
De a legtöbb esetben nem lesz szükséged arra, hogy ciklussal járj be egy objektumot, mivel jó esetben ismered a struktúráját (ahogy a fenti XML struktúráját is ismerned kell, ha használni akarod.). Ekkor pedig hagyományos objektum tulajdonság címzéssel megoldható (például obj.a, obj.b).
14

Köszi, lásd lentebb,

H.Z. v2 · 2011. Aug. 8. (H), 14.31
Köszi, lásd lentebb, Karwaynak írt válaszom. ;-)
Jelen esetben azért jött elő a bejárás témája, mert az eredeti példám az volt, hogy ajax segítségével kérem le az elérhető képek listáját. Ezt XML esetén egy getElementsByTagName segítségével le tudom érni, de félkómás állapotban nem tudtam eldönteni, mit csináljak vele, ha JSON formában érkezik a lista.
12

Nem tudom, hogyan próbáltad

Karvaly84 · 2011. Aug. 8. (H), 11.46
Nem tudom, hogyan próbáltad de js-ben az objektumokat amik kulcs érték párokban tárolnak adatokat azokat for in ciklussal járjuk be.

for (var key in object) {
    console.log(key + ': ' + object[key]);
}
13

Félálomban, miközben már

H.Z. v2 · 2011. Aug. 8. (H), 14.27
Félálomban, miközben már előre hergeltem magam, hogy mit fog szólni a doki, ha beállítok hozzá... :-(
Szóval bocs mindenkitől, nem néztem igazán utána a témának, úgy kérdezősködtem.

ui: ez a console.log csak akkor műxik, ha van firebug is, ugye?
15

A console.log ott működik

Karvaly84 · 2011. Aug. 8. (H), 15.02
A console.log ott működik ahol a default kimenet (ami általában egy konzol) támogatja ezt a metódust. Manapság minden böngésző támogatja, nem kell hozzá firebug, a firebug csak egy felület ad a konzol eléréséhez, böngészőkön keress valami olyasmi menüpontot hogy hiba konzol megnyitása vagy javascript konzol megnyitása vagy valami hasonló. Azon böngészők (pl.: IE, Chrome, Opera) beépített hibakeresővel rendelkeznek, amit általában a F12 lenyomásával tudsz elő csalni, és ez rendszerint tartalmaz egy "console" feliratú fület, amin látod a hiba üzeneteket, meg stb, illetve a console.log-al te is helyezhetsz el üzenetet rajta.

ui.: Például integrált fejlesztői környezetkben (IDE) is van console, Én Eclipse-t használok, a Mozilla írt egy Rhino neveztű JavaScript értelmezőt, amit a Eclipse external tools részén belehet lőni, ezután a js fájlokat tudjuk futtani a konzolon is, nem kel böngésző, terméseztessen a böngésző által hostolt dolgokat innen nem éred el, de a js minden elemét tartalmazza ami rövid kódok teszteléséhez jó felület ad.
16

OK, ezt csak azért kérdeztem,

H.Z. v2 · 2011. Aug. 8. (H), 15.15
OK, ezt csak azért kérdeztem, mert tegnap keresgéltem kicsit, hogy hogy lehet alert helyett mondjuk a js konzolra üzenni és azon a két helyen, ahol megnéztem, azt írták, firebug kell hozzá. (nálam van, szóval részemről le volt tudva a dolog, csak most elgondolkodtatott, hogy jó helyen néztem-e)
17

Na jó, XML megmarad arra az

H.Z. v2 · 2011. Aug. 8. (H), 20.59
Na jó, XML megmarad arra az esetre, ha még valaha MQ-s(*) kommunikációra kell vetemednem. :-)
Némileg egyszerűbb a JSON-t feldolgozni, ha tudom, hogy hogy kell... :-)

* - amit láttam MQSeries-ből, ott XML üzenetek közlekedtek.
6

Weben a fájlok nevében nem

Karvaly84 · 2011. Aug. 6. (Szo), 23.08
Weben a fájlok nevében nem használunk space-t egyébként sem, vagy kötőjel vagy alsó vonal, plusz az, hogy AJAX az egy kifejezés amit az alkalmazott technológiák együttes rövid leírására használnak. Amit mi használunk az egy objektum. XMLHttpRequest ami nem első sorban az xml miatt lett kitalálva, hanem HTTP protokollt használó kommunikációra.
18

Az ajax-nak annyi a lényege,

inf · 2011. Aug. 9. (K), 15.46
Az ajax-nak annyi a lényege, hogy javascripttel kommunikálsz a szerverrel az oldal újratöltése nélkül. Teljesen mindegy, hogy a választ milyen formában kapod meg.

Az XML használatának a legnagyobb akadálya sztem az msie...
19

var globImages={}; /* a

H.Z. v2 · 2011. Aug. 9. (K), 21.58

var globImages={};

/* a meghívott imglist.php egy JSON objektumként adja vissza a listázandó képek neveit */
function getImages(){
    var rq=new XMLHttpRequest();
    rq.open("GET","imglist.php",false);
    rq.send();
    var resp=JSON.parse(rq.responseText);
    return resp;
}

function onloadFv(){
    /* a globImages tömbbe/objektumba kerül a megjeleníthető fájlok listája */
    globImages=getImages();
    
    /* a képek listáját megjelenítő div */
    listObj=document.getElementById("imagelist");
    
    /* helykitöltő div, amelynek magassága megegyezik a befoglaló div magasságával, a szélessége viszont 0, hogy ne jelenjen meg.
       Valódi feladata, hogy a div-en belül, vertikálisan is középre tudjam igazítani a képeket. */
    var fill=document.createElement("div");
    
    /* Ezzel állítom be, hogy azonos legyen a magassága a szülőével. Nem túl korrekt, inkább a parentét kellene lekérni, de most egyszerűbb
       volt fixen beállítani. */
    fill.style.height="300px";
    
    /* Hozzácsapom az üres listához a fenti helykitöltőt */
    listObj.appendChild(fill);
    
    /* végigmegyek a fájlnevek listáján, mindegyikből kreálok 1-1 img objektumot és hozzáfűzöm az fenti listához */
    for(i in globImages){
        
        /* img létrehozása */
        var img=document.createElement("IMG");

        /* a kép forrásának beállítása */
        img.src=globImages[i];
        
        /* img objektum hozzáfűzése a listához */
        listObj.appendChild(img);
    }
}
Mondjátok! Melyik az elfogadottabb módszer?
Ez, amit itt elkövettem vagy inkább rakjam össze stringként és illesszem be az "imagelist" id-jű div innerHTML-jébe?
20

documentFragment

Poetro · 2011. Aug. 9. (K), 22.04
Készíthetsz DocumentFragment-et, ami gyors, és csak amikor minden kész, akkor szúrod be az elemet a dokumentumba (ahogy fent is kellene, azaz a 28. sornak kellene az utolsónak lennie).
21

uff... hogy nem csak a végén

H.Z. v2 · 2011. Aug. 9. (K), 22.19
uff... hogy nem csak a végén csapom hozzá a dokumentumhoz az elkészült listát, az csak sajtóhiba (gyk: figyelmetlenség - elnézést kérek, többször nem írom le, egy ideje eléggé amortizálódott állapotban vagyok agyilag is :( )

Ez a DocumentFragment viszont újdonság volt, köszi!
Ha még élek, akkor holnap reggel végigolvasom a linkelt írást.
22

jquery?

Kubi · 2011. Aug. 10. (Sze), 00.05
csak egy kérdés, mért nem használtok jQuery-t?

// dokument onload
jQuery().load(function(){

  jQuery.getJSON('imglist.php', function(data) 
  {
    // lista div
    var listDiv = jQuery('#imagelist');

    // helykitöltő (nem értem miért is kell? :) )
    listDiv.add(jQuery('<div style="height: 300px"></div>'));
  
    // json-böl parsolt obj végigjárása
    jQuery.each(data, function(key, val) 
    {
      listDiv.add(jQuery('<img src="'+val+'"/>'));
    });
  }
})
most az, hogy az each-ben egymás után rakja be a script a képeket, nem fog látszódni a böngészőben, max ha 1000 elemü a tömb, de akkor is csak az oldal alján ;), de ha ez zavaró lenne, function elején listDiv.hide() majd listDiv.show() a végén.
23

nem

Poetro · 2011. Aug. 10. (Sze), 01.27
Először is, ha jQuery-t használsz, akkor nem fogod megtanulni a JavaScript és a DOM alapjait. Másodsorban, ha csak egy nagyon kis szelete kell, akkor felesleges behúzni 100kb kódot, mikor megoldható minden, amit akarsz 1kb kóddal.

Ha már jQuery, akkor inkább így:
jQuery(function($){  
  $.getJSON('imglist.php', function(data) {  
    
    var listDiv = $('#imagelist'), // lista div
        holder = $('<div style="height: 300px"></div>'); // tartó elem

    // json-böl parsolt obj végigjárása  
    $.each(data, function(key, val) {  
      holder.append($('<img>', {src: val}));  
    });  
    listDiv.empty().append(holder);  
  }  
});
24

1. Nem ismerem és túl nagy

H.Z. v2 · 2011. Aug. 10. (Sze), 06.40
1. Nem ismerem és túl nagy ahhoz, hogy két kép betöltéséért nekiessek.
2. Játszom, tanulgatok, ilyesmi, ehhez egyébként sem kell keretrendszer.
3. Egyébként is utálok idegen keretrendszert használni. Nincs munkám, tudásom ahhoz kevés, hogy ilyen jellegű munkát kapjak, akkor meg jobb szórakozás sajátot készíteni, amibe bármikor belenyúlhatok és úgy alakítom, ahogy nekem tetszik.
Ha egyszer valami csoda folytán eljutok oda, hogy pénzért dolgozzak, lesz annyi alapom, hogy pár hét alatt beletanuljak bármely keretrendszer alapjaiba.

Ezek a saját szempontjaim. Érvényesek javascriptre, PHP-re, ruby-ra, mindenre... :-)
25

megértem az álláspontodat, én

Kubi · 2011. Aug. 10. (Sze), 10.52
megértem az álláspontodat, én is így kezdtem ;) de már keretrendszer függő lettem, mert gyorsítja az ember munkáját.

Ma is tanultam, jQuery().append nem is tudtam h így lehet használni, utánna olvasok, köszi.
26

Keretrendszer nélkül nem

H.Z. v2 · 2011. Aug. 10. (Sze), 11.05
Keretrendszer nélkül nem lehet létezni.
Pláne a mai világban.
Inkább arról lenne szó, hogy milyen keret? Saját vagy külső fejlesztés?
Ha valaha rászánom magam végre, hogy mélyebben foglalkozzak a témával, akkor PHP és JS esetében valószínűleg a saját mellett voksolok. Pl. Java-hoz vagy ha valami katasztrófa folytán .net környezetbe keverednék, már biztosan nem kezdenék sajáttal a feladatok mérete miatt.