login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Prototypejs, Event.Observe en Radiobtns (weergeven van DIV)

Offline liquido - 30/01/2008 14:53
Avatar van liquidoNieuw lid Hoi mensen,

Ik ben een beetje aan het spelen met prototypejs. Ik ben op dit moment bezig om dingen beter te stroomlijnen. Ik wil Event.Observe gebruiken voor mijn radiobuttons.Wanneer de gebruiker een radiobutton aanklikt dan moet de desbetreffende DIV worden weergegeven (niet alle radiobuttons hoeven perse een div weer te geven).

Ik heb het nu gedeeltelijk voor elkaar. Ik vind de code nog een beetje crappy, ik wil graag jullie mening hebben en de code met jullie delen. Hoe doen jullie zoiets (zonder prototypejs mag ook), geef jullie mening?

Ik vind het belangrijk dat ik de code kan hergebruiken (bijv. dat ik de elementen/waardes dynamisch uit de DB kan halen). De code moet makkelijk toepasbaar zijn voor zowel radio als checkbox.

Groet,
liquido

Dit heb ik nu:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <title>Radiobutton Test</title>
  4. <script language="javascript" src="js/prototype.js" type="text/javascript"></script>
  5. <script language="javascript" src="js/scriptaculous.js" type="text/javascript"></script>
  6. </head>
  7. <form id="myForm">
  8. <label><input name="send_type" id="send_type.register" type="radio" value="register"/>geregistreerde</label>
  9. <label><input name="send_type" id="send_type.unknown" type="radio" value="unknown"/> onbekende</label>
  10. </form>
  11.  
  12. <div id="register" style="display:none">Inside register..</div>
  13. <div id="unknown" style="display:none">Inside unknown..</div>
  14.  
  15. <script type="text/javascript">
  16. new Form.Element.EventObserver(
  17. 'send_type.register',
  18. function(element, value) {
  19. hide_all();
  20. $('register').show();
  21. alert(element.id + ", " + element.name + ", last value: " + this.lastValue + ", value: " + value);
  22. }
  23. );
  24.  
  25. new Form.Element.EventObserver(
  26. 'send_type.unknown',
  27. function(element, value) {
  28. hide_all();
  29. $('unknown').show();
  30. alert(element.id + ", " + element.name + ", last value: " + this.lastValue + ", value: " + value);
  31. }
  32. );
  33.  
  34. function hide_all(){
  35. $('register', 'unknown').invoke('hide');
  36. }
  37. </body>
  38. </html>

7 antwoorden

Gesponsorde links
Offline Ontani - 30/01/2008 15:11
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
op welk event reageert die EventObserver precies? of is dat eender welk event op die inputvelden?
Offline liquido - 30/01/2008 16:38 (laatste wijziging 30/01/2008 16:43)
Avatar van liquido Nieuw lid De event reageert wanneer ik op een bepaalde id (radiobutton) klik.

Dus:
send_type.unknown
send_type.register

Je kunt de code als het goed is zo copy pasten.
Alleen heb je de library van prototypejs nodig.
http://www.prototypejs.org/download
Offline Ontani - 31/01/2008 08:08
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
dus bij elke klik op een radio button wordt een actie uitgevoerd.

ik werk altijd met mootools en zou het op deze manier gedaan hebben:
  1. $A($('send_type.unknown'),$('send_type.register')).addEvent('click',function(event) {
  2. event = new Event(event);
  3. var element = event.target;
  4. hideAll();
  5. alert(element.getProperty('id') + ", " + element.getProperty('name') + ", value: " + element.value);
  6. });
Offline BramBo - 31/01/2008 13:09 (laatste wijziging 31/01/2008 13:34)
Avatar van BramBo JS gevorderde Zelf gebruik ik geen frameworks vooral niet in javascript(behalve dan mijn eigen microFramework), je eigen code kan dan wel korter geformuleerd worden maar in 99% van de gevallen gebruik je nog niet de helft van de framework methoden.

Het is trouwens altijd een slecht idee om je script in je body te plaatsen!

Anyhoo, ik zou het als volgt aanpakken:
Allereerst stel ik dat de Radio buttons alleen in een form voorkomen.
ik zou ervoor kiezen om een class te definiëren om de radios af te bakenen maar de IDs werken ook goed genoeg.

Nu, een eventlistener om de onclick listeners te binden. Window.onload lijkt me het best hier (hoewel DOMLoaded een beter alternatief is..) ook om de eenvoud.
  1. // ge-edite functie uit mijn microFW
  2. function hookOnload(eventName, callback) {
  3. if(window.addEventListener) window.addEventListener(eventName, callback, false);
  4. else if(window.attachEvent) window.attachEvent("on"+eventName, callback);
  5. }
  6.  
  7. var radioCache = new Array();
  8. function windowLoaded() {
  9. if(!document.forms) return false;
  10.  
  11. var x = document.forms;
  12. for(var i=0, j=x.length; i<j;i++) {
  13. for(var e=0, f=x[i].elements.length;e<f;e++) {
  14. if(x[i].elements[e].type=="radio") {
  15. if(!radioCache[i]) radioCache[i] = new Array();
  16. radioCache[i][e] = new RadioListener(x[i].elements[e]);
  17. radioCache[i][e].prefix = "sendtype_(.+?$)";
  18. radioCache[i][e].bind();
  19. }
  20. }
  21. }
  22.  
  23. return true;
  24. }
  25.  
  26. hookOnload("load", windowLoaded);


