Setting function interval on multiple targets, clearing interval after some delay










1















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 = ['?', '/', '<', '>', '}', ' 











1















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 = ['?', '/', '<', '>', '', ' 









1












1








1


0






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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 14 '18 at 11:22









Karolis Antanas SvirskasKarolis Antanas Svirskas

82




82






















      1 Answer
      1






      active

      oldest

      votes


















      0














      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






      share|improve this answer























      • 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











      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
      );



      );













      draft saved

      draft discarded


















      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









      0














      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






      share|improve this answer























      • 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
















      0














      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






      share|improve this answer























      • 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














      0












      0








      0







      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






      share|improve this answer













      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







      share|improve this answer












      share|improve this answer



      share|improve this answer










      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 the setTimeout occurs in which case you may also need to clearInterval in mouseenter also

        – charlietfl
        Nov 14 '18 at 11:58


















      • 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

















      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




















      draft saved

      draft discarded
















































      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.




      draft saved


      draft discarded














      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





















































      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







      Popular posts from this blog

      Use pre created SQLite database for Android project in kotlin

      Darth Vader #20

      Ondo