Newsgroup: it.comp.lang.javascript
Titolo: Ricerca di codice html

Salve a tutti,
mi sto scrivendo uno scriptino per greasemonkey(firefox), e ho esigenza 
di trovare, usando javascript, la fine di un sorgente html (quindi devo 
trovare la stringa "</body></html>") per poi sostituirla con altro 
codice prima di reinserire i tag di chiusura... come posso fare per fare 
sta cosa?
Grazie a tutti per le risposte!

Mondoscuro ha scritto:

E il DOM ?

Mondoscuro ha scritto:

Premesso che non ho mai usato Greasemonkey, in generale per
fare quel che chiedi tu servono le Regular Expressions.
raenkrus


eh il problema è che non sto cercando un oggetto da modificare 
(altrimenti userei document.getElementById() e avrei risolto ) ma devo 
trovare appunto la stringa "</body></html>" e sostituirla con altro 
codice html...
mi sfugge quale funzione potrei usare per posizionarmi prima del tag di 
chiusura del body... mi serve qualcosa a cui posso passare l'intero 
codice html della pagina e la stringa da cercare....

 codice html della pagina e la stringa da cercare....
Ammettilo, c'č un posto all' "Ufficio Complicazioni Affari Semplici" che ti
fa gola. :)
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 }
perche la metti a null
te l'ho gia' visto fare anche altre volte, in particolare in un caso in cui
lo scope della variabile era limitata alla funzione in cui l'avevi
dichiarata, motivo?

 dichiarata, motivo?
come sarebbe a dire "motivo"? Hai forse riscontrato qualche problema
nell'impostare la variabile a null? :)


 
Grazie mille Zero, mi ritrovo "sim sala bim" esattamente dove mi serve :)
Ho un problema però... se sostituisco la formula magica con un sorgente 
html, mi ritrovo il sorgente come testo della pagina, invece dovrebbe 
essere interpretato per mostrarmi quello che il codice html deve generare...
il codice html è questo:
<form name="form1" method="post" action="">
   <div align="center">
     <p>
       <textarea name="notepad" rows="10" id="notepad"></textarea>
       <br><input name="save" type="submit" id="save" value="Salva">
     </p>
   </div>
</form>
e tutto l'ambaradan che ne risulta è questo:
var notepad = "<form name=\"form1\" method=\"post\" action=\"\"> <div 
align=\"center\"> <p>     <textarea name=\"notepad\" rows=\"10\" 
id=\"notepad\"> </textarea> <br><input name=\"save\" type=\"submit\" 
id=\"save\" value=\"Salva\"> </p> </div> </form>"
var yugi = document.createTextNode(notepad);
	document.body.appendChild(yugi);
	yugi = null;
come ti ho detto, mi ritrovo il sorgente html nella pagina web, mentre a 
me serve avere i controlli di testo e il bottone di salvataggio... una 
volta ottenuto questo dovrò fare in modo che la textbox venga riempita 
leggendo da un file di testo e il bottone salva aggiorni il file 
salvandoci il contenuto della textbox (non pretendo che mi spieghi 
tutto, proverò prima a farlo da solo ;)

 nell'impostare la variabile a null? :)
no, cmq,
apparentemente sembrerebbe una cosa inutile, ma, essendo certo che tu non
faccia tali cose, mi interessava saperne il motivo (per valutarne
l'addottamento o meno..)

 tutto, proverò prima a farlo da solo ;)
Il salvataggio lo devi fare per forza server side :)
(premesso che non si tratti di file sul client, come già detto)


 l'addottamento o meno..)
Vediamo un po': Perché ti sembra inutile?


 Vediamo un po': Perché ti sembra inutile?
mi sembrerebbe un'azione utile nel caso cio' causasse una sorta di
deallocazione della memoria, un po' come potrebbe fare delete...
ma in questo caso non dovrebbe essere cosi' per via dello scope della
varibile ,
allora sembrerebbe un toglierti dalla tentazione di riutilizzare un
riferimento...
una sorta di di abitudine stilistica del tipo:
if( 10 == variabile )
per evitare degli assegnamenti non voluti...
nel caso mi interesserebbe cmq il motivo per sapere gli eventuali risci che
potrei correre io
tanto piu' mi interessa la cosa, nel caso questo abbia degli effetti...

 (premesso che non si tratti di file sul client, come già detto)
