Newsgroup: it.comp.lang.javascript
Titolo: DOM su tag <area> ??

Per chi non avesse avuto la pazienza di leggere sotto, perchè troppo lungo,
pongo la domanda in questo modo:
secondo il DOM come accedo alla proprietà "href" contenuta in <area
href="..."> ?
es:
per una casella di testo accedo così:
[window].document.nomeForm.nomeCasella (con .value controlla anche il
valore)
come accedo al .href di <area>?
Grazie

valore)
var obj=document.getElementById("areaID");
areaHref=obj.href;
Specificando per il tuo <area> l'id "areaID".
In casi come questi e' comodo farsi un piccolo script che ti
visualizzi tutti gli attributi/properties/metodi di un object e vedere
se c'e' quello che cerchi :-)
'bye

 href="..."> ?
vedi 
http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26019118
Ciao.
	-Ema-

 areaHref=obj.href;
Innanzitutto ti ringrazio per la risposta, adesso sono riuscito ad accedere
alla proprietà, però a questo punto, purtroppo per inesperienza, non so se è
possibile disattivare il link e in quale modo. Cioè. una volta raggiunto
l'attributo( o proprietà ) href con questo riferimento:
document.getElementById("nomeIdArea").href
non so come disattivarne il valore, che nel mio caso è il seguente:
<area ... href = "javascript: goNext()"> il quale mi richiama una funzione,
go Next(), che serve per passare alla pagina successiva.
Ciao

Non so, sembrerebbe che nohref faccia al caso mio, ma non so come
applicarlo.
Nel W3C DOM ho trovato che devo associare questa proprietà (nohref) all'area
che intendo rendere inattiva, me il problema è che nel mio codice l'area in
questione ha già un suo href perchè deve essere attiva fin tanto che sono a
pagina 4( 
http://phpgogh.altervista.org/javascript/genitore.html
 )
A pagina 5 deve rendersi inattiva perchè non posso più proseguire, dato che
le pagine(dell'ipotetico sito) sono terminate
Perciò il mio codice contiene già un href in questo modo:
<area href="javascript: goNext()"> e non posso mettere un nohref al suo
interno, piuttosto dovrei cambiare il valore di href, ma ho già provato con
escamotage quali "#" ma che comunque rendeno sempre l'area attiva, seppure
poi il link non conduca a nessun indirizzo, ma per ottenere questo è stato
sufficiente impostare il codice con un controllo di flusso che fermasse lo
script alla 5 pagina...
ciao

go Next(), che serve per passare alla pagina successiva.
Alcune possibilita':
1) avvisi che e' l'ultima pagina:
document.getElementById("nomeIdArea").href=
	"javascript:alert('Ultima pagina!');";
2) non fai nulla:
document.getElementById("nomeIdArea").href="#";
3) "disabiliti/abiliti" l'elemento a secondo di quando ti serve (in
realta' lo elimini e poi lo reinserisci nella pagina):
var sarea=null;
function disableArea(flag){
 try{
 var mmap=document.getElementById("map1");
 if(flag){
	var marea=document.getElementById("nomeIdArea");
	if(sarea==null){
		sarea=marea;
	}
	mmap.removeChild(marea);
 } else {
	mmap.appendChild(sarea);
 }
} catch(e){alert("error: "+e.message);}
}
Con disableArea(true); elimini l'elemento (da usare per primo in modo
da salvare l'object) e con disableArea(false); lo ripristini.
Ovviamente il parent dell'elemento deve avere id "map1", modificare di
conseguenza html o script :-)
'bye

 <area href="javascript: goNext()">
<area href="javascript:;goNext()" onclick="return pagina<=1?false:true">
onclick ha precedenzasu href, quindi se pagina e` <=1 il return false blocca
l' esecuzione prima che arrivi a href, pero` rimane il cursore con la manina.
 
-- 
Ciao  [da casa]
  [web]  
www.gfcarlotti.it
 
    [mail]  text welcome in Reply-To
      [pgp]  
www.gfcarlotti.it/pgp/franco.asc

Me la sono stampata e me la studio, non ho ancora la padronanza di carpirle
al volo...
grazie mille, vi faccio sapere come è andata, sono due giorni che cerco di
risolvere questa cosa.
ciao e grazie ancora

 l' esecuzione prima che arrivi a href, pero` rimane il cursore con la
manina.
Infatti, in questo caso rimane il cursore con la manina e invece lo voglio
assolutamente togliere. Comunque non si finisce mai di imparare, non sapevo
il discorso della precedenza di onClick rispetto a href.
Grazie anche a te per la risposta, la terrò di conto per il futuro.
Ciao Vail

