Avatar billede karl-koder Nybegynder
24. april 2008 - 13:05 Der er 15 kommentarer og
1 løsning

Eget javascript framework

Hejsa,

Jeg sidder og roder med at lave mit eget "framework" hvor jeg kan have forskellige metoder der gør livet lidt lettere for mig.

Men hvordan bære jeg mig ad og hvad er den mest almindelige fremgangsmåde.

Jeg havde forstillet mig noget i stil med nedenstående :

if (typeof myLibrary == "undefined"){
    myLibrary = {
       
        byId : function(name){
            return document.getElementById(name);
        },
       
        byTag : function(name){
            return document.getElementsByTagName(name);
        },
    }
};

var ml = myLibrary;

Men jeg vil gerne have lidt input til det så jeg kommer ordenligt fra start, så håber på der sidder nogle der kan hjælpe mig lidt på vej ;o)

Eller hvis nogen ligger inde med links til nogle artikler/tutorials om emnet så vil det også være super.
Avatar billede w13 Novice
24. april 2008 - 13:09 #1
Du kan evt. kigge lidt på infix operators og prototype.
Avatar billede karl-koder Nybegynder
24. april 2008 - 13:42 #2
Er det noget alá myLibrary.prototype.byId = function() du tænker på, eller er det Prototype.js, hvis det sidste er tilfældet så er jeg blevet frarådet at bruge den.

infix operators, hvad er det og kan du give et eksempel ?
Avatar billede w13 Novice
24. april 2008 - 13:45 #3
Det er bestemt ikke prototype.js ;)

Infix operators gør det vist muligt at lave sine egne operatorer. (Jeg er ikke selv særlig meget inde i det.)

Hvis du er klar på noget engelsk, tørt læsning og at skulle holde tungen lige i munden, så ka' du kigge her: http://javascript.crockford.com/tdop/tdop.html
Avatar billede jokkejensen Novice
24. april 2008 - 15:51 #4
Syntes personligt det er lidt tidligt at gå i stå, hvis man mener man selv kan lave det bedre end prototype, jquery, yuiblog's dom/eventdom. Der sidder dygtige professionelle personer bag de fleste. Hermed ikke forstået som om jeg mener jeg selv kan.

Men generelt tror jeg du skal sørge for at have en fornuftigt arkitektur, og bryde det op i nogle flere klasser, og have mulighed for at tilgå de allerede statiske metoder som getElementById statisk..

Men det er nok vigtigst du først sætter dig lidt mere ind i mulighederne med OOP, bare lave noget generelt - før du bygger et framework du sikkert vil basere dine kommende sites på.

Yderligere skader det ikke at se på prototype.js eller en anden, og lave det nogenlunde magen til, men med sit eget præg - så kan du jo fjerne alt det forfærdelige kode der er - og lave dit eget.

Vh. Jacob
Avatar billede karl-koder Nybegynder
24. april 2008 - 16:32 #5
"Gået i stå" ?

Jeg har sikkert forklaret mig forkert, men ideen med dette indlæg var jo netop at få noget input til hvordan andre har grebet det an.

Og ordet "framework" er måske nok også en forkert overskrift. Men hvis ikke jeg spørger, lære jeg jo heller ikke. Ideen var at tage nogle af de ting jeg bruger igen og igen og ligge dem i klasser til genbrug andre steder.

Så hvis du kan komme med nogle fornuftige links til artikler eller andet der kan hjælpe mig på vej er du mere end velkommen til at smide dem her ;o)
Avatar billede olebole Juniormester
25. april 2008 - 00:28 #6
<ole>

Pas på! Du kan have gang i noget meget kompliceret, som der måske - med al respekt - max. er fem på Eksperten, der kan løse. Men det kommer selvfølgelig anpå, hvad det præcist er, du vil lave  =)

Umiddelbart kan jeg ikke se, det er ret meget, du sparer ved at skrive:
    var o = myLibrary.byId("myID");

- fremfor:
    var o = document.getElementById("myID");

Til gengæld har du stor sandsynlighed for at lave slemme uhensigtsmæssigheder, hvis du også begynder at ville lave metoder, der håndterer events.

Hvis man hovedsagelig arbejder med mindre procedurale scripts, kan det nok bedst betale sig at lave en lille samling wrappers. Du kunne f.eks. skrive noget à la:

d = document;
gE = function(id){return d.getElementById(id)};
gT = function(o,t){return o.getElementsByTagName(t)};
gN = function(n){return d.getElementsByName(n)};
cE = function(t){return d.createElement(t)};
cT = function(s){return d.createTextNode(s)};

Skal du evt. bruge dem på andre dokumenter, kan du med undtagelse af gT - som jo ikke er knyttet til dokument objektet - tillade et valgfrit argument i de viste funktioner:
    gE = function(id, D){return (D?D:d).getElementById(id)};

- nemlig det 'fremmede' dokument objekt. Det kunne f.eks. være et XML-dokument objekt i ét namespace eller et HTML-dokument objekt i en (i)frame.
NB: Det er vigtigt, du bruger et stort 'D' for det 'fremmede' dokument, så JS kan skelne de to dokument objekter fra hinanden.