allora... io ho la possibilità di usare un file remoto per gestire il 
contenuto della textbox, perchè ho un serverino in lan... ma se 
qualcun'altro volesse usare questo script, per forza di cose devo 
utilizzare un approccio client based, dato che non tutti hanno un server 
web in casa :P
Di positivo c'è che chi usa questo mio script sa cosa questo script fa e 
può leggere il sorgente, per cui da un punto di vista di "intenzioni" 
sono completamente apposto :)
Se l'accesso al filesystem è problematico, ci sono altre soluzioni che 
possono essere utilizzate per gestire informazioni localmente? si 
potrebbe infilare il tutto in un cookie?
Intanto mi leggo il link che mi hai passato e provo a raccattare un pò 
di info su quello che possono fare gli script all'interno di 
greasemonkey, magari l'estensione fornisce un qualche supporto per fare 
sta cosa...

 per evitare degli assegnamenti non voluti...
Tutte disquisizioni senza senso, e che non rispondo alla domanda.
Non ti ho chiesto secondo te come mai puň essermi utile. Tant'č che puoi
solo supporre, dato che non sei nella mia testa.
Ti chiesto perché a TE sembra inutile. :)


 Se l'accesso al filesystem è problematico,
No, non è problematico. Nel caso di un'extesion utilizzi XPCOM. Sulla rete
sicuramente troverai tutte le informazioni che ti necessitano. Ad esempio su
xulplanet:
 
http://www.xulplanet.com
Mi pare che anche in questo NG sia stato scritto qualcosa (mi pare da
Agostino De Matteis).


 
stavo riflettendo su come risolvere in pratica le mie necessità.... per 
la lettura (quindi da file a textbox) posso usare tranquillamente 
qualsiasi tecnica appartenente alle estensioni di firefox, in modo da 
ritrovarmi i dati nella textbox al momento del caricamento...
nell'operazione di salvataggio però ho qualche problema, dato che nel 
momento in cui clicco sul bottone per salvare devo in qualche modo 
inviare il contenuto del textbox al file, ma in quel momento non sta 
girando nessuna estensione... quindi o devo usare l' onClick e 
inventarmi una qualche funzione javascript in grado di accedere al file, 
oppure devo usare l'action del form per reindirizzare il contenuto della 
textbox da qualche parte...
nel primo caso ho il problema, come dicevi tu, che potendo fare 
affidamento su una semplice funzione javascript non posso accedere al 
filesystem... nel secondo caso, forse posso inviare il POST del form a 
qualche pagina finta che in realtà reindirizza ad uno script (sulla rete 
ho trovato questo suggerimento:
You can save stuff to the persistent store (GM_getValue, GM_setValue),
then include a fake about: page, such as
about:blank?greasemonkey/your.namespace/your.user.js, upon which you
can output whatever you want.
url originale della discussione dove ho preso il pezzetto:
http://www.archivesat.com/greasemonkey.mozdev.org/thread735122.htm

 can output whatever you want.
Direi che fa proprio al caso tuo. :)


 
http://www.archivesat.com/greasemonkey.mozdev.org/thread735122.htm
Uhm, ma stai scrivendo un'estensione per FF o un user script per
greasemonkey?
Nel secondo caso vedi: 
http://dunck.us/collab/GreaseMonkeyUserScripts
Puo' essere interessante anche:
http://www.oreillynet.com/pub/a/network/2005/11/01/avoid-common-greasemonkey-pitfalls.html
'bye

 Direi che fa proprio al caso tuo. :)
ho studiacchiato un altro pò, credo di avere 3 strade:
1) è quella citata sopra, ossia di mandare il POST allo stesso script... 
il problema è che non ho idea di recuperare il path (soprattutto lo 
"your.namespace")... per farlo funzionare sul pc mio potrei anche fare a 
mano, ma se voglio fare una cosa portabile devo inventarmi una 
soluzione... e soprattutto devo studiarmi come recuperare i dati.. a 
quanto pare 2 script diversi non possono condividere i dati, quindi in 
qualche modo devo usare lo stesso script...
2) potrei provare la strada dei cookies, alla fine devo leggere e 
scrivere una cosa sola (il contenuto della textbox)... mi basterebbe 
mettere il codice di lettura all'interno dello userscript e inserire il 
codice di scrittura del cookie insieme all'html del notepad nella 
pagina, così da poterla poi richiamare con l'evento onclick del button...
forse è la soluzione più semplice ma temo anche quella più "agricola" :P
3) dai link che ha pubblicato Agostino, forse potrei trovare un modo per 
referenziare la GM_setValues dalla pagina web, con una cosa del tipo:
[resto dello script]
yugi = null;
var elmButton = document.getElementById('save');
elmButton.addEventListener("click", GM_setValue, true);
in questo modo l'esistenza di un riferimento alla GM_setValue che 
sopravvive alla sandbox di GM, dovrebbe permettermi di richiamare la 
GMsetValue dalla pagina web, che lancerei con qualcosa del tipo:
[resto del codice]
<textarea name="notepadbox" rows="10" id="notepadbox"> </textarea> <br>
<input name="save" type="submit" id="save" value="Salva" 
onClick="GM_setValue('box',notepadbox.value)">
ovviamente sono solo supposizioni, non ho idea di quale potrebbe essere 
tra le 3 la soluzione più "ecologica" e corretta...


Agostino grazie dei link, sono stati molto interessanti (soprattutto 
quello dei pitfall)... se ti interessa la discussione, leggiti il mio 
reply a Zer0, sto cercando di scegliere la strada migliore...
sto cercando di fare intanto uno userscript per greasemonkey, anche se 
mi piacerebbe riuscire a fare una estensione tutta mia...

Sto provando la soluzione 2, quella dei cookies...
a quanto pare il "null" che viene scritto dentro la textbox testimonia 
come la lettura del cookie funzioni... ora il problema è riuscire anche 
a scriverlo :D
l'userscript è diventato così:
var writecookie = '\n<script language="JavaScript" 
type="text/JavaScript">\n<!--\n' +
'function Set_Cookie(name,value) {\n' +
'var cookieString = name + "=" +escape(value) + ";expires=NEVER";\n' +
'document.cookie = cookieString;}\n' +
'//-->\n</script>\n';
var notepad = '<form name="form1" method="post" action="">\n' +
'<div align="center"> <p> \n' +
'<textarea name="notepadbox" rows="10" id="notepadbox">' + 
Get_Cookie('oNotepad') + '</textarea> <br> \n' +
'<input name="save" type="submit" id="save" value="Salva" 
onClick="Set_Cookie(\'oNotepad\',notepadbox.value)"> \n' +
'</p> </div> </form>\n';
var yugi = document.createElement("div");
	document.body.appendChild(yugi);
	yugi.innerHTML = writecookie + notepad;
  	yugi = null;
}
ed il risultato è questo:
  <div>
<script language="JavaScript" type="text/JavaScript">
<!--
function Set_Cookie(name,value) {
var cookieString = name + "=" +escape(value) + ";expires=NEVER";
document.cookie = cookieString;}
//-->
</script>
<form name="form1" method="post" action="">
<div align="center"> <p>
<textarea name="notepadbox" rows="10" id="notepadbox">null</textarea> <br>
<input name="save" id="save" value="Salva" 
onclick="Set_Cookie('oNotepad',notepadbox.value)" type="submit">
</p> </div> </form>
</div></body></html>
però perchè la console javascript di firefox mi scrive:
Errore: Set_Cookie is not defined
File sorgente: http://<omissis>
Riga: 1
non gli piace che la set_cookie sia piazzata proprio prima del form? 
dovrei metterla insieme a tutti gli altri javascript della pagina? se 
si, come si fa?Non ne ho idea :(

 'var cookieString = name + "=" +escape(value) + ";expires=NEVER";\n' +
expires=NEVER? questo mi puzza (senza entrare nel merito della vostra
discussione che non sto seguendo) ...se funziona mi torna utile in un caso,
uhm, vado a cercare documentazione.
-- 
"qualcuno è andato per età
 qualcuno perchè già dottore
 e insegue una maturità, si è sposato, fa carriera
 ed è una morte un po' peggiore"
									    F.G.

Alla fine mi sto pian piano avvicinando... al momento riesco a leggere e 
a scrivere il cookie, il problema è che quando vado a salvare, viene 
memorizzata solo la prima riga della testbox... il codice che uso è questo:
<textarea name="notepadbox" rows="10" id="notepadbox">prova1
</textarea> <br>
<input name="save" id="save" value="Salva" onclick="document.cookie 
='oNotepad' + '=' + notepadbox.value + ';expires=NEVER';" type="submit">
come ho detto funziona, ma salva solo la prima riga della textarea... 
come mai?
è un problema dello "scrittore", perchè se imposto a mano il cookie, 
quando lo carico ha tutte le righe che ho inserito, invece quando premo 
su salva, spariscono tutte tranne la prima...

 Ti chiesto perché a TE sembra inutile. :)
