Newsgroup: it.comp.lang.javascript
Titolo: clonazione e setAttribute

Ciao non riesco a far cambiare dinamicanete l'attributo name...l'id
viene cambiato correttamente ma ilnome no. Sapete dirmi il motivo?
Grazie
Alen
------
var clone = document.getElementById('TRmodello0');
var newTR = clone.cloneNode(true);
newTR.setAttribute('id','TRmodello'+n);
newTR.document.getElementById('Image0').setAttribute('id','Image'+n);
//ID immagine
newTR.document.getElementById('Image'+n).setAttribute('name','Image'+n);
//Nome immagine

ma posso anche manovrare i metodi? O solo gli attributi?
Perchè non mi funziona...almeno mi sembra
---
newTR.document.getElementById('Preview'+n).setAttribute("onClick","OpenWindow('Banner_Preview_image.asp')

Ok ho capito c'era un workaround per IE.
Ma cmq non riesco a cambiar nome un elemento...gli ID ok riesco...mah

 Ma cmq non riesco a cambiar nome un elemento...gli ID ok riesco...mah
Leggi qua: 
http://tinyurl.com/8qsj2
Per l'assegnazione degli handler, problema analogo con IE. Ti conviene, nel
tuo caso, fare oggettoImmagine.onclick=...
-- 
Nando [?]
Ex-Apostolo della Ex-Prova

Grazie per la dritt ama mi sono un po0 incartato.
In pratica clono un nodo e poi dovrei per l'appunto cambiate
l'attributo name del campo immagine:
var newTR = clone.cloneNode(true);
newTR.document.getElementById('Image0').setAttribute('id','Image'+n);
//ID immagine
//Nome immagine...non riesco a cambiarlo...
newTR.document.getElementById('Image'+n).setAttribute('name','Image'+n);
var newFld = createElement('file','Image'+n)
adesso dovrei rimpiazzare getElementById('Image0') presente nel clone
con quello appena creato...
sempre se non canno il codice.
----
il cod del link
function createElement(type, name) {
   var element = null;
   // First try the IE way; if this fails then use the standard way
   try {
      element = document.createElement('<'+type+' name="'+name+'">');
   } catch (e) {
      // Probably failed because we're not running on IE
   }
   if (!element) {
      element = document.createElement(type);
 
element.name
 = name;
   }
   return element;
}
------

 l'attributo name del campo immagine:
Non puoi farlo. Non puoi impostare a runtime l'attributo name su IE.
Personalmente eviterei semplicemente l'uso del name tranne che su gli elementi
form; eliminando il problema alla radice.
Oppure, visto che dai al name un valore progressivo:
newTR.document.getElementById('Image'+n).setAttribute('name','Image'+n);
E dato che il name non ha bisogno affatto di essere univoco (anzi), potresti
anche evitare di cambiarlo. Solo l'ID deve essere univoco, non il name. Tra
l'altro, spesso si mantiene lo stesso name per raggruppare gli elementi e
recuperarli tramite document.getElementsByName().
Insomma, bisogna capire perché ti serve il name, ed agire di conseguenza.
Ma se proprio ti dovesse servire una cosa del genere, un workaround potrebbe
essere il seguente:
<img id="dolly" name="test" />
<script type="text/javascript">
	var o = document.getElementById("dolly").cloneNode(false);
 
 
o.id
="neo-dolly";
 
	document.body.appendChild(o);
 
	if (typeof o.outerHTML!="undefined")
		o.outerHTML = o.outerHTML.replace(/name=[^\s>]+/,"name=test2");
	else
 
o.name
="test2";
 
	alert(document.body.outerHTML)
</script>
Scritto al volo, ma dovrebbe andare.
-- 
~ La donna è un male, ma un male necessario. (Aulo Gellio)

Grazie come sempre e scusa se riposto un po' in ritardo...ma non ho
avuto tempo.
Ok il tuo codice mi funziona....sia utilizzando il tuo semplice
esempio, sia con la modifica dei valori con i nomi esatti del mio caso
reale
------
<html>
<head>
</head>
<body>
<input name="Image0" id="Image0" type="file">
<script type="text/javascript">
	var o = document.getElementById('Image0').cloneNode(false);
 
o.id
 = 'Image1';
	document.body.appendChild(o);
	if(typeof o.outerHTML!="undefined"){
		o.outerHTML = o.outerHTML.replace(/name=[^\s>]+/,'name=Image1');
	}else{
 
o.name
 = 'Image1';
	}
	alert(document.body.outerHTML);
</script>
</body>
</html>
-------
però poi quando lo integro nel file della pagina non funziona nel
senso che il nome non me lo cambia....ci ho provato per un bel po' ma
nulla da fare e proprio non capisco. Il campo per l'upload dei file
rimase sempre nominato Image0, mentre l'ID giustamente varia.
Ora prima di dover fare marcia indietro...spero che tu riesco a capire
il mio problema.
Sotto hai il cod HTML isolato dell'elemento dinamico della pagina.
Come ti dicevo uso IE 6.0.
Grazie Alen
-----------
<html>
<head>
<script language="JavaScript" type="text/JavaScript">
//********************************
// per appoggio sotto
//********************************
function eventAdder(objAttrib,handler,addFunction){
   if ((!document.all)&&(document.getElementById)){
	   objAttrib.setAttribute(handler,addFunction);
   }
   //workaround for IE 5.x
   if ((document.all)&&(document.getElementById)){
	   objAttrib[handler]=new Function(addFunction);
   }
}
//********************************
// crea RIGA dinamicamente
//********************************
var n = 0; //GLOBALE
function Clona(){
	n+=1;
	var clone = document.getElementById('TRmodello0');
	var newTR = clone.cloneNode(true);
			newTR.setAttribute('id','TRmodello'+n); //La riga clonata...cambia
ID per l'eliminazione
			newTR.document.getElementById('Elimina0').setAttribute("href","javascript:Elimina("+n+")");
//Link su elimina banner
			newTR.document.getElementById('TRelimina0').style.display =
'inline'; //La riga che lo contiene
			newTR.document.getElementById('Image0').readOnly = false;
			newTR.document.getElementById('Image0').setAttribute('id','Image'+n);
//ID immagine
			eventAdder( newTR.document.getElementById('Preview0') ,"onclick",
"OpenWindow('Banner_Preview_image.asp?IDvoce=55&IDcheck="+n+"&Img='+document.getElementById('Image"+n+"').value,'preview','scrollbars=no,resizable=no,width=540,height=47>')"
);
			newTR.document.getElementById('Preview0').setAttribute('id','Preview'+n);
//bottone preview
			newTR.document.getElementById('Tabella0').style.display = 'none';
//Nascondi il checkbox lo span
			newTR.document.getElementById('Tabella0').setAttribute('id','Tabella'+n);
//Lo span che nasconde il check
			newTR.document.getElementById('Conferma0').checked = false;
//Deselezionalo
			eventAdder( newTR.document.getElementById('Conferma0') ,"onclick",
"Aux("+n+")" );
			newTR.document.getElementById('Conferma0').setAttribute('id','Conferma'+n);
//ID nuovo
			newTR.document.getElementById('Link0').value='';
			newTR.document.getElementById('AltText0').value='';
			document.getElementById('TRaddOn').appendChild(newTR);
			alert('PRIMA:'+document.getElementById('Image'+n).outerHTML);
			var o = document.getElementById('Image'+n).cloneNode(false);
			if(typeof o.outerHTML!="undefined"){
				o.outerHTML = o.outerHTML.replace(/name=[^\s>]+/,"name=Image"+n);
			}else{
 
o.name
 = 'Image'+n;
			}
			alert('DOPO:'+document.getElementById('Image'+n).outerHTML);
}
</script>
</head>
<body>
<table width="100%" border="0" cellpadding="3" cellspacing="1"
bgcolor="#F2F2F2" id="Tabella_form">
  <tr id="TRban1" style="display:inline;">
    <td><table width="100%"  border="0" cellspacing="0"
cellpadding="0">
        <tr id="TRmodello0">
          <td><table width="100%" border="0" cellpadding="0"
cellspacing="0">
              <tr id="TRelimina0" style="display:none;">
                <td height="18" align="center"
style="border-bottom-style: solid; border-bottom-color:red;
border-bottom-width: 1px;"><br>
                    <table width="110" border="0" cellpadding="0"
cellspacing="0">
                      <tr>
                        <td height="18" align="center"
class="TXTspecificheBlu"><a href="" class="UnderWhite"
id="Elimina0">Elimina </a></td>
                      </tr>
                  </table></td>
              </tr>
              <tr>
                <td class="TXTspecificheBlu" style="padding-top:7px">
				<input name="Image0" id="Image0" type="file" class="FormBase"
style="width:360px">
                    <input name="Preview" type="button"
class="FormBase" id="Preview0" value="Preview" disabled
onClick="OpenWindow('Banner_Preview_image.asp?IDvoce=1&IDcheck=0&Img='+document.getElementById('Image0').value,'preview','scrollbars=no,resizable=no,width=785,height=375');">
                    <span class="TXTspecificheBlu" id="Tabella0"
style="display:none">
                    <input name="Conferma" type="checkbox"
id="Conferma0" value="1" onClick="Aux(0);">
                    Confermato </span> </td>
              </tr>
              <tr>
                <td class="TXTspecificheBlu"><input name="Link"
type="text" class="FormBase" id="Link0" style="width:360px" size="114"
maxlength="150"></td>
              </tr>
              <tr>
                <td class="TXTspecificheBluLineaSotto"><textarea
name="AltText" cols="114" rows="3" class="FormBase" id="AltText0"
style="width:360px"></textarea></td>
              </tr>
          </table></td>
        </tr>
        <tr id="TRaddOn" style="display:none;">
          <td></td>
        </tr>
      </table>
        <hr width="100%" size="1">
        <table width="100%"  border="0" cellpadding="0"
cellspacing="0">
          <tr>
            <td class="TXTbase"><a href="#" class="UnderGreen"
onClick="Clona();return false;">[+] Inserisci ulteriore Cover</a></td>
          </tr>
      </table></td>
  </tr>
</table>
</body>
</html>

 reale
[snip]
Forse non sono stato del tutto chiaro nel mio post precedente: Perché hai
bisogno di cambiare il name di quell'elemento clonato? Non ne hai necessità.
Anche dando un'occhiata rapida al codice che hai scritto, se ne ha la
conferma.
Il codice che ti ho scritto, che modifica il name utilizzando quell'obrobrio
di outerHTML, era puramente a titolo accademico.
Spiegami per quale motivo dovresti cambiare il name; in tal caso mi metterò ad
analizzare il tuo codice e capire cosa c'è che non va. Ma ti assicuro che non
ce ne sarà bisogno.
Nel caso, comunque, non scrivere più nel NG tutto quel codice: conviene che tu
pubblichi una pagina online da qualche parte, anche perché sul newsgroup le
righe tendono a spezzarsi. Se il problema è su una riga di codice, a
riallinearla non ci si mette nulla, ma se è su tutto quel popo' di roba...
-- 
- Lei ha precedenti di pazzia in famiglia?
- Mio nonno credeva d' essere San Giuseppe...
- Io ci metterei un bel SI!

Perchè utilizzo un componente ASP per  l'upload dei file.
Da quanto ho capito e testato questi devono avere un name
univoco...altrimenti si incasina...è una versione vecchia di FileUp
della softartisans.
In passato utilizzavo la scrittura dinamica degli elementi ma per far
prima aimè ho utilizzato la clonazione....e per un pelo c'ero quasi
riuscito.
Grazie Alen.
Come arrivo a casa metto la pagina on-line da qui non riesco...spero
che cmq tu riesca ad allineare le righe spezzate...
BYE

E' qui un esempio on-line....
http://www.electroshopping.it/Intranet/Test/Simple.asp

 
http://www.electroshopping.it/Intranet/Test/Simple.asp
Bastava un solo post, non tre. :)
Allora. In primis, ignoro come facesse a funzionarti su Firefox, o su
qualsiasi altro browser che non sia di bocca buona come IE.
tutti quei:
	newTR.document.getElementById(..)
