AJAX responseXML & Internet Explorer

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 10 Φεβ 2007 13:25

Teleytaio kairo douleyo arketa me AJAX kai teleytaies 2 meres antilifthika pos to resplonseXML den douleyei sosta se Internet Explorer eno me firefox ola perifhma. Se kapoio shmio tou kodika mou grafo to parakato:

Κώδικας: Επιλογή όλων

		try
		{
			var dom = xmlHttp.responseXML;
			
			targetElement.innerHTML = dom$(dom,where).innerHTML
		}
		catch (e)
		{ 
			try
			{												
				var dom = new ActiveXObject("Microsoft.XMLDOM");
				dom.async="false"; 
				dom.loadXML(xmlHttp.responseText);
				
				targetElement.innerHTML = dom$(dom,where).innerHTML
			}
			catch (e)
			{
				alert(e.description);
			}
		}
To 1o try einai gia Netscape, Firefox & Opera (tora ama yposthrizei kai allous den ksero :P) to 2o try pou trexei se periptosh apotyxei to 1o try einai gia ton IE, kalei ena oloklhro ActiveX Object (os apotelesma to request na sernete apisteyta) kai diabazei se xml morfh meso tou loadXML to resplonseText. To problhma me ton ie einai pos kanei count sosta ta objects (diladi to dom.getElementsByTagName('div') epistrefei egkyro arithmo alla to getElementById('to_id_edo') den to diabazei, opos episeis den diabazei ama grapso dom.getElementsByTagName('div')[0].innerHTML, eno ston firefox pane ola perifhma.

parakato einai h dom$ function pou exo orisei

Κώδικας: Επιλογή όλων

function dom$(dom,id,type)
{
	switch (type)
	{
		case 'id':
			return (dom.getElementById(id));
			break;
			
		case 'tag_name':
			return (dom.getElementsByTagName(id));
			break;
			
		default:
			return (dom.getElementById(id));
			break;
	}
}
Exei antimetopisei kaneis kati paromoio?

EDIT:
Ksexasa na anafero, to where einai to onoma tou id tou div apo to opoio thelo na trabhkso dedomena.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 10 Φεβ 2007 19:47

Telika to eftiaksa allazontas to deytero try se:

Κώδικας: Επιλογή όλων

var dom = new ActiveXObject("Microsoft.XMLDOM");
dom.async=false; 
				
dom.loadXML(xmlHttp.responseText);

var obj = new Object();
obj.docElement	=	dom.documentElement;
obj.elements	=	dom$(obj.docElement,'div','tag_name');
obj.curElement	=	function ()
{
	for &#40;var i = 0; i < obj.elements.length; i++&#41;
	&#123;
		for &#40;var l = 0; l < obj.elements&#91;i&#93;.attributes.length; l++&#41;
		&#123;
			if 
			&#40;
				&#40;obj.elements&#91;i&#93;.attributes&#91;l&#93;.name.indexOf&#40;'id'&#41; == 0&#41; 
				&& 
				&#40;obj.elements&#91;i&#93;.attributes&#91;l&#93;.value.indexOf&#40;where&#41; == 0&#41;
			&#41;
			&#123;
				var str = '';
				
				for &#40;var j = 0; j < obj.elements&#91;i&#93;.childNodes.length; j++&#41;
				&#123;
					str += obj.elements&#91;i&#93;.childNodes&#91;j&#93;.xml;
				&#125;
				
				return &#40;str&#41;;
				break;
			&#125;
		&#125;
		
	&#125;
&#125;
obj.str			=	obj.curElement&#40;&#41;;

targetElement.innerHTML = obj.str;
Isos na yparxei kai kalyterh methodos kai poio grhgorh apo ayth pou brhka alla dystixos den brhka kati allo pou na douleyei kalytera kai grhgorotera.

Thanks :D

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

AJAX responseXML & Internet Explorer

Δημοσίευση από skeftomilos » 10 Φεβ 2007 21:04

Ουπς! Το είχα ξεχάσει ότι το AJAX δουλεύει και με XML. Σε όλα μου τα projects (AJAX και μη) χρησιμοποιώ αποκλειστικά JSON.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 10 Φεβ 2007 21:37

Me mia 1h & grhgorh matia eida pos to JSON kanei xrhsh tou XMLHttpRequest() object to thema einai pos ayto to object den yposthrizete apo ton internet explorer, px gia firefox, netscape, opera exo grapsei to parakato:

Κώδικας: Επιλογή όλων

         var dom = xmlHttp.responseXML; 
          
         targetElement.innerHTML = dom$&#40;dom,where&#41;.innerHTML
Sto arxeio pou anoigo to xmlHttpRequest grafo se ena shmio to opoio ektelhte se mh MS IE browsers

Κώδικας: Επιλογή όλων

	if &#40;XMLHttp==null&#41;
	&#123;
		XMLHttp = new XMLHttpRequest&#40;&#41;
	&#125;
Oti kalei kai to JSON ap' oti katalaba

sthn synexeia otan kano open to xmlhttprequest grafo ton parakato kodika, opou elenxei an einai diatheshmo to XMLHttpRequest

Κώδικας: Επιλογή όλων

				if&#40;window.XMLHttpRequest&#41;
				&#123;				 
					if&#40;xmlHttp.overrideMimeType&#41; xmlHttp.overrideMimeType&#40;'text/xml'&#41;;
				&#125;
Kai etoimos o firefox, netscape kai opera, den gnorizo an yposthrizei allous browsers h parapano methodos.

Eno o MS IE mou ebgale thn pisth gia na katalhkso ston kodika pou grafo sto prohgoumeno post mou

EDIT:
Parepiptontos, dokimasa na grapso

Κώδικας: Επιλογή όλων

the_object = eval&#40;'&#40;'+xmlHttp.responseText+'&#41;'&#41;;

na kano ena alert to the_object na do ti bgazei kai mou petaei sfalma ston MS IE kai undefined ston firefox

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

AJAX responseXML & Internet Explorer

Δημοσίευση από skeftomilos » 11 Φεβ 2007 00:48

Ο κώδικας που προκαλεί το AJAX request είναι ανεξάρτητος από το format των δεδομένων που θα ταξιδέψουν από τον server στον browser (ή αντίστροφα). Όταν φτάσουν τα δεδομένα τότε αρχίζει να υπάρχει διαφορά. Π.χ. στο παρακάτω παράδειγμα μόνο η ρουτίνα processReqChange πρέπει να αλλάξει αν αλλάξει το format:

Κώδικας: Επιλογή όλων

var http
if &#40;window.XMLHttpRequest&#41; &#123;
  http = new XMLHttpRequest&#40;&#41; // Firefox, Opera.
&#125; else if &#40;window.ActiveXObject&#41; &#123;
  http = new ActiveXObject&#40;'Microsoft.XMLHTTP'&#41; // IE
&#125;

if &#40;http&#41; &#123;
  http.onreadystatechange = processReqChange
  http.open&#40;'GET', 'http&#58;//www.foo.com/someservice', true&#41;
  http.send&#40;&#41;
&#125;

function processReqChange&#40;&#41; &#123;
  if &#40;http.readyState == 4 && http.status == 200&#41; &#123;
    var results = eval&#40;'&#40;' + http.responseText + '&#41;'&#41;
  &#125;
&#125;
Αν τα δεδομένα δεν είναι σε valid JSON, τότε η εντολή eval θα προκαλέσει σφάλμα. Αυτό σημαίνει ότι πρέπει να αλλαχτεί και ο κώδικας που τρέχει server-side και φτιάχνει το response.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 11 Φεβ 2007 01:45

Ap' oti katalaba opote to responseText gia na leitourghsei prepei na einai JSON valid, ara tha prepei na kalei kapoio arxeio to opoio na mporei na tou epistrefei ena valid JSON eggrafo.

Ousiastika to JSON prospathei na antikatasthsei thn xml me liga logia. H malon kalytera, to JSON eimai mia enalaktikh methodos anti na xrhshmopoieis XML.

Ap' oti eida pantos to JSON sou prosferei megalyterh taxythta apo thn XML.

An omos to responseText einai enas html kodikas ston opoio esy den mporeis na parembeis tote anagkastika prepei na ton metatrepseis se JSON valid kai na ton diabaseis etsi? (an kai prosopika den nomizo na exei nohma ayth h diadikasia sthn prokymenh periptosh)

EDIT:
Mhn gelases :P kano mia prospatheia na antiliftho to JSON.
Esto oti exoume to parakato xhtml eggrafo (Valid)

Κώδικας: Επιλογή όλων

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http&#58;//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http&#58;//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Trying JSON</title>
</head>

<body>
<div id="master">
	<div id="sub">sub text</div>
</div>	
</body>
</html>
To parapano antistoixa se JSON tha ginei:

Κώδικας: Επιλογή όλων

&#123;
	'head'	&#58;
	&#91;
	 	&#123;'meta'	&#58;	&#91;&#123;'http-equiv'	&#58;	'Content-Type',	'content'	&#58;	'text/html; charset=utf-8'&#125;&#93;&#125;,
		&#123;'title'	&#58;	'Trying JSON'&#125;
	&#93;,
	'body'	&#58;
	&#91;
	 	&#123;'div'	&#58;	
		&#91;
		 	&#123;'id'	&#58;	'master'&#125;,
			&#123;'div'	&#58;	&#91;&#123;'id'	&#58;	'sub',	'value'	&#58;	'sub text'&#125;&#93;&#125;
		&#93;&#125;
	&#93;
&#125;
Elpizo na mhn petaksa kotsana :P :kaloe:

EDIT2:
Paizontas ligo parapano me to JSON brethika sto eksis:

me bash to parapano an kanoume

Κώδικας: Επιλογή όλων

alert&#40;results.head&#91;0&#93;.meta&#91;0&#93;.content&#41;;
tha mas emfanisei sto alert box to text/html; charset=utf-8 opos einai fysiko alla me to http-equiv ti tha ginei?

EDIT3:
Telika ontos poly oraio to JSON ap' oti eida h PHP apo thn ekdosh 5.2 kai meta parexei kapoies JSON Functions tis opoies tha koitakso kalytera ayrio :P (shmera dld)

Pantos se kapoia Web Services, px to poio aplo Web Service, RSS den tha to ekana me xrhsh JSON alla me XML fysika epidi den tha mporousan na to yposthriksoun oloi... kai genika fantazomai (isos kano lathos) oti to JSON den yposthrizete apo to eyri koino

EDIT4:
Asxeto, alla ebala to string tou JSON se mia gramh kai mou thymise poly to string pou fernei h serialize() ths php :P tha to elekso ayrio tora pao gia nani giati h ora phge 2:49 kai eimai kai gripomenos me bronxodi bhxa :D

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 11 Φεβ 2007 09:34

Kalh mera, brhka ena oraio arthro edo se ena shmio pou milaei gia thn asfaleia anaferei:
Notice in your example that you passed the response text directly into a call to eval. If you trust and control the server, that's probably okay. If not, a malicious server could have your browsers executing dangerous actions. In that case, you're better off using a JSON parser written in JavaScript. Luckily, one already exists.
sto json.org dinei ayton edo ton parser

H erothsh mou einai apla kata poso theoreis pos xreiazete kai an ton exeis dokimasei giati gia na xrhshmopoisei kapoios JSON to kanei gia taxythta kai mono, an einai o parser na kathisterei tote den exei nohma. Episeis, kata poso epikyndino einai to eval() an se periptosh pou otidhpote mpei entos eval() einai apo phgh thn opoia gnorizeis esy?

EDIT:
Episeis brhka kai ena poly oraio artho apo php|architect grameno apo ton Marco Tabini me titlo JSON and PHP: More Than Web Services

EDIT2:
panosru έγραψε:Paizontas ligo parapano me to JSON brethika sto eksis:

me bash to parapano an kanoume

Κώδικας: Επιλογή όλων

alert&#40;results.head&#91;0&#93;.meta&#91;0&#93;.content&#41;;
tha mas emfanisei sto alert box to text/html; charset=utf-8 opos einai fysiko alla me to http-equiv ti tha ginei?
Akyro :P tha to allakso se http_equiv kai ligei to thema :P

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

AJAX responseXML & Internet Explorer

Δημοσίευση από skeftomilos » 11 Φεβ 2007 11:33

Σχετικά με το http-equiv γράφεται έτσι:

Κώδικας: Επιλογή όλων

results.head&#91;0&#93;.meta&#91;0&#93;&#91;'http-equiv'&#93;
Αυτή είναι η εναλλακτική σύνταξη για την πρόσβαση σε ιδιότητες αντικειμένων. Π.χ. το παραπάνω μπορεί να γραφεί και έτσι:

Κώδικας: Επιλογή όλων

results&#91;'head'&#93;&#91;0&#93;&#91;'meta'&#93;&#91;0&#93;&#91;'http-equiv'&#93;
Αν και λίγο άχαρη στην όψη δίνει μεγάλη ευελιξία γιατί στη θέση των strings μπορούν να μπουν μεταβλητές:

Κώδικας: Επιλογή όλων

for &#40;p in results.head&#91;0&#93;.meta&#91;0&#93;&#41; &#123;
  alert&#40;results.head&#91;0&#93;.meta&#91;0&#93;&#91;p&#93;&#41;
&#125;
Τώρα βέβαια αν το μόνο ζητούμενο είναι να αντικατασταθεί μία σελίδα με μια άλλη, νομίζω το AJAX είναι εντελώς περιττό. Ένα απλό link αρκεί.

Σχετικά με τους κινδύνους του eval, αν γράφεις ο ίδιος τον server-side κώδικα που απαντά στο request, δεν υπάρχει θέμα. Εκτός αν δεν εμπιστεύεσαι τις προθέσεις του εαυτού σου! :-)

Και περαστικά για το βήχα!
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 11 Φεβ 2007 11:59

:P oxi eytixos me empisteyomai... malon! :P

Tora gia to an prepei na ginei se AJAX h me aplo link mhn to psaxneis to thema... sthn sigkekrimenh fash den einai dikh mou h apofash. Gia na sou doso na katalabeis peri tinos prokeite, einai ena project sto opoio thn mera paradoshs o pelaths zhthse.. h malon poio sosta.. apethse h selida sthn opoia ginete anazhthsh na mhn kanei refresh alla patontas se kapoia buttons pou exei ekei na allazoun ta dedomena xoris refresh (en telh zhthse sthn sigkekrimenh selida tou site tou na efarmostei h texnologia AJAX) to thema einai pos to zhthse kai teleytaia sigmh :P ti na tou peis.. den to kano? prospathisame na tou poume pos pleon den ginete kai mas apanthse me mia poly aplh frash.. "Ok, den plhrono tipota" :D opote ti na kanoume skeytikame me to team gia na bgei to project kai na fygei apo pano mas na to bazame se iframe, to thema einai oti oi digkekrimenes selides leitourgoun kapos perierga os apotelesma na prepei na allaksoun pola pramata, pragma to opoio einai xronoboro kai tha mas eperne poio poly apo to an kaname thn selida se AJAX, opote skeytomoun na kano me ajax request sthn idia thn selida kai lambanontas to responseText os XML eggrafo meso DOM na paro mono to periexomeno tou komatipou pou hthela apo thn selida. Alla syniditopoihsa pos kati tetoio den htan toso aplo gia ton Internet Explorer, tora entaksi brhka thn lysh kai deytera tha thn ensomatoso sto project opote ola kala :D

Thanks gia to tip tou results['head'][0]['meta'][0]['http-equiv'] doulepse perfect, m' arese poly to JSON kai skeytomai na to xrhshmopoio pleon kai sta epomena projects mou (an xreastoun tetoies methodous)

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

AJAX responseXML & Internet Explorer

Δημοσίευση από skeftomilos » 11 Φεβ 2007 13:02

Η αναζήτηση με AJAX έχει κάποιο νόημα αλλά με κόστος ότι χάνεται η bookmarkability των αποτελεσμάτων. Δηλαδή αν ένας χρήστης φτάσει σε κάποια ενδιαφέροντα αποτελέσματα, δε μπορεί να στείλει το URL σε ένα φίλο του για να τα δει κι αυτός. Αν το πείτε αυτό στον πελάτη μπορεί να αλλάξει γνώμη (αλλά μπορεί και όχι).

Για να ξεκαθαρίσουμε τώρα το θέμα της ασφάλειας, ας δούμε ως παράδειγμα τον κώδικα του άρθρου που ανέφερες:

Κώδικας: Επιλογή όλων

<script src="http&#58;//www.google-analytics.com/urchin.js" type="text/javascript"></script>
Ο webmaster αποφάσισε να ενσωματώσει στη σελίδα την υπηρεσία Google Analytics, για να αποκτήσει κάποια στατιστικά στοιχεία. Όμως αυτή η απόφαση εμπεριέχει κίνδυνο, καθώς δεν έχει κανέναν έλεγχο στον κώδικα του αρχείου urchin.js. Εκεί μέσα μπορεί να υπάρχει οτιδήποτε, από location.href = 'http://www.somewhere.else' ως document.write('<h1>THIS SITE SUCKS!</h1>'). Ακόμα χειρότερα, το αρχείο urchin.js μπορεί να αλλάξει ανά πάσα στιγμή, επομένως κανένας έλεγχος που γίνεται ΤΩΡΑ δεν εξασφαλίζει τι θα υπάρχει ένα λεπτό αργότερα. Ακόμα τρισχειρότερα, η Google μπορεί να σερβίρει διαφορετικό αρχείο urchin.js ανάλογα με την IP, τον referrer ή άλλα κριτήρια, οπότε ο webmaster δε θα έχει ιδέα του τι συμβαίνει κάτω από τη μύτη του.

Επομένως είναι ζήτημα εμπιστοσύνης. Στη συγκεκριμένη περίπτωση ο κίνδυνος είναι μηδαμινός καθώς θα αρκούσε μία και μόνο επιβεβαιωμένη περίπτωση malicious JS κώδικα στο urchin.js για να πληγεί ανεπανόρθωτα το κύρος της Google, με ανυπολόγιστες συνέπειες στην κερδοφορία της.

Γενικά πάντως το να καλούμε JS κώδικα από ξένο site ισοδυναμεί με το να παραχωρούμε την ιδιοκτησία της σελίδας μας, και θα πρέπει να έχουμε πολύ σοβαρό λόγο για να κάνουμε κάτι τέτοιο.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 11 Φεβ 2007 13:37

Symfono me ayta pou les, alla opos anafereis einai thema empistosynhs, den trabaei apo opoudhpote, apo thn Google trabaei ;)