Prova con qualcosa del tipo:
var areaNode = document.getElementById("IdArea");
areaNode.parentNode.removeChild(areaNode);
Che e' piu' o meno quanto ti ha suggerito Agostino.
Ciao.
	-Ema-

 areaNode.parentNode.removeChild(areaNode);
L'ho provato e funziona alla grande.
Seppure devo ammettere che ancora non conosco parte del codice che mi hai
suggerito( ad esempio non conosco parentNode nè il metodo removeChild()),
perchè ho inziato da pochissimo a studiare javascript ma con gran
passione(consiglio ai neofiti come me Javascript "La Guida" di danny Goodman
4° edizione), l'ho provato e funziona alla grande. Il problema adesso è che
una volta disattivata l'area in questione non riesco più ad attivarla,
perchè nonostante abbia inserito queste righe di codice all'interno della
stessa funzione che controlla anche il "flusso" di avanzamento delle pagine
goNext() con qualcosa del tipo:
if (pagina < 5) {
  pagina += 1
  parent.dx.location.href = "dh" + pagina + ".html"
    if (pagina ==5) {
      var areaNode = document.getElementById("idArea");
      areaNode.parentNode.removeChild(areaNode);
   }
}
una volta che provo a richiamare la funzione goPrev() che è la medesima di
quella appena vista ma per tornare indietro nella pagine, l'area disattivata
rimane disattiva.
Comunque cercherò di risolvere vedendo se è possibile migliorare il
funzionamento del mio codice, altrimenti temo che dovrò attendere qualche
giorno in più per arrivare a capire le nuove(per il sottoscritto)
funzionalità che mi avete descritto.
Vi sono infinitamente grato, mi siete stati tutti di grande aiuto!
Ciao
Vail

 realta' lo elimini e poi lo reinserisci nella pagina):
L'ho fatto, purtroppo però quando passa alla funzione flag == false mi dà il
seguente errore:
"Error: puntatore non valido"
Mi disabilita l'area in questione ma non riesce a riabilitarla.
Puoi vedere l'esempio che ho realizzato su
http://www.phpgogh.altervista.org/javascript/genitore.html
Comunque riguardando il tuo codice in effetti anche io non ho ben capito
come fà ad aggiungere il nodo figlio se la variabile sarea è null...

