Foros del Web » Programando para Internet » Jquery »

Scope de eventos y widgets

Estas en el tema de Scope de eventos y widgets en el foro de Jquery en Foros del Web. Buenas. Lo primero es presentarme, ya que este es mi primer mensaje en este foro. Llevo años usándolo para resolver dudas, así como StackOverflow, pero ...
  #1 (permalink)  
Antiguo 21/07/2015, 06:05
 
Fecha de Ingreso: julio-2015
Ubicación: Madrid
Mensajes: 17
Antigüedad: 9 años, 5 meses
Puntos: 0
Scope de eventos y widgets

Buenas.

Lo primero es presentarme, ya que este es mi primer mensaje en este foro.
Llevo años usándolo para resolver dudas, así como StackOverflow, pero me he encontrado con una duda que no he encontrado y me veo en la necesidad de preguntarlo directamente.
Lo más probable es que no haya sabido cómo buscarlo, porque es algo difícil de describir en pocas palabras.

Bien, vamos al meollo.

Ayer, un compañero de trabajo, que lleva muchos años en este mundillo y sabe mucho, me dijo que los eventos y los widgets es mejor tenerlos en global y llamarlos cuando sea necesario porque vio una parte de mi código en la que creaba un popover de Bootstrap dentro de una función.

Esta es la parte de código que vió y criticó XD:

Código Javascript:
Ver original
  1. (function($){
  2.     var mq630 = window.matchMedia('screen and (max-width: 630px)');
  3.  
  4.     $(window).ready(function(){
  5.         if(mq630.matches) {
  6.             mueveCuadroGris();
  7.             sacaPopConClick();
  8.         }
  9.         mq630.addListener(function(changed) {
  10.             if(changed.matches) {
  11.                 mueveCuadroGris();
  12.                 sacaPopConClick();
  13.             } else {
  14.                 quitaCuadroGris();
  15.                 sacaPopHover();
  16.             }
  17.         });
  18.     });
  19.    
  20. })(jQuery);
  21.  
  22. /********************* ESTA ES LA FUNCIÓN DE LA DISCORDIA *********************/
  23.  
  24. function sacaPopConClick() {
  25.     var boton = $(".tooltip-info-show");
  26.     // IE no lee el getter de background-position-x
  27.     var pos = parseInt(boton.css('background-position'));
  28.     var newPos = parseInt(pos) - 25;
  29.     var cont;
  30.     if(boton.parent().attr('class') == "form-group form-horizontal") {
  31.         cont = boton.parent();
  32.     } else {
  33.         cont = ".row.col-100";
  34.     }
  35.    
  36.     resetEventosPop(boton);
  37.    
  38.     boton.on('click', function(event) {
  39.         var este = $(this);
  40.         if(parseInt(este.css('background-position')) == pos) {
  41.             cerrarPop(boton, pos);
  42.             // curiosamente, IE si lee el setter de background-position-x
  43.             este.css('background-position-x', newPos + 'px');
  44.             este.parent().parent().parent().css('background-color', '#eaf0f6');
  45.            
  46.             event.stopPropagation();
  47.         }
  48.     });
  49.    
  50.     $('body').on('click', function() {
  51.         cerrarPop(boton, pos);
  52.     });
  53.  
  54.     boton.popover({
  55.          trigger: "click",
  56.          template: '<div class="popover tooltip-info"><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
  57.          html: true,
  58.          container: cont,
  59.          content: function() {
  60.             var targetValue = $(this).attr("data-target-value") || false;
  61.             return $(targetValue).html();
  62.          }
  63.     });
  64. }
  65. /********************* FIN *********************/
  66.  
  67. function sacaPopHover() {
  68.     var boton = $(".tooltip-info-show");
  69.    
  70.     resetEventosPop(boton);
  71.    
  72.     boton.popover({
  73.         trigger: "hover",
  74.         template: '<div class="popover tooltip-info"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
  75.         html: true,
  76.         container:"body",
  77.         placement: "auto top",
  78.         content: function() {
  79.             var targetValue = $(this).attr("data-target-value") || false;
  80.             return $(targetValue).html();
  81.         }
  82.     });
  83. }
  84.  
  85. function cerrarPop(boton, pos) {
  86.     boton.css('background-position-x', pos);
  87.     boton.parent().parent().parent().css('background-color', 'transparent');
  88.     boton.popover('hide');
  89. }
  90.  
  91. function resetEventosPop(boton) {
  92.     boton.popover("destroy");
  93.     boton.off('click');
  94.     $('body').off('click');
  95.     $("a.tooltip-info-show").on('click', function(event) {
  96.         event.preventDefault ? event.preventDefault() : event.returnValue = false;
  97.     });
  98. }
Explicación del código (aunque es sencillo):
La primera función se ejecuta automáticamente, y llama a unas funciones u otras según el tamaño de la ventana del navegador.
La función sacaPopConClick():
1. Destruye eventos onClick creados en otras funciones y crea los que necesita en el cambio de tamaño del navegador.
2. Hace que los "botones" (almacenados en el objeto jQuery boton), al ser pulsados, cierren cualquier otro popover abierto y cambien su icono (de un "+" a un "-"), pero solo si están en posición "+". Para la propagación para que el click no llegue a body, de modo que salta directamente al siguiente onClick del objeto y abre el popover asociado a este. Repito que esto sólo pasa si el botón está con icono "+".
3. Si el botón está en posición "-", el click se salta el paso anterior y llega al body, por lo que cierra todos los popovers abiertos.
4. Crea un nuevo popover con un trigger onClick.
La siguiente función es similar, pero al agrandar la ventana: destruye el popover con trigger click y lo crea con trigger hover.

El código está así porque tengo que cambiar el trigger del popover y no he encontrado ninguna forma de hacerlo más que destruyendo el widget y volviéndolo a crear.

El caso es que he visto mucho código en la red, de supuestos expertos, que tienen eventos y widgets creados dentro de funciones. Incluso en la documentación oficial de Jquery o jQueryUi vienen ejemplos así.

Y el código funciona tal como está arriba, pero soy fanático de las cosas bien formadas y los estándares, por lo que me gusta hacer las cosas bien y no sólo funcionales.

Entonces, mi pregunta es ¿Cuál es la forma más correcta de hacerlo?

Gracias y un saludo.
Javier;

Última edición por jevy99; 21/07/2015 a las 06:22 Razón: He intentado agregar nuevas etiquetas, pero no he podido XD

Etiquetas: eventos, scope, widgets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:05.