Du kunne også klistre det hele på et objekt med et ekstremt kort navn:

_ = {d: document};
_.gE = function(id){return this.d.getElementById(id)};
_.gT = function(o,t){return o.getElementsByTagName(t)};
_.gN = function(n){return this.d.getElementsByName(n)};
_.cE = function(t){return this.d.createElement(t)};
_.cT = function(s){return this.d.createTextNode(s)};

Så reducerer du antallet af variabler, der sejler rundt i det globale scope til én - og holder stadig skriveriet nede på et minimum

/mvh
</bole>
Avatar billede olebole Juniormester
25. april 2008 - 00:39 #7
Artiklen om infix operatorer bygger på en metode på JavaScripts Object objekt: Object.beget. Object objektets prototype bør du dog ikke begynde at pille ved, da det meget ofte kan skabe problemer
Avatar billede karl-koder Nybegynder
25. april 2008 - 14:37 #8
For det første er jeg ikke ude på at lave en forkromet Prototype/jQuery løsning men en object/klasse/namespace/framework eller whatever i vil kalde det, til at ligge nogle metoder i som jeg bruger igen og igen.

olebole >> "Umiddelbart kan jeg ikke se, det er ret meget, du sparer ved at skrive: var o = myLibrary.byId("myID");"

Nej det kan jeg heller ikke se nogen fordel i, udgangspunketet for hele dette senarie var at lave en "skal" hvori jeg kan ligge nogle metoder og her tager jeg den helt simple :

// Tjekker om myLibrary er initialiseret.
if (typeof myLibrary == "undefined"){
    myLibrary = {
        // Forkortet udgave af document.getElementById
        byId : function(name){
            return document.getElementById(name);
        }
    }
};

var ml = myLibrary;

Så kan jeg med noget mindre tasten lave følgende :

ml.byId("minDiv");
document.getElementById("minDiv");

Når det er sagt så var intensionen med dette indlæg ikke en diskution om min måde at forkorte ting på men en ingangsvinkel til hvordan jeg laver skallen til at holde på mine metoder, så jeg på sider der skal bruge dem kunne kalde dem med simple midler som ml.minFunction("minDiv").
Avatar billede olebole Juniormester
25. april 2008 - 20:21 #9
Jamen, så er det vel bare at gøre, som du gør. Der er jo ikke så mange måder at lave et statisk objekt på  =)
Avatar billede olebole Juniormester
25. april 2008 - 20:23 #10
- men jeg er stadig ikke helt med på dit formål. Jeg forstår heller ikke, hvorfor der skal oprettes to identiske objekter
Avatar billede karl-koder Nybegynder
26. april 2008 - 07:25 #11
Det med de 2 objekter var en copy/paste bøf. Ideen var :

// Tjekker om myLibrary er initialiseret.
if (typeof myLibrary == "undefined"){
    myLibrary = {
       
    }
    ml = myLibrary;
};

Så kan jeg tilgå objektets metoder med ml.myFunc().

Hele ideen med dette indlæg var i alt sin enkelthed at kommer frem til hvordan jeg laver en "skal" hvori jeg kan have nogle metoder jeg bruger igen og igen igennem mit projekt.
Avatar billede olebole Juniormester
26. april 2008 - 13:23 #12
Jeg tror, du misforstår. Hvorfor både 'myLibrary' og 'ml'? Hvorfor ikke bare kalde objektet 'ml' fra start, når du alligevel ikke ønsker at bruge 'myLibrary'? Ingen grund til at døbe sønnen 'Herbert Leopold Maximillian', hvis man dagen efter og resten af livet kalder ham 'Ib'  ;o)

Derudover er det som sagt bare at gøre, som du gør nu. Der er ikke så mange måder at lave sådan et objekt på. Derimod kan der måske være issues i de enkelte metoder, men det kommer jo helt anpå, hvilke metoder du ønsker at inkludere.
Avatar billede karl-koder Nybegynder
26. april 2008 - 17:25 #13
Ok så kalder jeg den bare ml fra start ;o)

Hvad angår metoder så er der her i starten tale om at få puttet metoder i objektet som jeg bruger igen og igen i mine projekter og det er typisk metoder vedr. ajax kald, metoder til at vise/skjule elementer, metoder som dem du har vist ovenfor, metoder til event handlere osv.

Jeg forsøger mig frem med det og så ser jeg om ikke jeg kan få noget fornuftigt ud af det med tiden ;o)
Avatar billede jokkejensen Novice
28. april 2008 - 12:24 #14
Ellers tag at hent visual webdeveloper, der er intellisence til js. Eller der er i hvert fald i VS2008.

Så er der ingen grund til at skulle forkorte de allerede eksisterende objekter.

Altså jeg kan med "d.g [enter]" skrive "document.getElementById("")".
Avatar billede karl-koder Nybegynder
28. april 2008 - 19:29 #15
Jeg har VS2008 installeret men er ikke begyndt med den endnu, så det kunne jo være jeg skulle gøre det ;o)
Avatar billede karl-koder Nybegynder
20. februar 2009 - 00:52 #16
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester