【发布时间】:2010-11-28 18:16:14
【问题描述】:
我的页面上有一个锚标记,我想要一个附加到它的事件,该事件将在此元素的显示发生变化时触发。
我该如何编写这个活动?并在此元素的显示发生变化时捕获?
【问题讨论】:
标签: javascript jquery html dom javascript-events
我的页面上有一个锚标记,我想要一个附加到它的事件,该事件将在此元素的显示发生变化时触发。
我该如何编写这个活动?并在此元素的显示发生变化时捕获?
【问题讨论】:
标签: javascript jquery html dom javascript-events
这是我在 onShow 上做的方式,作为一个 jQuery 插件。但是,它可能会也可能不会完全执行您正在执行的操作。
(function($){
$.fn.extend({
onShow: function(callback, unbind){
return this.each(function(){
var _this = this;
var bindopt = (unbind==undefined)?true:unbind;
if($.isFunction(callback)){
if($(_this).is(':hidden')){
var checkVis = function(){
if($(_this).is(':visible')){
callback.call(_this);
if(bindopt){
$('body').unbind('click keyup keydown', checkVis);
}
}
}
$('body').bind('click keyup keydown', checkVis);
}
else{
callback.call(_this);
}
}
});
}
});
})(jQuery);
您可以在 $(document).ready() 函数中调用它,并使用回调在元素显示时触发,就像这样。
$(document).ready(function(){
$('#myelement').onShow(function(){
alert('this element is now shown');
});
});
它通过将 click、keyup 和 keydown 事件绑定到 body 来检查元素是否显示,因为这些事件最有可能导致元素显示并且用户非常频繁地执行这些事件。这可能不是非常优雅,但可以完成工作。此外,一旦显示元素,这些事件就会与主体解除绑定,以免继续触发并降低性能。
【讨论】:
if($(obj).is(':visible')){ 中的 :hidden,但除此之外效果很好。
您不能直接在 JavaScript 中获得 onshow 事件。请记住,以下方法是非标准。
在 IE 中你可以使用
在元素的属性之后触发 变化
对于 Mozilla
你可以使用
监视要分配的属性 一个值并在那个时候运行一个函数 发生。
【讨论】:
你也可以覆盖 jQuery 的默认显示方法:
var orgShow = $.fn.show;
$.fn.show = function()
{
$(this).trigger( 'myOnShowEvent' );
orgShow.apply( this, arguments );
return this;
}
现在只需将您的代码绑定到事件:
$('#foo').bind( "myOnShowEvent", function()
{
console.log( "SHOWN!" )
});
【讨论】:
.show(),这是一个非常酷的解决方案。但是,它不适用于所有显示元素的情况,无论是通过设置display:block、fadeIn()、slideDown() 等...虽然仍然是独一无二的。
此链接中的代码对我有用:http://viralpatel.net/blogs/jquery-trigger-custom-event-show-hide-element/
(function ($) {
$.each(['show', 'hide'], function (i, ev) {
var el = $.fn[ev];
$.fn[ev] = function () {
this.trigger(ev);
return el.apply(this, arguments);
};
});
})(jQuery);
$('#foo').on('show', function() {
console.log('#foo is now visible');
});
$('#foo').on('hide', function() {
console.log('#foo is hidden');
});
但是,首先调用回调函数,然后显示/隐藏元素。所以如果你有一些与同一个选择器相关的操作,需要在显示或隐藏后进行,临时的解决方法是添加几毫秒的超时。
【讨论】: