基本上,我想知道是否有一种方法可以在元素隐藏或可见时自动运行函数,而不是在用户点击时自动运行,而是在另一个脚本中自动运行。
我不希望这只运行一次,因为元素(例如滑块)不断从可见变为隐藏。
这是jQuery可以用bind做的吗?比如将元素的可见性绑定到函数(我不知道如何写这个)
如果您需要我详细说明我正在尝试做什么,请告诉我。感谢
伪代码:
$('#element').bind('display:none', function);
function(){
//do something when element is display:none
}
$('#element').bind('display:block', function2);
function2(){
//do opposite of function
}
答案 0 :(得分:26)
JQuery中没有事件来检测css更改
请参阅此处:onHide() type event in jQuery
有可能:
DOM L2 Events模块定义了突变事件;其中之一 - DOMAttrModified是您需要的。当然,这些并没有得到广泛实施,但至少在Gecko和Opera 浏览器中得到了支持。 资料来源:Event detect when css property changed using Jquery
没有事件,您可以使用setInterval
函数,如下所示:
var maxTime = 5000, // 5 seconds
startTime = Date.now();
var interval = setInterval(function () {
if ($('#element').is(':visible')) {
// visible, do something
clearInterval(interval);
} else {
// still hidden
if (Date.now() - startTime > maxTime) {
// hidden even after 'maxTime'. stop checking.
clearInterval(interval);
}
}
},
100 // 0.1 second (wait time between checks)
);
请注意,以这种方式使用setInterval
来保持观看可能会影响您网页的效果。
2018年7月7日:
由于这个答案最近得到了一些可见性和最多投票,这里有关于检测css变化的额外更新:
突变事件现已被更具性能友好的Mutation Observer取代。
MutationObserver接口提供了监视对DOM树所做更改的功能。它被设计为旧的Mutation Events功能的替代品,该功能是DOM3 Events规范的一部分。
参考:https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
答案 1 :(得分:18)
(function() {
var ev = new $.Event('display'),
orig = $.fn.css;
$.fn.css = function() {
orig.apply(this, arguments);
$(this).trigger(ev);
}
})();
$('#element').bind('display', function(e) {
alert("display has changed to :" + $(this).attr('style') );
});
$('#element').css("display", "none")// i change the style in this line !!
$('#element').css("display", "block")// i change the style in this line !!
http://fiddle.jshell.net/prollygeek/gM8J2/3/
将会发出警告。
答案 2 :(得分:4)
在firefox上试过这个,有效http://jsfiddle.net/Tm26Q/1/
$(function(){
/** Just to mimic a blinking box on the page**/
setInterval(function(){$("div#box").hide();},2001);
setInterval(function(){$("div#box").show();},1000);
/**/
});
$("div#box").on("DOMAttrModified",
function(){if($(this).is(":visible"))console.log("visible");});
更新
目前 Mutation Events (例如
DOMAttrModified
中使用的{{1}} 解决方案)被MutationObserver取代,您可以使用它 检测DOM节点的变化,如上例所示。
答案 3 :(得分:2)
我刚刚改进了ProllyGeek的回答
有人可能觉得它很有用。
您可以在元素上调用displayChanged(event, state)
,.show()
或.hide()
时访问.toggle()
事件
(function() {
var eventDisplay = new $.Event('displayChanged'),
origShow = $.fn.show,
origHide = $.fn.hide;
//
$.fn.show = function() {
origShow.apply(this, arguments);
$(this).trigger(eventDisplay,['show']);
};
//
$.fn.hide = function() {
origHide.apply(this, arguments);
$(this).trigger(eventDisplay,['hide']);
};
//
})();
$('#header').on('displayChanged', function(e,state) {
console.log(state);
});
$('#header').toggle(); // .show() .hide() supported
答案 4 :(得分:0)
我喜欢插件https://github.com/hazzik/livequery它没有计时器!
简单使用
$('.some:visible').livequery( function(){ ... } );
但是你需要修正一个错误。替换行
$jQlq.registerPlugin('append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove', 'html', 'prop', 'removeProp');
到
$jQlq.registerPlugin('show', 'append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove', 'html', 'prop', 'removeProp');
答案 5 :(得分:0)
一个全能的 jQuery自定义事件基于它的核心方法的扩展,就像它在这个帖子中由不同的人提出的那样:
(function() {
var ev = new $.Event('event.css.jquery'),
css = $.fn.css,
show = $.fn.show,
hide = $.fn.hide;
// extends css()
$.fn.css = function() {
css.apply(this, arguments);
$(this).trigger(ev);
};
// extends show()
$.fn.show = function() {
show.apply(this, arguments);
$(this).trigger(ev);
};
// extends hide()
$.fn.hide = function() {
hide.apply(this, arguments);
$(this).trigger(ev);
};
})();
然后,外部库使用类似$('selector').css('property', value)
的内容。
由于我们不想改变图书馆的代码,但我们 DO 想要扩展它的行为,我们会这样做:
$('#element').on('event.css.jquery', function(e) {
// ...more code here...
});
示例:用户单击由库构建的面板。该库根据用户交互显示/隐藏元素。我们想要添加一个传感器,该传感器显示由于该交互而隐藏/显示某些信息,并且在库函数之后应该被称为。
另一个例子:jsfiddle。