On 01/04/12 18:40 , nixs wrote:
> ok, visto che nell'ultimo messaggio mi dici di far riferimento a questo,
> rispondo qui.
> allora, ho inserito nella tua funzione questa:
È importante che tu capisca il codice, e non semplicemente lo copi
vedendo se funziona o meno, quindi cercherò di spiegartelo passo passo.
È utile che tu lo controlli perché il codice potrebbe anche presentare
typo o errori – io lo scrivo di getto sul NG, e non sono un grande
utilizzatore di jQuery.
Un appunto, ho supposto che utilizzassi l'ultima versione di jQuery, se
ne utilizzi un'altra fammi sapere, che il comportamento di `on` potrebbe
essere diverso.
> var deleteMessage = $("delete-window").html();
Qui ho fatto un errore, che presumibilmente è quello che ti genera
l'eccezione che menzioni. È una mia dimenticanza comune (le DOM API non
richiedono prefissi perché hanno metodi per ogni tipo invece di avere un
metodo per tutti i tipi), il codice corretto per jQuery è:
var deleteMessage = $("#delete-window").html();
In pratica la prima istruzione diceva "jQuery, cercami un nodo con
*tagname* 'delete-window', e recupera il suo contenuto HTML, mettendolo
nella variabile 'deleteMessage'"; mentre ciò che volevo era "jQuery,
cercami un nodo con *id* 'delete-window' e recupera il suo contenuto
HTML, mettendolo nella variabile 'deleteMessage'".
> $(document.body).on("click", ".link-delete", function() {
Questa istruzione dice "jQuery, quando sull'elemento body del document
avviene un click, se l'elemento cliccato ha classe '.link-delete',
esegui la seguente funzione.
> conferma(deleteMessage, this.href);
Dato che una funzione associata a un event handler (come nel caso di
"click") ha come context object (`this`) l'elemento cliccato, questa
istruzione dice "esegui la funzione `conferma` passando come primo
parametro `deleteMessage` e come secondo parametro l'href del link
cliccato."
> });
Qui c'è un'altra mia dimenticanza – che avevo aggiunto nel codice
originale, ma ho dimenticato di portare qui sotto, evidentemente –
ovvero un `return`, come puoi vedere dal codice che faceva uso di
`confirm`. Nel nostro caso, dato che è la tua `conferma` a prendersi in
carico di fare il redirect al link, bisogna aggiungere un `return false`
alla fine della funzione associata all'event handler.
Questo perché aggiungere `return false` in una funzione associata a un
event handler, equivale a chiamare `event.preventDefault()`, ovvero si
inibisce l'azione di default del browser per quell'evento. In un link,
l'azione di default dell'evento click è "naviga all'URL specificato
dall'href".
> Primo problema: ho inserito il display: none per evitare di farmi
> stampare l'html nella pagina.
Giustamente.
> Però, dubbio, quando la tua funzioncina "cattura" (se ho ben capito)
> l'html della div con id delete-windows,
> si porta dietro anche il display: none?
No, perché il metodo `html()` di jQuery (come puoi vedere dalla
documentazione) equivale al più esplicativo `innerHTML` delle DOM API,
ovvero ti recupera solo il codice HTML interno.
Il che significa, che se vuoi usare i CSS per mettere i padding etc,
devi farlo usando come elemento root quello in cui tale HTML andrà a
finire – altrimenti per semplicità puoi lasciare i CSS inline come hai
adesso, che è sempre meglio che averceli a mo' di stringa nel codice
javascript.
> Oppure no? Oppure devo aprire a
> mano la visibilità? E se si,
> come si fa???
Non ti serve in questo caso, ma per la cronaca sai già come si fa – del
resto lo hai usato per "visualizzare" la riga nascosta per l'editing. :)
> QUESTA, IN PARTICOLARE, è una cosa che non ho mai capito in js: il link
> href, COSA NE SA che deve prima
> eseguire una funzione???
DOM (Document Object MOdel) e JavaScript sono due cose differenti: usi
JS per interagire con il DOM. In pratica tramite JavaScript associ una
funzione all'evento "click" del link. Quando quel link viene cliccato,
la funzione viene eseguita.
> Non se ne va per i fatti suoi alla pagina linkata?
> Sono riuscito ad utilizzare la console errori di Opera (l'unica che
> segnala errori!) ed ecco che dice:
Strano, gli errori dovresti vederli in tutte le console – sicuramente in
quella di Firefox. Ricordati solo di aprire la console prima di eseguire
il codice che potrebbe generarti l'errore – se la apri dopo che l'errore
è accaduto non necessariamente lo vedi.
> [01/04/2012 18:34:18] JavaScript - (la mia pagina)
> Event thread: click
> Uncaught exception: TypeError: Cannot convert 'message' to object
> Error thrown at line 47, column 2 in <anonymous function:
> $.prompt>(message, options) in ... (file js impromptu)
> if(message.constructor == String)
Suppongo che il problema sia esattamente quello descritto poc'anzi,
cercando un nodo con tagname "delete-message", e non trovandolo, il
metodo `html()` restituisce `null` invece che una stringa, rilanciando
un eccezione a questo check.