setInterval function using jquery is causing a "blink" - javascript

Personal project using jQuery.
I'm trying to create a function that runs on the hour for 5 seconds. I've done this by getting the current minutes and acting when they are at '00'. (Although for testing the minutes need to be manually changed to the next minute, unless you want to wait an hour to see it run again.)
The function acts on 2 objects, one to add/remove a class, the other to slideUp/Down.
It works, but after the initial running, the slideDown/Up jQuery causes a "blink" every 5 seconds for the rest of the current minute.
I've tried setting the setInterval for 5000, however that hasn't solved the issue. I'm at my wits end really.
While I am also using moment.js elsewhere. This function isn't using moment(). Primarily because I haven't been able to get functions working with moment() either.
Just head to the ....
jsFiddle example
Remember to set the =='00' to the next minute -- sure makes testing easier I really appreciate anyone waiting for this to run. I know it can be a pain to have to wait a minute to see the function at work.
If you watch the function run for 5 seconds, it will stop... but continue watching.. the slideDown() will repeat every 5 seconds until the minute is no longer XX.
How can I stop this repeat??
Thanks!

There're two place for fix.
1. miss usage for 'clearInterval'
clearInterval parameter is The ID of the timer returned by the setInterval() method.
reference this link, w3c definition for clearInterval.
var intervalId = setInterval(function() { alarm(); }, 5000);
...
clearInterval(intervalId );
2. secs >= "05" condition is wrong
change string "05" to int 5.

Believe it or not I sorted it a few moments after posting this.
My conditional was off, and I thought I tried everything. Guess not.
This works
if((mins == "29") && (secs <= '05')) {
$('#focus').slideDown(500);
$('.projcnt').addClass('jump');
} else {
$('#focus').slideUp(300);
$('.projcnt').removeClass('jump');
}
And the ...
working, updated fiddle

Related

I need help creating a loop in dev console in firefox

I am trying to use the dev console to give mario a mushroom every 5 seconds (in the browser game super mario html5)
I can give mario mushrooms manually by typing marioShroons(mario) but I would like to have it on loop so I don't have to pause the game every time I want a mushroom. I have tried a while loop and set timeout but I can't figure it out. The only coding languages I familiar with are c++ and html.
**
while(data.time.amount > 0) {
killOtherCharacters()
}
setTimeout(function() {
killOtherCharacters()
}, 1000);
I expected these lines of code to not give me a mushroom, but to automatically kill enemies. But on the first try (the while loop) it froze the tab and I had to reload the page.
With the set timeout, it didn't make any obvious results, it killed all near characters once and then stopped.
You tried using setTimeout, and it only worked once. This is to be expected, because:
Window.setTimeout() sets a timer which executes a function or specified piece of code once the timer expires
From MDN
What you need to do is use setInterval:
The setInterval() method...repeatedly calls a function or executes a code snippet, with a fixed time delay between each call.
From MDN
So in your console, you should write this:
setInterval(killOtherCharacters, 1000);
(I removed the anonymous function because it wasn't needed - you only need an anonymous function if you're passing parameters or doing multiple things. You do need to remove the () for this though).
And if you want to stop the function from executing, assign a variable to the interval:
var killCharacters = setInterval(killOtherCharacters, 1000);
Then call clearInterval upon this variable to clear the interval (stop the loop):
clearInterval(killCharacters);
The reason your while loop froze the page is because Javascript can only do one thing at a time and you told it to always run your while function, blocking all other Javascript from running on your site.
setTimeout is only run once after a set time (see documentation), if you want to run something every x miliseconds it's better to use setInterval instead.
var intervalID = window.setInterval(killOtherCharacters(), 500); //run this every 500 ms
Use setInterval if you want killOtherCharacters() to be called repeatedly.
const interval = setInterval(function() {killOtherCharacters() },1000);
Then when you want the function to stop being called:
clearInterval(interval);

How to make a very simple countdown timer in Javascript?

