我有两个div,我想同时眨眼,直到用户将鼠标悬停在其中一个上。
var shouldiblink = '1';
function mrBlinko(divid){
while (shouldiblink =='1') {
$("#"+divid).fadeIn(100).fadeOut(300);
}
$(document).ready(function(){
mrBlinko("mydiv1");
mrBlinko("mydiv2");
}
我将有一个悬停事件,将shouldiblink设置为'0'。问题是,一旦页面准备好并且浏览器崩溃,循环就会启动。
我坚持使用这个解决方案,现在我想不出替代方案。
你能帮助我吗?
非常感谢。
答案 0 :(得分:4)
我认为更好的方法是使用setInterval和clearInterval。
加载页面后,使用setInterval来获得效果。当用户将鼠标悬停在元素上时,使用setInterval获得的间隔id清除间隔。
查看 working demo 。
答案 1 :(得分:1)
答案 2 :(得分:1)
尽管我讨厌<blink>
标签,但请尝试以下方法:
$.fn.blink = function(opts) {
// allows $elem.blink('stop');
if (opts == 'stop') {
// sets 'blinkStop' on element to true, stops animations,
// and shows the element. Return this for chaining.
return this.data('blinkStop', true).stop(true, true).show();
}
// we aren't stopping, so lets set the blinkStop to false,
this.data('blinkStop', false);
// load up some default options, and allow overriding them:
opts = $.extend({}, {
fadeIn: 100,
fadeOut: 300
}, opts || {} );
function doFadeOut($elem) {
$elem = $elem || $(this); // so it can be called as a callback too
if ($elem.data('blinkStop')) return;
$elem.fadeOut(opts.fadeOut, doFadeIn);
}
function doFadeIn($elem) {
$elem = $elem || $(this);
if ($elem.data('blinkStop')) return;
$elem.fadeIn(opts.fadeIn, doFadeOut);
}
doFadeOut(this);
return this;
};
// example usage - blink all links until you mouseover:
// takes advantage of the jQuery.one() function so that it only calls the
// stop blink once
$('a').blink({fadeIn: 500, fadeOut: 1500}).one('mouseover', function() {
$(this).blink('stop')
});
// 30 seconds after we started blinking, stop blinking every element we started:
setTimeout(function() {
$('a').blink('stop');
}, 30000);
// example that should do what you wanted:
$("#mydiv1,#mydiv2").blink().one('mouseover', function() {
$(this).blink('stop');
});
答案 3 :(得分:0)
这是使用jQuery的完成回调的替代解决方案。
您可以随时向元素添加'selected-pulsate'并调用setPulsate(),它将开始脉动。要清除所有当前的脉动器,您可以调用clearSelection(),它只是删除该类并强制它被隐藏。
clearSelection()[clearTimeout()]中有一行,我不确定是否有必要。在我非常基本的测试中,它没有那条线,但是我不确定定时器是否可能仍然在那个点运行并导致问题。
我还不确定在fadeOut()完成回调中调用RepeatCall()是否会导致堆栈溢出,所以我使用了一个小值10msec的setTimeout来再次调用该函数而不是直接执行它。
var currentPulsatorId = -1;
function clearSelection() {
if (currentPulsatorId != -1) {
clearTimeout(currentPulsatorId); /* needed? */
currentPulsatorId = -1;
}
var curElems = $('.selected-pulsate');
$(curElems).removeClass('selected-pulsate');
$(curElems).hide();
}
function setSelection(elems) {
$(elems).addClass('selected-pulsate');
setPulsate();
}
function setPulsate() {
// trigger
RepeatCall();
function RepeatCall()
{
$('.selected-pulsate').fadeIn(400, function() {
$('.selected-pulsate').fadeOut(400, function() {
// set timeout quickly again
// call externally to avoid stack overflow
currentPulsatorId = setTimeout(RepeatCall, 10);
});
});
}
}