Nonostante sia ancora giovane come progetto, ho deciso di presentarvi la libreria da me realizzata, ExtendDOM.
Introduzione
Come si evince dal nome ( non sono riuscito a trovarne uno migliore ), essa permette di estendere il DOM, ovvero di creare dei metodi che vengono applicati a tutti gli oggetti del DOM automaticamente, in modo semplice, veloce e crossbrowser ( testato su Firefox 1.5+, IE6+ e Opera9 ).
Ciò accade anche per quegli oggetti creati con document.createElement ( per questo devo ringraziare il mitico Andr3a e il suo webreflection ).
Per adesso manca il supporto per quegli elementi creati con innerHTML, ma il problema riguarda solo IE.
Iniziamo da un esempio stupido: supponiamo di voler creare il metodo hide, che nasconde l'oggetto:
codice:
ExtendDOM("hide", function() { this.style.display="none"; });
-
Ovviamente il riferimento all'oggetto va fatto con l'operatore this.
Successivamente potremo usare il metodo con qualsiasi oggetto del DOM:
codice:
window.onload=function() {
document.getElementById("myelem").hide();
}
Gia nel file extendDOM.js è presente un metodo, addToEvent. Essa fa da attachEvent per IE e da addEventListener per i browser del w3c.
Tutto qui?
No. ExtendDOM è anche il core di una libreria modulare, ovvero composta da vari moduli che sono indipendenti tra di loro, ma che per funzionare necessitano appunto del core.
Per adesso sono presenti 3 moduli, presto ne aggiungerò altri:
1)megutility ( richiesteAjax )
2)megacolous ( effetti grafici )
3)easyDOM ( getter e setter )
Mi limiterò a descriverli velocemente ( altrimenti la discussione diventa troppo pesante ), maggiori dettagli sono nella documentazione
megutility
Megutility si occupa delle richieste asincrone ( ajax ). Onestamente, almeno per adesso, non ha nulla in più rispetto alle funzioni presenti sul web. Presto però verranno aggiunte nuove funzionalità.
Il metodo della megutility è innerAJAX:
codice:
document.getElementById("myelem").innerAJAX("myUrl.php", funzione);
Di default la richiesta è di tipo get ( lo so che ciò va controcorrente ). Maggiori dettagli li trovate nella documentazione.
Funzione è una funzione che viene eseguita dopo che la richiesta ha successo. E' incluso un preloader, di cui bisogna andare a cambiare il path manualmente.
magacolous
Scommetto che il nome vi ricorda qualcosa... che Thomas Fuchs mi perdoni
come già ribadito, è la parte grafica della libreria. Ancora ha parecchi difetti, comunque è molto leggera e dispone almeno degli effetti più basilari.
Permette di:
-rendere draggabile degli elementi;
-realizzare effetti fade ( transizione di opacità )
-muovere degli elementi
-cambiare le dimensioni di un elemento
E in studio un effetto resize.
Esiste anche una funzione effects, ma è tanto poco efficiente che evito di documentarla.
Piuttosto partiamo con gli esempi:
codice:
el=document.getElementById("myEl");
el.drag(funzione_al_mouseDown, funzione_al_mouseUp);
el.fade(0, 100, 10, 5);
el.scale(200, 200, 5, 5, 10);
el.move(700, -200, 5, -5, 10);
Essendo questo un esempio faccio partire tutti gli effetti contemporaneamente, inutile dire che non è consigliabile.
EasyDOM
Contiene alcuni metodi per settare e prendere elementi, in modo da facilitare l'interazione col DOM.
Per adesso ha quattro metodi:
1)getElementsByAttribute(attributo, valore, tags, flagIndexOf)
2)get_(byWhat, argomenti)
3)setAttributes(attributi)
4)setArrayProperty - per problemi di compatibilità con IE, setArrayProperty è una semplce funzione, non un metodo.
1)getElementsByAttribute permette di prendere tutti gli elementi da un attributo, anche dalla classe o dagli eventi ad esso associati. Se si desidera che il valore possa essere qualsiasi, inserire "*" al posto di valore.
Stesso discorso per l'argomento tag.
L'ultimo argomento è di default settato a false ( apparte che con gli attributi evento ). Se settato a true, il confronto viene fatto per indexOf, meglio fare un esempio:
codice:
myElements=new Array();
myElements=document.getElementsByAttribute("class", "miaClasse", "*");
myElemenys=document.getElementsByAttribute("class", "miaC", "*", 1);
Nel secondo caso, essendo il flagIndexOf true, gli elementi verranno presi anche se il valore del corrispondente attributo contiene altri caratteri oltre a quelli dichiarati. e' meglio settarlo sempre a false se non è necessario.
2)get_ è semplicemente una forma abbreviata per prendere elementi, dall'id, dal tag o dall'attributo.
codice:
get_("id", "myEl").get_("tag", "div")[0].get_("at", "title", "prendimi se ci riesci!", "*")[0].style.color="red";
Davanti al primo get si può anche mettere document o un qualsiasi altro oggetto, ma per semplicità, nella maggior parte dei casi può essere omesso.
3)setAttributes, lo dice a parola stessa, setta più attributi in un colpo solo, anche la classe e gli eventi ( i valori di questi non vanno tra virgolette )
esempio:
codice:
get_("id", "myEl").setAttributes({
title:"nuovo titolo",
class:"nuova_classe",
onclick:function() { alert(this.title); }
})
4)setArrayProperty permette di settare una proprietà ( ma anche di richiamare un metodo ) di ogni elemento di un array.
esempio per le proprietà:
codice:
setArrayProperty(myArray, "title", "nuovo titolo");
esempio per i metodi ():
codice:
setArrayProperty(myArray, "setAttribute('title', 'nuovo titolo')");
come detto precedentemente, setArrayAttribute non è un metodo ma una semplice funzione.
ExtendDOM e le altre librerie
ExtendDOM è un progetto ancora molto ma molto giovane e di certo non è al livello di strumenti quali jquery, prototype o mootools.
Chi già utilizza queste librerie non avrà molto interesse a migrare verso ExtendDOM...
In realtà esiste un punto d'incontro: attraverso ExtendDOM, le funzioni di queste librerie possono essere trasformate in metodi, in modo da semplificare di molto il codice e renderlo più omogeneo.
Ciò diventa un grosso vantaggio per librerie quali prototype, poichè sarebbe possibile evitare di dover ogni volta specificare Element.extend.
Esistono termini per l'uso di ExtendDOM e dei suoi moduli?
Solo uno: lasciare inalterati i commenti.
Links
Scarica ExtendDOM
Documentazione
L'intro della libreria ( interamente in javascript )
Sono ben accetti commenti, critiche e suggerimenti.