I'm making a simple game which generates random numbers and user has to enter a value, if users value matches the random value generated, the user wins basically this is a beginner project. I want to make a small counter so that user has a limited time to put in the value and I want that limited time to show on the screen in a label. Lets say that you have to put the value under 30 secs and the timer will count from 1 to 30 every second. The counting from 1 to 30 will update in the label every second. This is the logic I'm trying to work on right now and I can't figure out any other way... If I've done some mistake in code please comment or if you have much more simpler way please post it down below. (pls dont vote down im at threat of account suspension)
Heres the part of my timer code:
if(timer <= 30)
{
for(var i = 0;i >= 30;i++)
{
setInterval(null,1000);
timer++;
document.getElementById("counter").innerHTML = timer+" seconds wasted";
}
alert("Time is over, you lost by "+s);
}
You could create a recursive function.
Say var countDown function(){ time = time--;
setTimeout(countDown, 1000);}
Then you need a variable time that is accessible for the countDown function.
var time = 30;
In the countDown function you could create an updateTimeElement.
Try it out.
The setInterval function has 2 parameters, a callback (an anomynous function in javascript thats triggered) and the milliseconds between each trigger of the interval.
What you are doing in your script is making an interval with nothing to do each second (this runs indefinately), then increment the timer integer and updating the DOM. However, this all executes within seconds.
I'd suggest (before you use a function) you look at the documentation to see how you can improve your script to work as you intent to ;-) Here are a few links that might help you get started:
http://www.w3schools.com/js/js_timing.asp
https://www.sitepoint.com/build-javascript-countdown-timer-no-dependencies/
I wont be doing the work for you, since this is a good exercise for a beginner programmer ;-)
If you can't figure it out, leave a comment below this answer and I'll get back to you to help you if you need further assistance.

how to find what is currently in the callback queue in nodejs

I'm looking at some code that uses setInterval to call a function every 30 seconds, but it doesn't look like it's firing every 30 seconds, in fact it fires every 3 minutes roughly. I think it's because there are other functions enqueued and it takes a while to get to call this function. Please correct me if I'm wrong.
Is there any way to check what's there on the callback queue either visually or even something simple to dump every 1 sec to some log file?
You can use process._getActiveHandles() and process._getActiveRequests()
See this discussion in node.js mailing list.
update: there is a good package for this - https://github.com/mafintosh/why-is-node-running
You can use this to check that it is called e.g. every 30 seconds:
setInterval(function() { console.log(new Date());}, 30000);

How do I get this code to repeat without refreshing page? setInterval? Other?

Hello I've written a bit of Javascript that I need to get to run every second. It is actually a Flash design of the sun that is supposed to change with the actual position of the sun outside.
this.addEventListener("tick",fl_RotateContinuously.bind(this));
var currentdate = new Date();
function fl_RotateContinuously(){
this.sky1.rotation=(currentdate.getHours()*15-90)+(currentdate.getMinutes()*3/12)+(currentdate.getSeconds()*3/720);
}
The above code works and displays the sun in the correct position. However, I need the code to run every second, otherwise the user needs to refresh the HTML page to see the new position of the sun. I've tried using the setInterval() code to get the function to run every second, however I must not be writing it correctly because it will not work. Perhaps this isn't even the correct way to do it at all... Can anyone show me the correct way to repeat this function every second?
Would you mind showing your setInterval approach?
One way of implementing it would be:
window.setInterval(function() { fl_RotateContinuously(); }, 1000); //1000 (ms) = 1s
The way you use the setInterval Function is
setInterval(functionName, 1000)
The first parameter is the function name without calling it, and the second parameter is the time in milliseconds that you want it to wait to call the function again.
https://jsfiddle.net/rhbritton/01t8yq2h/

How to i update this jQuery plugin?

I am using this plugin and I want to update the timer.
I can start the countdown timer at 5000 milliseconds left like this:
$('#CountdownTimer').countdown({ remaining : 5000});
But when I try to update it with this call, I guess I initialize it again or something because the timer doesn't update like I assumed
$('#CountdownTimer').countdown('update', 2000);
It basically speeds up the countdown timer and if I run this again, it speeds it even more... But what I want to do is reset it to 2000 milliseconds
Any ideas?
Haven't used this function before, but it looks like this should work:
$('#CountdownTimer').countdown('destroy');
Just call it before reinitializing the countdown.
EDIT
In the library, change the line:
tick_interval = setInterval(tick, 1000);
to read
if (tick_interval == null) tick_interval = setInterval(tick, 1000);
If I'm reading the library code correctly, 'update()' only updates the displayed time remaining, not the actual countdown clock. There doesn't seem to be a way to do what you want as it's written right now, but it wouldn't be to hard to add that functionality if you wanted to do it yourself...

Categories