Zoals je ziet doe ik niet bij iedere click een nieuwe fetch(document.getElementById) dit omdat het gewoon sneller is om elementen te cachen en getElementById met rust te laten.
De RadioCache wordt op gebouwd in 2D n.l. : radioCache[FORMVOLGNUMMER].elements[ELEMENTVOLGNUMMER]

je ziet dat ik in de loop de prefix verander, dit is alleen ten demostratie - om te laten zien dat het eenvoudig te veranderen is.

En nu een associatief object voor de radio buttons(hierna staat al gerefereerd in windowLoaded().

  1. function RadioListener(ele) {
  2. var self = this;
  3. this.prefix = "sendtype_(.+?$)"; // Alles na sendtype is de id van de assoc div
  4. this.re = new RegExp(this.prefix);
  5. this.ele = ele || null;
  6. this.id = this.ele.id || -1;
  7. this.assocDiv = null; // Element Cache, geen nieuwe fetches!
  8. this.showing = true;
  9. this.bind = function() {
  10. if(this.assocDiv==null) this.assocDiv = document.getElementById((new String((this.id.replace(this.re, "$1")))));
  11. if(this.ele==null||this.assocDiv==null) return false; // Safety checks..
  12.  
  13. this.ele.onclick = this.click;
  14. this.hideAssoc();
  15. return true;
  16. };
  17.  
  18. this.showAssoc = function() {
  19. self.assocDiv.style.visibility = "visible";
  20. self.assocDiv.style.display = "block";
  21. self.showing = true;
  22. };
  23.  
  24. this.hideAssoc = function() {
  25. self.assocDiv.style.visibility = "hidden";
  26. self.assocDiv.style.display = "none";
  27. self.showing = false;
  28. };
  29.  
  30. this.click = function(e) {
  31. if(self.showing==false) self.showAssoc();
  32. else self.hideAssoc();
  33. };
  34. }



En tada je hebt clickable radio buttons. Reusable en geen frameworks 

Let wel: niet getest

Edit: ik was een hideAll functie vergeten, even toevoegen:
  1. Array.prototype.hideAll = function() {
  2. for(var i=0, j=this.length; i<j;i++) {
  3. for(var e=0, f=this[i].length;e<f;e++) {
  4. this[i][e].hideAssoc();
  5. }
  6. }
  7. }


en natuurlijk op de juiste plek aanroepen(showAssoc) met radioCache.hideAll();
Offline Ontani - 31/01/2008 14:03
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
en dan heb je zo'n code geschreven en kom je tot de conclusie dat het weer niet werkt in Internet Explorer of andere rot browser, mootools is compact 42 Kb groot en daarmee de moeite nog niet om te gaan discussieren dat je de helft niet gebruikt. je kan zelfs de modules die je nodig hebt appart samenstellen en downloaden op de site.
Offline BramBo - 31/01/2008 14:16
Avatar van BramBo JS gevorderde dan nog is en blijft het ~40x zo groot als deze code. Wanneer ik hem door een javascript obfuscator haal is hij slechts ~1100Bytes groot.
Plus voor crossbrowser oplossingen heb ik het miniframeworkje.

Maar waarschijnlijk heb je gelijk 42kb is ook weer zo groot nog niet, maar dat is alleen de core functies ? Hoewel ik het in de hand houden van mijn eigen code misschien nog wel van groter belang vind, zo kun je op de meest efficiënt mogelijke wijze programmeren zonder dat andermans methode je in de weg zitten en uiteindelijk tot de conclusie komt dat het toch beter is om deze te herschrijven.
En, er zitten vaak strict javascript errors in dit soort frameworks, zoals variable hiding, single returns etc.
Offline Ontani - 01/02/2008 09:37
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Die 42 KB is zelfs de volledige mootools library, uitgebreider als dat zul je het niet vinden . De core functie is zo'n 2KB groot.

En idd sommige frameworks beperken je mogelijkheden om je eigen stijl in scripten door te trekken maar met mootools heb ik tot nu toe hier geen enkel probleem gehad.

Je kent het lightbox effect wel zo'n div die op mysterieuze wijze over alles springt en fade naar zwart. met mootools maak je zoiets op 6 regels. Dit kan nog korter maar wordt het in mijn ogen onduidelijk.

  1. $('lightbox_div').effect('opacity').start(0,0.8);
  2. $('lightbox_div').addEvent('click',function(event) {
  3. event = new Event(event);
  4. var element = event.target;
  5. element.effect('opacity').start(0.8,0);
  6. });
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.2s