jQuery元素变得可见

基本上,我想知道是否有一种方法来自动运行一个function,当一个元素变得隐藏或可见,而不是在用户点击,但自动在另一个脚本。

我不希望这只是运行一次,因为元素(如滑块)不断从可见变为隐藏。

这是jQuery可以绑定的东西吗? 比如将元素的可见性绑定到一个函数(我不知道该怎么写)

如果你需要我详细说明我想要做什么,请告诉我。 谢谢

伪代码:

$('#element').bind('display:none', function); function(){ //do something when element is display:none } $('#element').bind('display:block', function2); function2(){ //do opposite of function } 

JQuery中没有检测到css更改的事件。
请参阅: jQuery中的onHide()types事件
有可能的:

DOM L2事件模块定义突变事件; 其中之一 – DOMAttrModified是你需要的。 当然,这些并没有得到广泛的实施,但至less在Gecko和Opera浏览器中得到支持
来源: 事件检测时,使用JQuery的CSS属性更改

你将不得不做一些事情:

 var maxTime = 2000; // 2 seconds var time = 0; var interval = setInterval(function () { if($('#element').is(':visible')) { // visible, do something clearInterval(interval); } else { if (time > maxTime) { // still hidden, after 2 seconds, stop checking clearInterval(interval); return; } // not visible yet, do something time += 100; } }, 200); 
 (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/

变化将被提醒。

试过这个在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");}); 

UPDATE

目前, 突变事件 (如解决scheme中使用的DOMAttrModified )被replace为MutationObserver ,您可以使用它来检测DOM节点更改,如上述情况。

我刚刚改进了ProllyGeek的答案

有人可能会觉得它有用。 在元素上调用.toggle().toggle()displayChanged(event, state)可以访问displayChanged(event, state)

 (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 

我喜欢插件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');