piu' o meno mi sembra di averlo fatto
io pero' ti avevo chiesto, prima, perche' lo facessi e una risposta come la
tua "non mi serve piu'", mi semra abbastanza equivalente ad un "perche'
si'"
Allora insisto e ci riprovo, perche'?

 Allora insisto e ci riprovo, perche'?
Ribadisco, perché non mi serve piů. Quel che vuoi sapere tu, č probabilmente
un'altra cosa. Alla quale dovresti arrivarci da solo (e suppongo che lo
farai, con le "imbeccate" di cui sopra).


 farai, con le "imbeccate" di cui sopra).
Tanto per capire anch'io... ha qualcosa a che vedere col fatto che, facendo
un test (ancora in corso), la memoria occupata dal browser sembra crescere
lentamente ma inesorabilmente? E' ben accetta una risposta da scegliere tra
"sě" e "no" :)
-- 
Nando [?]
Apostolo della Prova

 "sì" e "no" :)
Sarebbe sbagliato risponderti in entrambi i modi. :)
Non ho idea del test che hai fatto, ma può darsi che in una certa misura
abbia a che vedere con quanto dicevamo (quindi "si") ma non credo
direttamente (quindi "no").
Se quella "certa misura" è effettivamente collegata al discorso di poc'anzi,
è probabilmente inerente al "come javascript distrugge le variabili", o
meglio: Come vengono liberate le risorse in js, puntate dalle variabili.


 meglio: Come vengono liberate le risorse in js, puntate dalle variabili.
Attendo lo svolgimento del thread ^_^


 Attendo lo svolgimento del thread ^_^
Potresti benissimo "svolgerlo" te, il thread. :P
P.S.
Ma ora che ci penso, che ti parlo ancora a fare? Dopo la storia di Milano...
-____-


 -____-
Uff, hai ragione :-/


 Come vengono distrutte le variabili in Javascript?
OOHHH
ho appena fatto una scoperta 
var str = new String( 'ciao' );
alert( str );
delete str;
alert( str );
ma come cavolo si distruggono le variabili
devo supporre che le insinuazioni che facevo sin dall'inizio, avevano un
fondamento...
Riconosco che non ho mai avuto l'esigenza di liberare memoria inquanto la
maggior parte delle volte le cose "allocate" erano in variabili automatiche
dentro a funzioni che pensavo "si occupassero a fare pulizia"... 
vabbe' piu' o meno, ci siamo capiti.
dove trovo risorse per chiarirmi un po' le idee in merito?
oltre che la tua persona ;)

 dove trovo risorse per chiarirmi un po' le idee in merito?
Nella reference del linguaggio, innanzitutto..


 
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator
mai usato 'sto coso ... deve quindi semplicemente togliere il var? che
senso ha? forse perché le var dentro le function si "autodistruggono" al
termine della stessa?
e un var x=0; all'esterno di una function? Pensavo fosse irrilevante
esplicitarlo oppure no, invece eccola qua la differenza (con un var diventa
statico e indistruttibile, senza var puoi distruggerlo con delete).
Interessante
-- 
"e mai che mi sia venuto in mente
 di essere piů ubriaco di voi
 di essere molto piů ubriaco di voi"
									  F.D.A.

 Interessante
.. Ma che vi ha fatto di male questa povera reference, per essere ignorata e
non considerata cosě da tutti? Povera stella.. Insomma, non vi fa neppure un
po' di tenerezza? Vergogna! :P


 po' di tenerezza? Vergogna! :P