> come fà ad aggiungere il nodo figlio se la variabile sarea è null...
OPS!! Non avevo visto(vista l'ora:-|) l'assegnazione if(sarea==null){
sarea=marea;
}
dove praticamente fai una copia dell'oggetto identificato da "nomeIdArea".
Resta il fatto che nell'esempio che ho riportato con link non funziona, il
problema deve essere il mio codice a questo punto. Se ti va di darci
un'occhiata ti sarei grato, altrimenti fa lo stesso, mi hai già detto quello
che avevo chiesto inizialmente e ti ringrazio.
Il tuo codice l'ho provato in locale su un piccolo file che visualizza due
pulsanti, uno che toglie l'altro che ripristina un campo di testo e
funziona, anche se ho tagliato qualcosa qua e là, vedi codice della
funzione, dove ho tolto l'inizializzazione di sRipristina e così anche il
suo if perchè comunque riesco a duplicare l'oggetto prima di cancellarlo. Tu
perchè li avevi inseriti?
<html>
<head>
<script language="JavaScript">
function mettiTogli(flag){
 try{
 var mForm=document.getElementById("mioForm")
 if(flag){
var mElimina=document.getElementById("idNome");
sRipristina=mElimina;
mForm.removeChild(mElimina);
 } else {
mForm.appendChild(sRipristina);
 }
} catch(e){alert("error: "+e.message);}
}
</script>
</head>
<body>
<form id="mioForm">
<input type="text" id="idNome" size="30">
<input type="button" value="Elimina campo di testo" id="idElimina"
onClick="mettiTogli(true)"
onClick="elimina()">
<input type="button" value="Ripristina campo di testo" id="idRipristina"
onClick="mettiTogli()">
</form>
</body>
</html>
Ciao
Vail

ALTRA CASTRONERIA: "...ho tolto l'inizializzazione di sRipristina e cosě
anche il
suo if perchč comunque riesco a duplicare l'oggetto prima di cancellarlo..."
Lo so, lo so, me ne sono accorto adesso, ho detto un'altra castroneria,
senza l'inizializzazione ed il controllo successivo va in pallette nel caso
richiamassi per primo la funzione senza passarle alcun valore perchč non sa
cosa sia sarea.
Adesso me ne vado a dormire...
Vail


http://www.phpgogh.altervista.org/javascript/genitore.html
Parto dal tuo codice e "semplifico" un po' facendo anche delle
aggiunte:
[...]
var numeroPagina=1; // metti tutto lo script in superioreSx.html
		       // compreso numeroPagina
var areaNext = null;
var nextDisabled=false;
var areaPrev = null;
var prevDisabled=false;
var mmap=null;
function disableArea(marea){ // disabilita area
 try{
  if(marea != null){
   mmap.removeChild(marea);
  }
 } catch(e){alert("error: "+e.message);}
}
function enableArea(marea){ // abilita area
 try{
  if(marea != null){
  mmap.appendChild(marea);
  }
 } catch(e){alert("error: "+e.message);}
}
function goNext() {
if (numeroPagina < 5) {
    numeroPagina++; 
    parent.dx.location.href = "dh" + numeroPagina + ".html";
    parent.basso.location.hash = "help" + numeroPagina;
    if(prevDisabled){
	prevDisabled=false;
	enableArea(areaPrev);
	// se la pagina non e' la 1a riabilita prev
	// era stato disabilitato andando nella 1a pagina con
	// goPrev
    }
    if (numeroPagina==5)  {
	// ultima pagina disabilita nextArea
	nextDisabled=true;
	disableArea(areaNext);
    }
}
return false;
}
function goPrev() {
  if (numeroPagina > 1) {
    numeroPagina--;
    parent.dx.location.href = "dh" + numeroPagina + ".html";
    parent.basso.location.hash = "help" + numeroPagina;
    if(nextDisabled){
	nextDisabled=false;	
	enableArea(areaNext);
	// se e' la penultima pagina riabilita next
	// disabilitato nell'ultima pagina con goNext
    }
    if(numeroPagina == 1){
	// prima pagina disabilita prevArea
	prevDisabled=true;
             disableArea(areaPrev);
    }
  }
return false;
}
function start(){
 // inizializza le variabili usate per accedere agli 
 // elementi
 mmap=document.getElementById("navigation");
 areaNext=document.getElementById("nextArea");
 areaPrev=document.getElementById("prevArea");
// siamo sulla prima pagina quindi disabilita prevArea
 disableArea(areaPrev);
 prevDisabled=true;
}
</script>
</head>
<body onload="start();"> 
<!-- 
inizializza 
-->
<map name="navigation" id="navigation"> 
<!-- 
 nel tuo codice avevi dimenticato l'id se non lo metti getElementById
non trova il map
-->
<area id="nextArea"
	shape="rect" 
	coords="0,0,200,200" 
	onclick="goNext();return false"
	href="#"
	onMouseOver="rollTop();" onMouseOut="rollOutTop();"/>
<area id="prevArea" 
	shape="rect" 
	coords="0,201,200,450" 
	href="#"
	onclick="goPrev();return false" 
	onMouseOver="rollDown();" 
	onMouseOut="rollOutDown();"/>
</map>
[...]
Prova e vedi se funziona.
'bye

 aggiunte:
Innanzitutto ti rigrazio moltissimo perchè credo non si trovino persone così
disponibili neanche a lezioni a pagamento. In secondo luogo non preoccuparti
di risolvere la questione, se ci riusciamo bene, altrimenti spero più
avanti, quando avrò terminato lo studio di JavaScript di chiedere nuovamente
il tuo aiuto e magari vedere insieme di risolverla, magari fornendoti un
codice più "pulito" e meno faraginoso.
Adesso veniamo al problema:
purtroppo il codice non funziona come dovrebbe, si comporta ancora in modo
anomalo:
ad esempio si pianta subito se vado alla seconda pagina e torno indietro
alla prima, oppure se quando arrivati alla pagina 5 ed indietreggiati anche
di una sola pagina si fa per tornare avanti di nuovo.
L'id della map lo avevo proprio dimenticato :-) ed inoltre avevo tralasciato
di curare la parte relativa all'area sottostante per testare se riuscivo
intanto a farne funzionare una con meno codice, per ingarbugliarmi meno dato
che non sono molto pratico direi :-)
Ho visto che hai richiamato le funzioni goNext() e goPrev() tramite il
gestore di eventi onClick piuttosto che come avevo fatto io da href, volevo
sapere se c'è una differenza sostanziale oppure se è una preferenza di
codice, altre cosette invece me le devo sempre vedere con attenzione.
Se vuoi vedere l'esempio con il codice che ho testato lo trovi già in linea.
Ciao e grazie ancora
Vail