« # »

Stylus, la nueva API de acceso a elementos HTML

Después de unos días de desarrollo he terminado la versión 0.6 de una API que voy a estar utilizando en algunos de los trabajos en los que estoy metido, que sirve para acceder de una forma muy sencilla a los elementos de una página.

El nombre que le he puesto a esta forma de acceso a los elementos de una página es CSSPath, ya que usa ciertas partes de la sintaxis de acceso a elementos de CSS, añadiendo el acceso por indices (elemento[Posición]).

La forma de uso es muy sencilla, ya que para todos los que sepáis CSS os será una buena forma de empezar a hacer vuestros scripts no intrusivos.

Por ejemplo podéis añadir eventos a todos los botones de una página que sigan un patrón:

JavaScript:
  1. window.onload=function(){
  2.     for(var i=1;i<=10;i++){
  3.         var btnAra = Stylus.extract("#btnXtr"+i);
  4.         btnAra.onclick=function(){
  5.             alert(this.value);
  6.         }
  7.     }
  8. }

En este caso sería lo mismo que usar getElementById, pero la gracia está en las búsquedas combinadas (pulsa para ver los ejemplos)

Si necesitáis algo "high level" que os de un 100% de seguridad podéis usar jQuery.

En las próximas versiones implementaré búsquedas por lotes pasando varios valores en un array:

JavaScript:
  1. var elementos = ["li","#elemento .class","#elemento[2] .class"];
  2. Stylus.extract(elementos);

Lee el resto para ver el código:

El código de la API es el siguiente (descargar stylus.js):

JavaScript:
  1. var Stylus={
  2. getElementsByClass:function(css,obj){
  3.     var s = [];
  4.     var els = obj.getElementsByTagName("*");
  5.     for(var i=0,t=els.length;i<t;i++){
  6.         var clase = els[i].className;
  7.         if(clase == css){s[s.length]=els[i];}
  8.     }
  9.     return s;
  10. },getObj:function(obj,que){
  11.     var tFill;var element;
  12.     var qq=que.indexOf("[");
  13.     var u=que.charAt(0);
  14.     if(qq!=-1){
  15.         var num=que.substring(qq+1,que.length-1);que=que.substring(0,qq);
  16.         tFill=true;
  17.     }else{
  18.         tFill=false;
  19.     }
  20.    
  21.     if(u=="#"){//ELEMENT ID
  22.         que=que.substring(1,que.length);
  23.         element = obj.getElementById(que);
  24.     }else if(u=="."){//CLASS
  25.         que=que.substring(1,que.length);
  26.         element=Stylus.c2a(Stylus.getElementsByClass(que,obj));
  27.     }else{//TAGNAME
  28.         //IMPLEMENTAR CLASS EN TAG (li.pepe);
  29.         element=Stylus.c2a(obj.getElementsByTagName(que));
  30.     }
  31.     if(tFill){
  32.         if(Stylus.isco(element)){var elemx=Stylus.c2a(element.getElementsByTagName(que));
  33.         }else{var elemx = element;}
  34.         element = elemx[num];
  35.     }
  36.     return element;
  37. },extract:function(ex,obj){
  38.     if(!obj){obj=document;}
  39.     var inici;var fi;
  40.     var es=ex.indexOf(" ");
  41.     var pare=(es!="-1");
  42.     inici=ex.substring(0,es);fi=ex.substring(es+1,ex.length);
  43.     if(inici=="")inici=fi;
  44.     if(pare){
  45.         robj=Stylus.getObj(obj,inici);return Stylus.extract(fi,robj);
  46.     }else{
  47.         var robj=Stylus.getObj(obj,inici);
  48.         if(Stylus.isco(robj)){robj=Stylus.c2a(robj);}
  49.         return robj;
  50.     }
  51. },isco:function(q){
  52.     if(!q)return false;
  53.     return !q.tagName&&!q.push;
  54. },c2a:function(colection){
  55.     var sortida=[];
  56.     for(var i=0,tcol=colection.length;i<tcol;i++){sortida[sortida.length]=colection[i];}
  57.     return sortida;
  58. }}

Comentarios

  1. ricardo cabello | Marzo 3rd, 2007 | 6:34 pm

    http://ricardocabello.com/?postid=323

  2. marc | Marzo 3rd, 2007 | 7:40 pm

    Ricardo, conozco JQuery y también conozco Prototype (y su superfunción $). El tema es que prefiero desarrollar yo mismo este tipo de aplicaciones para poder adaptarlos al 100% a mis necesidades y para aprender.

    Añado que a JQuery no se le puede hacer sombra y que esto lo he hecho para mi gusto y difrute.

    Aparte que de todo se aprende :) y con la comida de cabeza que me he pegado para terminar esto me siento orgulloso de mi mismo.

  3. ricardo cabello | Marzo 4th, 2007 | 2:13 pm

    He de decir que cuando puse el link no habia llegado a la parte del post donde dabas a entender que lo habias hecho tu :P Pense que hablabas de algo que habias encontrado por ahi, asi que me dije, yo creo que encontre algo mejor, y te lo puse.

    Si te lo has currado tu, entonces chapo! :D

Deja un comentario

(*: Datos necesarios para dejar un comentario)

Get Adobe Flash playerPlugin by wpburn.com wordpress themes