Tora oson afora to arxiko thema tou thread aytou, mhpos tha mporouses na dosies kapoio tip etsi oste na graftei klalytera to to script pou exo grapsei merika posts poio pano (edo #252415)

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

AJAX responseXML & Internet Explorer

Δημοσίευση από skeftomilos » 11 Φεβ 2007 14:34

Χμ, να σου πω την αλήθεια δεν κατάλαβα και πολλά πράματα από τον κώδικα. Τι ακριβώς υποτίθεται ότι κάνει; Δημιουγείται HTML με βάση το AJAX response;

Αν ναι, μπορεί να γίνει με string concatenation (πιθανότατα με κακή performance). Αλλά ο τρόπος που προτιμώ είναι με JavaScript Templates.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

AJAX responseXML & Internet Explorer

Δημοσίευση από panosru » 12 Φεβ 2007 09:58

Ela sorry arghsa na apanthso, ousiastika den dhmiourgo html me bash to response apla kano ena request thn idia thn selida pou kanei to request kai topotheto se sigkekrimeno shmio kati apo ena allo shmio apo thn idia selida omos, gi' ayto to phga me xml, gia na mou epistrafei os xml to response kai na paro oti xreiazomai mono oxi olo to response.

PS: Oraia ta JavaScript Templates!! :D

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης