Newsgroup: it.comp.lang.javascript
Titolo: anchor con XHR

E' possibile passare ad una richiesta XmlHttpRequest un URL che
contenga un hashmark (#) per l'ancoraggio ad una pagina in modo da
visualizzare un punto prestabilito del documento?
La soluzione più ovvia a mio avviso è quella di passare direttamente
la "location hash" all' URL da inviare alla richiesta istanziandolo ad
esempio in questo modo: fileref.php#anchor . Io non ci sono ancora
riuscito...
E' possibile abilitare l'url della richiesta XHR ad ammettere
un'ancora nel suo path che venga valutata e soddisfatta?
Sto cercando approcci diversi visto che forse questo metodo non
funziona.. qualche consiglio?
Grazie a tutti

 funziona.. qualche consiglio?
volentieri ma dovresti spiegare il contesto e accennare alle tue conoscenze
in queste ambito informatico

 in queste ambito informatico
Mediocre. Sto cercando di imparare. Se vuoi maggior chiarezza posso
mostrarti il codice... magari il concetto è ancora un poco astratto.
Nel frattempo ti ringrazio...

 l'anchor. 
Si, ma nei tempi sbagliati. Prima imposti l'hash (onclick) poi parte
la richiesta (href): è ovvio che non vada, dato l'anchor non esiste.
Riassumendo:
- prima fai la chiamata XHR.
- se va a buon fine, innesti il codice risultante nel document tree.
- a seguito, cambi l'hash della location.
Per quest'ultimo passaggio, ti consiglio come abitudine l'uso di:
	window.location.hash = "anchor";
piuttosto che:
	document.location.hash = "anchor";
E questo per diversi motivi.
In primis, un tempo quest'ultimo era considerato deprecated. Seconda
di poi, eviti di passare inutilmente da un oggetto (e in alcuni casi
tipo quando hai a che fare con la SOP, c'è differenza).
Del resto, essendo window l'oggetto implicito, la seconda riga è, in
effetti, questa:
	window.document.location.hash = "anchor";
-- 
~ Non esiste la certezza: è solo l'illusione di una realtà soggettiva.
(Fabio Mornati)

         window.document.location.hash = "anchor";
quindi:
function load() { document.location.hash='anchor'; }
Nel complesso mi sembra una soluzione soddisfacente.
Grazie ancora...

 Nel complesso mi sembra una soluzione soddisfacente.
Come ti ho detto, io opterei per qualcos'altro; ma se a te va bene..
-- 
~ Io sono il piů importante dei miei problemi.

 Come ti ho detto, io opterei per qualcos'altro; ma se a te va bene..
Ho inserito un timeout per dare modo alla richiesta di essere
completata prima di effettuare la location. In effetti è la
location.hash a creare l'intoppo: quest'ultima non intercetta
l'anchor. Ritardandone l'esecuzione con un timeout funziona.
Devo dire che l'effetto "delay" non mi dispiace neanche...

 completata prima di effettuare la location.
Basta agire sull'onreadystatechange. Alla peggio, nulla ti vieta di
modificare la tua funzione "XHR", in modo da passare come parametro
un riferimento a funzione da eseguire dopo aver inserito l'HTML nel
documento tree. Ma il procedimento è analogo.
-- 
~ "Le parole uccidono più delle pallottole.
Ma le pallottole arrivano prima."
(Raffaele Cutolo)

 completata prima di effettuare la location.
Basta agire sull'onreadystatechange. Alla peggio, nulla ti vieta di


 documento tree. Ma il procedimento è analogo.
In altri termini durante la chiamata XHR, intercetto la richiesta e
incorporo la location dopo che il caricamento dei dati è andato a buon
fine.
Una precisazione. Le anchor sono molteplici, quindi la location.hash
varia a seconda delle richieste. E' possibile ricorrere ad un unica
istanza XHR proprio come hai suggerito modificando la mia funzione
principale?
Forse dovrei chiarire meglio il contesto, ma per completezza posto il
codice:
function newXMLHttpRequest () {
	var httpRequest = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType) {
			httpRequest.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	return httpRequest;
}
function loadInnerHTML (elementId, fileName) {
	var req = newXMLHttpRequest();
	if (req) {
		req.onreadystatechange = function() {
			if (req.readyState == 4 && (req.status == 200 || req.status ==
304)) {
				var fileExtension = fileName.substring(fileName.lastIndexOf("."));
				if (fileExtension == '.js') {
					// this .js? sweet. eval the lot!
					eval (req.responseText);
				} else {
					// no .js extension? no problem! let's get our hands dirty
					var el = document.getElementById(elementId);
					var head = document.getElementsByTagName("head")[0];
					var re = /<script(\b[\s\S]*?)>([\s\S]*?)<\//ig;
					var match;
					// loop through script tags
					while (match = re.exec(req.responseText)) {
						// generate new script element
						var script = document.createElement('script');
						script.type = 'text/javascript';
						script.defer = 'true';
						// check for src property in this script tag
						var reSrc = /src="([\s\S]*?)"/ig;
						var strSrc = reSrc.exec(match[1]);
						if (strSrc != null) {
							// set js file url as src property
							script.src = strSrc[1];
						} else {
							// OR write js code between script tags
							script.text=match[2];
						}
						// add to DOM
						head.appendChild(script);
					}
					// todo: clear script tags and code from req.responseText first
					el.innerHTML = req.responseText;
				}
			}
		};
		req.open('GET', fileName);
		req.send(null);
	}
}
Grazie ancora... scusa l'ignoranza

 E questo per diversi motivi.
[cut]
ah interessante.
quindi mi confermi che andrebbe bene anche:
location.hash = "anchor";
scrivendo così, sarebbe come la tua prima, giusto?

 documento tree. Ma il procedimento è analogo.
Ho risolto. Ora va sicuramente meglio... grazie.

 Ho risolto. Ora va sicuramente meglio... grazie.
Ottimo. :) Spero di esserti stato d'aiuto, se non altro per farti
approfondire qualche argomento interessante.
-- 
"Se c'č qualcosa di piů importante del mio ego su questa nave,
la voglio catturata e fucilata."

 location.hash = "anchor";
Così come "andrebbe bene" anche usare:
	open("about:blank");
Ma si preferisce anteporre l'oggetto window, in ogni caso.
Il nocciolo della questione non è tanto evitare il document "per
risparmiar caratteri", ma perché si evita di mettere in mezzo un
secondo oggetto; che in questo caso è del tutto superfluo (e con
la SOP ti risulterebbe comunque problematico)


 la SOP ti risulterebbe comunque problematico)
sì, sì questo l'ho capito e questo con gli altri motivi erano "la cosa
interessante".
Io non volevo risparmiare carratteri, volevo una conferma che ommettendo
window nel caso specifico, il js engine non andasse a prenderlo da document
- perchè, ripensandoci, mi sembrava di aver letto che poteva esserci un
comportamento analogo, ma evidentemente sto delirando  :P

 approfondire qualche argomento interessante.
Questa discussione, in effetti, mi è stata molto utile. Mi scuso in
anticipo se insisto sull'argomento.
Si parlava di risolvere l'hash della location per ogni richiesta nella
quale si volesse associare un'anchor, passandola possibilmente come
argomento della funzione principale:
function loadInnerHTML (elId, fName, anchor) { // parametro anchor
        var req = newXMLHttpRequest();
        if (req) {
                req.onreadystatechange = function() {
                        if (req.readyState == 4 && req.status == 200)
                                        [cut]
                        el.innerHTML = req.responseText;
                        window.location.hash = anchor; // cambio
l'hash della location
                       }
                    }
                };
                req.open('GET', fileName);
                req.send(null);
        }
}
Invocando la chiamata ad esempio in questo modo:
<a onclick="loadInnerHTML('container', 'fileref.php',
'bottom_page')"></a>
viene istanziato l'anchor specificato.
Con esattezza, dopo aver innestato l'html nel document tree, nella
barra indirizzi appaiono l'hostname del server e l'hash: 
www.hostname.it/#bottom_page
Invocare una chiamata senza paramentro "anchor" restituisce:
www.hostname.it/#undefined
Come istanziare la richiesta per pagine che non hanno associate
anchor? Quale riferimento si potrebbe associare al parametro mancante?
In pratica:
if(anchor != null) {
  window.location.hash = anchor;
 } else { ???? }
Ciao e grazie.

  } else { ???? }
Nessun "else". Se non esiste l'anchor, non c'è nulla da impostare no?
if ( anchor ){
	window.location.hash = anchor;
}
-- 
~ "Solo i morti hanno visto la fine della guerra."
(Platone)

 }
Se non esiste, non si avrà nessuna variazione ottendendo lo stesso
hash per tutte le chiamate anche se ne sono sprovviste. Ovviamente il
problema non si presenta fin tanto che non si effettuano richieste con
l'anchor impostato:
onclick="loadInnerHTML('container', 'fileref.php', 'bottom_page')"
ottengo: 
http://hostname.it/#bottom_page
 .
onclick="loadInnerHTML('container', 'fileref.php')"
ottengo lo stesso URL invece di: 
http://hostname.it
Questo è da considerarsi un comportamento anomalo.

 Questo è da considerarsi un comportamento anomalo.
Dunque, invece di:
	if ( anchor )
		window.location.hash = anchor;
Si avrà:
	window.location.hash = anchor||"";
-- 
~ "It may be that the old astrologers had the truth exactly reversed,
when they believed that the stars controlled the destinies of men.
The time may come when men control the destinies of stars."
(Arthur C. Clarke)

         window.location.hash = anchor||"";
Avevo già provato una variante simile:
          if (anchor != null) {
                  window.location.hash = anchor;
          } else {
                  window.location.hash = "";
          }
Inoltre:
          if (anchor != null) {
                  window.location.hash = anchor;
          } else {
                  window.location.path = "/";
          }
Entrambi i tentativi producono una serie infinita di reload della
pagina inziale. Sarebbe ragionevole pensare che tale comportamento
venga scatenato dall'onload del body che, in un certo senso, viene
"reindirizzato" al termine della location:
<body onload="loadInnerHTML('container', 'home.php')">

 pagina inziale.
L'ultimo č palese, perché non stai cambiando l'hash, quindi ricarichi
per forza la pagina.
Per quanto riguarda il primo invece, impostando l'hash a "" ho notato
che su Firefox viene completamente rimossa (quindi anche il carattere
"#") causando il successivo reload, come se si fosse impostato un URL
differente. IE invece, per una volta, si comporta bene.
Per avere un comportamento omogeneo:
	window.location.hash = anchor||"#";
-- 
~ Io non soffro di pazzia, ne godo ogni minuto.
(I don't suffer from insanity, I enjoy every minute of it)

 pagina inziale.
L'ultimo č palese, perché non stai cambiando l'hash, quindi ricarichi
per forza la pagina (comunque č pathname, non path).


         window.location.hash = anchor||"#";
Credo che dovrò rassegnarmi. Se il parametro "anchor" è assente questa
è l'unica soluzione accettabile.
Grazie di tutto.

 è l'unica soluzione accettabile.
Purtroppo siamo sempre vincolati dal comportamento dei vari browser.
-- 
~ Tenete la morte lontano dalle strade. Guidate sul marciapiede.