:-)
dalla mia guida volante (js5.6 reference di Microsoft, non sbranarmi ma č
la piů veloce per le poche volte che la utilizzo [praticamente solo per
ricordarmi qualche carattere speciale per RegExp]):
"If the result of expression is an object, the property specified in
expression exists, and the object will not allow it to be deleted, false is
returned."
pensa te cosa puň uno capire sul perché non te lo fa cancellare!!
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 Nella reference del linguaggio, innanzitutto..
ok, fatto
non voglio sapere il motivo per cui chi ha sviluppato JS si sia inventato
questa distinzione del var o meno, cmq mi sembra un po' una str....ta
cmq lasciando subito la nota polemica e ti vorrei chiedere:
come devo fare per non mandare in warning la console JS di FF la quale non
gradisce questo tipo di dichiarazioni...
come si puo' fare nel caso in cui la variabile e' locale alla funzione? si
setta undefined o a null? e' o non e' distrutta alla "chiusura" della
funzione?

 funzione?
è distrutta alla chiusura della function.
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 gradisce questo tipo di dichiarazioni...
ma che bello :( la guida stessa avverte e sconsiglia :(
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Variables#Declaring_Variables
delete funziona solo per variabili dichiarate con l'ommissione di var, la
cui cosa non sarebbe da usare, ergo neppure delete -_-;

 farai, con le "imbeccate" di cui sopra).
Forse ho capito, e devo dire che l'avevo sospettato fin dall'inizio, pero'
per evitare di dire cagate gigantesche, mi ero rispoarmiato la bacchettata
sulle dita (poi vabbe' ne sono arrivate altre dieci, che pero' hanno dato i
loro frutti)
leggendo un po' di documentazioni qua e la' e di articoli, alla faccia del
lavoro che devo consegnare con un ritardo mostruoso :(
ho trovato che mettendo a null i riferimenti ad oggetti del DOM (ad es.)
si possono evitare i brutti memory leaks (soprattutto per IE)
ad es.:
function addHandler()
{
    var obj = document.getElementById('my_elem');
    obj.onclick = function()
    {
        this.style.backgroundColor = 'red';
    }
    obj = null;
}
ora in questo caso se non si impostava quel partivolare evento con
soprattutto quella particolare azione, ad es.:
function addHandler()
{
    var obj = document.getElementById('my_elem');
/*
    obj.onclick = function()
    {
        alert('ciao');
    }
*/
    obj = null;
}
settare a null non avrebbe avuto un gran significato informatico, quindi
forse si tratta di una buona abitudine che ti sei prefisso per evitare di
incappare in queste scomode situazioni
quante str..zate ho detto?
:P
e se cosi' fosse perche' tanti "misteri" e non dirlo esplicitamente,
dandola come linea guida di buona programmazione
forse perche' appunto ho detto tante str..zate  :(

 funzione?
Continui perņ a non rispondere alla domanda che ti ho fatto. :)


 Continui perņ a non rispondere alla domanda che ti ho fatto. :)
Se devo essere sincero, non sono sicuro di ricordarmela ;)
e anche tu non scherzi a non rispondere :P

 e se cosi' fosse perche' tanti "misteri" 
Nessun "mistero". Chi legge i miei post sa che con alcune persone, quelle
che hanno un qual interesse a imparare e non gli utenti occasionali che
vogliono la pappa pronta, cerco di fare in modo che ci arrivino da soli alle
cose; spronandoli alla ricerca, alla lettura della documentazione e così
via.
Questo perché sono profondamente convinto che il maggior valore di acquisire
una data conoscenza, non sia nell'informazione fine a sé stessa; ma nel come
questa sia stata acquisita. Del percorso personale fatto per giungervi.
Inoltre ci sono altri indubbi vantaggi, ma ora non vorrei mettermi a tenere
un sermone sulla cosa :)






ok grazie
Ti chiederei un'altra cosa:
esiste nella reference 1.5 un equivalente di
http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.3/reference/image.html
e di tutte quelle parti della guida che mi sembra che siano state
sottintese nella 1.5 differentemente dalla 1.3 ? (o perhce' gia' presenti
in essa)