尝试在jQuery show()前后触发事件之前和之后触发
我试图在一些第三方代码使模态对话框出现之后得到一段JavaScript运行。 我看到劫持jQuery show功能的一个非常简单的想法,但不幸的是它不起作用。 我猜这个想法早在2009年就开始使用jQuery的老版本,但现在不是最新版本。 这里是一个jsFiddle的实现和一个示例:
http://jsfiddle.net/mkmurray/drv5w/2/
正如你通过运行示例所看到的,它会提醒'beforeShow'事件,但不提示'afterShow事件',并且通过一些调试,我可以看到它没有完全调用'newCallback'函数。
提前感谢您提供的任何帮助。
看起来我能够通过解决方案。 它涉及到一些原因出错的原因:
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()