Sono completamente sbagliati, non hanno alcun senso. La JS console te
l'avrebbe notificato subito. Quindi, per il futuro, ti consiglio di testare il
codice su Firefox.
Sostituisci quei riferimenti, quindi, con un più semplice e corretto:
	document.getElementById()
eliminando il prefisso "newTR." 
In secondo luogo, stai facendo un po' un puttanaio con la clonazione.
Prima, cloni tutta la riga (TR) compresi i figli (e quindi anche il tag input
type=file dove devi andare a cambiare il nome); e poi per cambiargli il name
cloni nuovamente quell'elemento (senza poi giustamente "appenderlo" al DOM).
In sostanza, cloni l'elemento due volte e cambi il name all'elemento clonato
che poi non vai ad aggiungere. Ecco il perché di tutto.
Andando ad agire direttamente sull'outerHTML, però, dà un errore di runtime.
Probabilmente perché è un elemento clonato in modo indiretto (nel primo caso),
vai a capire te cosa passa per il capo a IE.
Alternativamente puoi fare la seguente cosa ( da sostituire nella porzione di
codice tra l'alert "prima" e l'alert "dopo"):
var o = document.getElementById("Image"+n);
 
if(typeof o.outerHTML!="undefined"){
	var nd =
document.createElement(o.outerHTML.replace(/name=[^\s>]+/,"name=Image"+n)),
		pn = o.parentNode;
	pn.replaceChild(nd,o);
}else{
 
o.name
 = "Image"+n;
}
-- 
- Vuoi tu questo corpo?
- E' una domanda trabocchetto?

 Perchè utilizzo un componente ASP per  l'upload dei file.
Non hai bisogno di componenti per fare l'upload di file in ASP.
Puoi benissimo farlo da codice di scripting. In VBScript ci sono dozzine di
esempi che lo fanno. Se invece usi JScript devi appoggiarti all'oggetto
ADODB.Stream per la gestione dei formati binari.
-- 
- Ray è completamente partito Egon, di te che ne è restato?
- Mi dispiace Venkman,il terrore travalica la mia capacità di razionalizzare

tutti quei: newTR.document.getElementById(..)
io pensavo che così mi riferivo all'elemento clonato.....
Ho provato a togliere tutti i newTR. dal codice e da errore...scusa ma
come ti riferisci agli elementi clonati
in var newTR = clone.cloneNode(true)?
Non ho capito perchè con newTR.document.getElementById('Elimina0')
dici che è sbagliato.
Se facessi semplicemente document.getElementById('Elimina0') non mi
riferirei all'elemento che c'è nella pagina e non a quello che sto
creando dinamicamente?
CMQ grazie...adesso va...intanto posso procedere

 creando dinamicamente?
Certo, ma lo stai già facendo.


Non tramite ID. 
Se non tramite ID in che modo?
CMQ grazie