Setting function interval on multiple targets, clearing interval after some delay
I'm developing an effect where symbols would change when user hovers on them.
I've achieved part of it - elements change on hover as they should. What I can not manage to achieve is for symbols to keep changing for few seconds after element is not hovered anymore and only then stop instead of stopping immediately.
Full fiddle: https://jsfiddle.net/wehvm457/3/
Javascript:
var
target = $(".symbol").find('span'),
possible = ['?', '/', '<', '>', '}', '
I'm developing an effect where symbols would change when user hovers on them.
I've achieved part of it - elements change on hover as they should. What I can not manage to achieve is for symbols to keep changing for few seconds after element is not hovered anymore and only then stop instead of stopping immediately.
Full fiddle: https://jsfiddle.net/wehvm457/3/
Javascript:
var
target = $(".symbol").find('span'),
possible = ['?', '/', '<', '>', '', '
I'm developing an effect where symbols would change when user hovers on them.
I've achieved part of it - elements change on hover as they should. What I can not manage to achieve is for symbols to keep changing for few seconds after element is not hovered anymore and only then stop instead of stopping immediately.
Full fiddle: https://jsfiddle.net/wehvm457/3/
Javascript:
var
target = $(".symbol").find('span'),
possible = ['?', '/', '<', '>', '', 'improve this question
I'm developing an effect where symbols would change when user hovers on them.
I've achieved part of it - elements change on hover as they should. What I can not manage to achieve is for symbols to keep changing for few seconds after element is not hovered anymore and only then stop instead of stopping immediately.
Full fiddle: https://jsfiddle.net/wehvm457/3/
Javascript:
var
target = $(".symbol").find('span'),
possible = ['?', '/', '<', '>', '', '{', ')', '(', '[', '[', '!', '2', '3', '1', '4', '5', '6', '7', '&', '$', '#'];
var pickRandom = function(element)
random = Math.floor(Math.random()*possible.length);
symbol = possible[random];
currentTarget.html(symbol);
$(target).on(
mouseenter: function ()
currentTarget = $(this);
changeSymbols = setInterval(pickRandom, 100);
,
mouseleave: function ()
// currentTarget = $(this);
// setTimeout(function()
clearInterval(changeSymbols);
// , 1000)
);
Would appreciate any help. Thanks in advance!
javascript jquery
javascript jquery
asked Nov 14 '18 at 11:22
Karolis Antanas SvirskasKarolis Antanas Svirskas
82
82
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You need to be able to store instance specific references to setInterval
instead of using the global changeSymbols
. You can do this by storing each reference on the element itself using data()
Similarly the currentTarget
won't work when you have multiple instances running so need to use the element
argument of pickRandom
instead and call that function passing in the element
var pickRandom = function($el)
random = Math.floor(Math.random() * possible.length);
symbol = possible[random];
$el.html(symbol);
$(target).on(
mouseenter: function()
var $el = $(this);
var timer = setInterval(function()
pickRandom($el)
, 100);
$el.data('timer', timer)
,
mouseleave: function()
var timer = $(this).data('timer')
setTimeout(function()
clearInterval(timer);
, 1000)
);
Updated Fiddle demo
Thank you a lot, sir or madam!
– Karolis Antanas Svirskas
Nov 14 '18 at 11:50
The only problem I see is if you enter the element again before thesetTimeout
occurs in which case you may also need toclearInterval
inmouseenter
also
– charlietfl
Nov 14 '18 at 11:58
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53299054%2fsetting-function-interval-on-multiple-targets-clearing-interval-after-some-dela%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You need to be able to store instance specific references to setInterval
instead of using the global changeSymbols
. You can do this by storing each reference on the element itself using data()
Similarly the currentTarget
won't work when you have multiple instances running so need to use the element
argument of pickRandom
instead and call that function passing in the element
var pickRandom = function($el)
random = Math.floor(Math.random() * possible.length);
symbol = possible[random];
$el.html(symbol);
$(target).on(
mouseenter: function()
var $el = $(this);
var timer = setInterval(function()
pickRandom($el)
, 100);
$el.data('timer', timer)
,
mouseleave: function()
var timer = $(this).data('timer')
setTimeout(function()
clearInterval(timer);
, 1000)
);
Updated Fiddle demo
Thank you a lot, sir or madam!
– Karolis Antanas Svirskas
Nov 14 '18 at 11:50
The only problem I see is if you enter the element again before thesetTimeout
occurs in which case you may also need toclearInterval
inmouseenter
also
– charlietfl
Nov 14 '18 at 11:58
add a comment |
You need to be able to store instance specific references to setInterval
instead of using the global changeSymbols
. You can do this by storing each reference on the element itself using data()
Similarly the currentTarget
won't work when you have multiple instances running so need to use the element
argument of pickRandom
instead and call that function passing in the element
var pickRandom = function($el)
random = Math.floor(Math.random() * possible.length);
symbol = possible[random];
$el.html(symbol);
$(target).on(
mouseenter: function()
var $el = $(this);
var timer = setInterval(function()
pickRandom($el)
, 100);
$el.data('timer', timer)
,
mouseleave: function()
var timer = $(this).data('timer')
setTimeout(function()
clearInterval(timer);
, 1000)
);
Updated Fiddle demo
Thank you a lot, sir or madam!
– Karolis Antanas Svirskas
Nov 14 '18 at 11:50
The only problem I see is if you enter the element again before thesetTimeout
occurs in which case you may also need toclearInterval
inmouseenter
also
– charlietfl
Nov 14 '18 at 11:58
add a comment |
You need to be able to store instance specific references to setInterval
instead of using the global changeSymbols
. You can do this by storing each reference on the element itself using data()
Similarly the currentTarget
won't work when you have multiple instances running so need to use the element
argument of pickRandom
instead and call that function passing in the element
var pickRandom = function($el)
random = Math.floor(Math.random() * possible.length);
symbol = possible[random];
$el.html(symbol);
$(target).on(
mouseenter: function()
var $el = $(this);
var timer = setInterval(function()
pickRandom($el)
, 100);
$el.data('timer', timer)
,
mouseleave: function()
var timer = $(this).data('timer')
setTimeout(function()
clearInterval(timer);
, 1000)
);
Updated Fiddle demo
You need to be able to store instance specific references to setInterval
instead of using the global changeSymbols
. You can do this by storing each reference on the element itself using data()
Similarly the currentTarget
won't work when you have multiple instances running so need to use the element
argument of pickRandom
instead and call that function passing in the element
var pickRandom = function($el)
random = Math.floor(Math.random() * possible.length);
symbol = possible[random];
$el.html(symbol);
$(target).on(
mouseenter: function()
var $el = $(this);
var timer = setInterval(function()
pickRandom($el)
, 100);
$el.data('timer', timer)
,
mouseleave: function()
var timer = $(this).data('timer')
setTimeout(function()
clearInterval(timer);
, 1000)
);
Updated Fiddle demo
answered Nov 14 '18 at 11:47
charlietflcharlietfl
140k1389123
140k1389123
Thank you a lot, sir or madam!
– Karolis Antanas Svirskas
Nov 14 '18 at 11:50
The only problem I see is if you enter the element again before thesetTimeout
occurs in which case you may also need toclearInterval
inmouseenter
also
– charlietfl
Nov 14 '18 at 11:58
add a comment |
Thank you a lot, sir or madam!
– Karolis Antanas Svirskas
Nov 14 '18 at 11:50
The only problem I see is if you enter the element again before thesetTimeout
occurs in which case you may also need toclearInterval
inmouseenter
also
– charlietfl
Nov 14 '18 at 11:58
Thank you a lot, sir or madam!
– Karolis Antanas Svirskas
Nov 14 '18 at 11:50
Thank you a lot, sir or madam!
– Karolis Antanas Svirskas
Nov 14 '18 at 11:50
The only problem I see is if you enter the element again before the
setTimeout
occurs in which case you may also need to clearInterval
in mouseenter
also– charlietfl
Nov 14 '18 at 11:58
The only problem I see is if you enter the element again before the
setTimeout
occurs in which case you may also need to clearInterval
in mouseenter
also– charlietfl
Nov 14 '18 at 11:58
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53299054%2fsetting-function-interval-on-multiple-targets-clearing-interval-after-some-dela%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown