我在我的网站上使用jQuery,我想在某个div可见时触发某些操作。
是否有可能附加某种“isvisible”事件处理程序到任意div,并有一定的代码运行时,他们的div是可见的?
我想要如下伪代码:
$(function() {
$('#contentDiv').isvisible(function() {
alert("do something");
});
});
警报(“do something”)代码在contentDiv实际可见之前不应该触发。
谢谢。
我在我的网站上使用jQuery,我想在某个div可见时触发某些操作。
是否有可能附加某种“isvisible”事件处理程序到任意div,并有一定的代码运行时,他们的div是可见的?
我想要如下伪代码:
$(function() {
$('#contentDiv').isvisible(function() {
alert("do something");
});
});
警报(“do something”)代码在contentDiv实际可见之前不应该触发。
谢谢。
当前回答
有一个jQuery插件可以观察DOM属性的变化,
https://github.com/darcyclarke/jQuery-Watch-Plugin
你需要做的就是绑定MutationObserver
然后你可以使用它来观看div使用:
$("#selector").watch('css', function() {
console.log("Visibility: " + this.style.display == 'none'?'hidden':'shown'));
//or any random events
});
其他回答
Redsquare的解决方案是正确的答案。
但是作为一个IN-THEORY解决方案,你可以编写一个函数来选择由.visibilityCheck(不是所有可见元素)分类的元素,并检查它们的可见性属性值;如果是这样,那就做点什么。
之后,应该使用setInterval()函数定期执行该函数。您可以在成功调用时使用clearInterval()停止计时器。
这里有一个例子:
function foo() {
$('.visibilityCheck').each(function() {
if ($(this).is(':visible')){
// do something
}
});
}
window.setInterval(foo, 100);
您还可以对其执行一些性能改进,但是,该解决方案基本上不适合实际使用。所以…
你可以使用jQuery的Live Query插件。 并编写如下代码:
$('#contentDiv:visible').livequery(function() {
alert("do something");
});
然后每当contentDiv可见时,“do something”就会被提醒!
我有同样的问题,并创建了一个jQuery插件来解决我们的网站。
https://github.com/shaunbowe/jquery.visibilityChanged
下面是基于你的例子你应该如何使用它:
$('#contentDiv').visibilityChanged(function(element, visible) {
alert("do something");
});
有一个jQuery插件可以观察DOM属性的变化,
https://github.com/darcyclarke/jQuery-Watch-Plugin
你需要做的就是绑定MutationObserver
然后你可以使用它来观看div使用:
$("#selector").watch('css', function() {
console.log("Visibility: " + this.style.display == 'none'?'hidden':'shown'));
//or any random events
});
有一种方法。 只适用于由css类更改引起的可见性更改,但也可以扩展到观察属性更改。
var observer = new MutationObserver(function(mutations) {
var clone = $(mutations[0].target).clone();
clone.removeClass();
for(var i = 0; i < mutations.length; i++){
clone.addClass(mutations[i].oldValue);
}
$(document.body).append(clone);
var cloneVisibility = $(clone).is(":visible");
$(clone).remove();
if (cloneVisibility != $(mutations[0].target).is(":visible")){
var visibilityChangedEvent = document.createEvent('Event');
visibilityChangedEvent.initEvent('visibilityChanged', true, true);
mutations[0].target.dispatchEvent(visibilityChangedEvent);
}
});
var targets = $('.ui-collapsible-content');
$.each(targets, function(i,target){
target.addEventListener('visibilityChanged',VisbilityChanedEventHandler});
target.addEventListener('DOMNodeRemovedFromDocument',VisbilityChanedEventHandler });
observer.observe(target, { attributes: true, attributeFilter : ['class'], childList: false, attributeOldValue: true });
});
function VisbilityChanedEventHandler(e){console.log('Kaboom babe'); console.log(e.target); }