Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Oggetti DOM come wrapper di elementi HTML

    Ciao,
    mi trovo in un contesto in cui non posso utilizzare framework JavaScript e quindi non posso avvalermi di tutti i vantaggi che offre un wrapper degli elementi HTML.

    Sto cercando quindi una soluzione per poter assegnare dei dati agli oggetti DOM senza sporcare il sorgente generato con attributi inconsistenti.

    Facendo un po' di test, ho riscontrato che gli oggetti DOM sono già di per sé dei wrapper degli elementi HTML che rappresentano, infatti non tutti gli attributi assegnati agli oggetti DOM si traducono in attributi che il browser applica sugli elementi HTML.

    Un semplice esempio:

    codice:
    some anchor text
    
    <script>
    document.getElementById('myLink').href = 'http://www.example.org/';
    </script>
    Dato il link, l'assegnazione sopra riportata funziona in quanto l'attributo href è ammesso per gli elementi "A".
    Nel sorgente generato infatti trovo:
    some anchor text

    Se invece assegno all'oggetto DOM un attributo che non è previsto per i tag "A", non ne troverò traccia nel sorgente generato:

    codice:
    some anchor text
    
    <script>
    document.getElementById('myLink').data = 'http://example.org/';
    </script>
    Il sorgente generato resta invariato:
    some anchor text,
    ...tuttavia l'oggetto DOM lo memorizza perfettamente, tanto che resta sempre accessibile sia in lettura che in scrittura.

    L'attributo tra l'altro può memorizzare anche oggetti più o meno complessi:

    Codice PHP:
    <html>
    <
    head>
        <
    title>DOM test as a wrapper</title>
    </
    head>
    <
    body>
    [
    url="#"]some anchor text[/url]

    <
    script type="text/javascript">
    // salvo una metainformazione dell'oggetto
    document.getElementById('myLink').data 'http://example.org/';
    alert(document.getElementById('myLink').data); // ok, è stata salvata

    // modifico la metainformazione con un oggetto letterale:
    document.getElementById('myLink').data = {
        
    uno'sono cambiato',
        
    due'salve ragazzi'
    };
    // la richiamo in lettura:
    alert(document.getElementById('myLink').data.uno);
    </script>
    </body>
    </html> 
    Vi chiedo quindi feedback su questa soluzione: ha qualche drawback?
    E' per caso già stata utilizzata da qualche library nota o testata da qualcuno di voi?

    Grazie

    P.S. Se avessi potuto usare jQuery, non avrei esitato ad avvalermi del comodo metodo data().
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    gli expando arbitrari sono trattati con molta cautela per via del memory leak che generano,
    per evitare memory leak vanno rimossi

    credo che questa lettura ti torni utile

  3. #3
    Originariamente inviato da Xinod
    gli expando arbitrari sono trattati con molta cautela per via del memory leak che generano,
    per evitare memory leak vanno rimossi

    credo che questa lettura ti torni utile
    Grazie Xinod, lettura molto interessante.

    Ho capito che il metodo data() di jQuery non sporca l'elemento perché memorizza i metadati sull'oggetto DOM in una proprietà definita (credo) con l'uuid; questo su tutti i browser tranne che su MSIE, che, ci piaccia o no, trasforma le proprietà assegnate all'oggetto DOM in attributi dell'elemento HTML e non si può far diversamente.

    L'importante è quindi eliminare i metadati quando non servono più o al massimo all'unload del documento, per fare in modo che gli sfigati utenti di MSIE non vadano in balla...

    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.