2012-02-23 8 views
9

Estoy tratando de ejecutar una parte de nuestro JavaScript después de que un código de terceros haga aparecer un cuadro de diálogo modal. Vi a pretty neat idea of hijacking the jQuery show function, pero desafortunadamente no está funcionando. Supongo que esta idea solía funcionar en una versión anterior de jQuery en 2009, pero ahora no en la última versión. Aquí es un jsFiddle con la implementación y una muestra:Intentar desencadenar eventos anteriores y posteriores en jQuery show()

http://jsfiddle.net/mkmurray/drv5w/2/

Como se puede ver mediante la ejecución de la muestra, se alertará al evento 'beforeShow', pero no el 'caso Aftershow' y con un poco de depuración I puede ver que no está llamando a la función 'newCallback' por completo.

Gracias de antemano por cualquier ayuda que pueda proporcionar.

Respuesta

9

Parece que yo era capaz de trabajar a través de una solución. Se trataba de una serie de factores que van mal con el original:

  1. Dado que la escritura original del código vi, jQuery añadió otro parámetro opcional llamado easing. Esto realmente ensució la forma en que estaba delegando en el método original show en jQuery llamando al _oldShow.apply(...).
  2. Después de que lo solucioné, encontré que a veces el método show llama a una serie de otros métodos que a veces recurrentemente llaman al show. Necesitaba una forma de que mi implementación no interceptara esas llamadas recursivas; Encontré que podía confiar si había una propiedad selector o no.

una implementación funcional se puede encontrar aquí en este jsFiddle:

http://jsfiddle.net/mkmurray/drv5w/27/

Esta aplicación es bastante dependiente de jQuery no cambiar el método de firma del método show sin embargo. Así que tienes que decidir si quieres modificar tus plugins jQuery de terceros en lugar de hacer esto.De cualquier forma, si desea obtener el último complemento de terceros o el último jQuery, algunos cambios nuevos podrían interrumpir su implementación. Por lo tanto, esta solución no es necesariamente mejor o peor que la modificación de los complementos de terceros.

+2

'Este comentario fue una EDITACIÓN rechazada:' Hay un error en el enlace de arriba. Una versión de trabajo se puede encontrar en http://jsfiddle.net/GDqNx/1/ –

+0

Veo la diferencia en lo que ha cambiado, pero ¿cuál es el error? – mkmurray

+0

No estoy seguro de cuál es el error. Algún usuario de 'anon' intentó editar tu respuesta, sabía que la edición sería rechazada pero se escuchó lo suficiente como para guardarla como comentario. –

-1

No he probado nada, pero compartir algunas cosas que sé

  1. show tiene un segundo parámetro opcional - flexibilización. jQuery lo detecta automáticamente, pero para una solución perfecta, debe tener esto en cuenta.

    _oldShow.apply(obj, [speed, null, newCallback]); 
    
  2. una devolución de llamada sólo tiene sentido cuando hay un retraso, eso significa que el valor para speed. Espero que su evento afterShow se active si hay un retraso. Si no hay ningún retraso puede hacer que unas que después de invocar _oldShow, como este

    _oldShow.apply(obj, [speed, null, newCallback]); 
    if(!speed){ 
        obj.trigger('afterShow'); 
    } 
    

EDIT:

Me cansados ​​algunas cosas y frpm lo que he aprendido te sugeriría para crear un nuevo espectáculo función en lugar de anular.

jQuery.fn.extend({ 

    show2:function(speed, easing, callback) { 
     this.trigger('beforeShow'); 
     this.show(speed, easing, function(){ 
      $(this).trigger('afterShow'); 
      if ($.isFunction(callback)) { 
       callback.apply(this); 
      } 
     }); 
     if(!speed){ 
      this.trigger('afterShow');    
     }   
    } 


}); 

demo: http://jsfiddle.net/9F8ea/2/

+0

Intenté incluir el parámetro de aceleración y nada cambió. También intenté rellenar un OldCallback y luego tampoco me ayudó. En cuanto a su última sugerencia, no puedo hacer un show2 ya que el call to show() está en un javascript de terceros. Quiero sobrescribir el show predeterminado() en jQuery. – mkmurray

2

Encontré otra solución a esto sobre here, con un ligero ajuste de la mía.

(function($){ 
    $.each(['show','hide'],function(i,ev){ 
     var el = $.fn[ev];    
     $.fn[ev] = function(){ 
      this.trigger(ev); 
      return el.apply(this,arguments); 
     }; 
    });     
})(jQuery); 

No ofrece los eventos antes/después de otros ejemplos, pero sin duda podría ser elaborado. Me está resultando muy útil hasta ahora y espero que continúe haciéndolo; es un pequeño y agradable enfoque que puede ampliarse fácilmente a otras funciones de jQuery, incluidas las diversas alternativas que se muestran.

** Tenga en cuenta que esto también activa un evento para "ocultar".

+0

Parece que esta solución es más rápida en comparación con el evento @mkmurray 'beforeShow'. En mi caso, este enfoque no causa un retraso visible de mostrar un elemento. Entonces elijo esta respuesta. – Spirit

Cuestiones relacionadas