尝试在jQuery show()前后触发事件之前和之后触发

我试图在一些第三方代码使模态对话框出现之后得到一段JavaScript运行。 我看到劫持jQuery show功能的一个非常简单的想法,但不幸的是它不起作用。 我猜这个想法早在2009年就开始使用jQuery的老版本,但现在不是最新版本。 这里是一个jsFiddle的实现和一个示例:

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

正如你通过运行示例所看到的,它会提醒'beforeShow'事件,但不提示'afterShow事件',并且通过一些调试,我可以看到它没有完全调用'newCallback'函数。

提前感谢您提供的任何帮助。


看起来我能够通过解决方案。 它涉及到一些原因出错的原因:

  • 自从我看到的代码的原始编写以来,jQuery添加了另一个名为easing可选参数。 这真的与我通过调用_oldShow.apply(...)委托给jQuery中的原始show方法的方式_oldShow.apply(...)
  • 在我解决这个问题之后,我发现有时show方法会调用一系列其他方法,有时候会再次递归调用show 。 我需要一种方法来避免我的实现拦截这些递归调用; 我发现如果有selector属性,我可以依靠它。
  • 一个工作实现可以在这里找到这个jsFiddle:

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

    这个实现很依赖于jQuery,不改变show方法的方法签名。 所以你几乎必须决定是否要修改你的第三方jQuery插件而不是这样做。 无论哪种方式,如果你想获得最新的第三方插件或最新的jQuery,一些新的变化可能会破坏你的实现。 所以这个解决方案不一定比修改你的第三方插件更好或更差。


    我在这里找到了另一个解决方案,稍微调整一下自己的方法。

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

    它没有提供其他例子的事件之前/之后的事件,但它当然可以详细阐述。 它到目前为止都在为我工作,并希望它继续这样做 - 这是一个很好的小方法,可以轻松扩展到其他jQuery函数,包括展示的各种替代方法。

    **请注意,这也会触发“隐藏”事件。


    我没有测试过任何东西,但分享了一些我知道的东西

  • show有一个可选的第二个参数 - easing。 jQuery自动检测到这一点,但对于一个完美的解决方案,您必须考虑这一点。

    _oldShow.apply(obj, [speed, null, newCallback]); 
    
  • 回调只有在有延迟时才有意义,这意味着speed价值。 如果有延迟,我希望你的afterShow事件会被触发。 如果没有延迟,你可以在调用_oldShow之后触发它,就像这样

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

    我厌倦了一些事情,并且反驳了我所学到的东西,我建议你创建一个新的显示功能,而不是重写。

    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');            
            }          
        }
    
    
    });
    

    演示:http://jsfiddle.net/9F8ea/2/

    链接地址: http://www.djcxy.com/p/83387.html

    上一篇: Attempting to trigger before & after events around jQuery show()

    下一篇: jquery event handler: div becomes visible/hidden