I realize there are more than a few answers on here about this but this particular instance has a very individual problem. I need to, on click, replay this png sequence after clearInterval has been used.
var myImage = document.getElementById("myImage");
var animationArray = ['assets/calvin_hobbes_dance00.png',
'assets/calvin_hobbes_dance01.png',
'assets/calvin_hobbes_dance02.png',
'assets/calvin_hobbes_dance03.png',
'assets/calvin_hobbes_dance04.png',
'assets/calvin_hobbes_dance05.png',
'assets/calvin_hobbes_dance06.png',
'assets/calvin_hobbes_dance07.png',
'assets/calvin_hobbes_dance08.png',
'assets/calvin_hobbes_dance09.png',
'assets/calvin_hobbes_dance10.png'];
var animationIndex = 0;
function changeImage () {
myImage.setAttribute("src", animationArray[animationIndex]);
animationIndex++;
if (animationIndex >= animationArray.length) {
animationIndex = 10;
clearInterval(intervalHandler);
}
}
var intervalHandler = setInterval(changeImage, 100);
A secondary question, this is merely a code sample. How might I wrap this so I can use it for elements that have animations attached that when upon focus play the animation?
Thank you.
Just add an onclick handler to your image. In the onclick handler, reset the animationIndex to 0, call clearInterval to clear the interval if it is running, and call the setInterval function again.
var myImage = document.getElementById("myImage");
var animationArray = ['assets/calvin_hobbes_dance00.png',
'assets/calvin_hobbes_dance01.png',
'assets/calvin_hobbes_dance02.png',
'assets/calvin_hobbes_dance03.png',
'assets/calvin_hobbes_dance04.png',
'assets/calvin_hobbes_dance05.png',
'assets/calvin_hobbes_dance06.png',
'assets/calvin_hobbes_dance07.png',
'assets/calvin_hobbes_dance08.png',
'assets/calvin_hobbes_dance09.png',
'assets/calvin_hobbes_dance10.png'];
var animationIndex = 0;
function changeImage () {
myImage.setAttribute("src", animationArray[animationIndex]);
animationIndex++;
if (animationIndex >= animationArray.length) {
animationIndex = 10;
clearInterval(intervalHandler);
}
}
myImage.onclick = function() {
animationIndex = 0;
clearInterval(intervalHandler);
intervalHandler = setInterval(changeImage, 100);
};
var intervalHandler = setInterval(changeImage, 100);
To answer your secondary question, you might want to consider another approach because this could get kind of messy and be hard to maintain in the future. Consider learning how to do animations using HTML canvas. Here is a tutorial I found showing how you could create multiple animations: http://www.williammalone.com/articles/create-html5-canvas-javascript-sprite-animation/
In fact, I would advise to change your implementation to use the canvas instead.
Related
i'm trying to cycle through 3 images using a for loop in javascript. Here is my code:
<img name="slide" width="300" height="300">
var i=0;
var images = [];
images[0] = "images/1.jpg";
images[1] = "images/2.jpg";
images[2] = "images/3.jpg";
function changeImage () {
for(i=0; i < images.length; i++) {
document.slide.src = images[i];
}
}
window.onload = changeImage;
Currently, only image 3 is displayed. Anyone know what i'm doing wrong here?
Yes - this is because your for loop run finishes instantly so there's no time for slides 1 and 2 to be shown.
Give this a try:
var currentImage = 0,
images = [
"https://unsplash.it/200/300?image=100",
"https://unsplash.it/200/300?image=101",
"https://unsplash.it/200/300?image=102"
];
function initSlideshow() {
setImage(0);
setInterval(function(){
nextImage();
},1000);
}
function nextImage() {
if(images.length === currentImage + 1){
currentImage = 0;
} else {
currentImage++;
}
setImage(currentImage);
}
function setImage(image) {
document.querySelectorAll('.slide')[0].src = images[image];
}
window.onload = initSlideshow();
Example: https://jsfiddle.net/vvbdwazc/
Currently, only image 3 is displayed. Anyone know what i'm doing wrong
here?
it's all being displayed but the reason why you can only see the 3rd image is because you're not pausing for a certain time before displaying the next image hence it seems like it's not working.
use setInterval() method to show each image after a specified time.
Example:
var i=0;
var images = [];
images[0] = "images/1.jpg";
images[1] = "images/2.jpg";
images[2] = "images/3.jpg";
function changeImage () {
for(i=0; i < images.length; i++) {
document.slide.src = images[i];
}
}
var myVar = setInterval(function(){ changeImage() }, 1000);
You may later wish to prevent the setInterval() method from executing any longer in that case have a look at clearInterval().
window.onload = changeImage; tells me you want to change the image on page load event? In other words, the image changes only upon page load (or refresh).
Since state is not maintained by default (eg local storage or session storage or cookies) your best bet would be to use a random generator to choose randomly. See Generating random whole numbers in JavaScript in a specific range?
This is because the for works so fast it gets quickly to the third image. You could use instead some setInterval like this:
<img id="slide" width="300" height="300">
<script>
var images = [];
images[0] = "images/1.jpg";
images[1] = "images/2.jpg";
images[2] = "images/3.jpg";
var i = 0;
setInterval(function() {
var slide = document.querySelector("#slide"); //Select the img element by ID
slide.src = images[i++];
if(i > images.length - 1)
i = 0;
}, 1000); //Time in milliseconds
</script>
This will change constantly back to the first image when it reaches the last one.
Edit: Forgot to mention. setInterval works like a "repeater", it will work indefinitely until you clear it. To clear it you need to asign it to a variable and then use clearInterval passing the variable.
var interval = setInterval(function(){}, 1000) //example
clearInterval(interval);
Like so.
I am making a simple image slider that runs through a directory containing images. The images is called "img_1", "img_2" and "img_3", so the point is to just iterate through them. The thing I don't get is how to implement a interval though. I want the images appear for 3 seconds, then change. The function "imgSlider" is on body load.
Edit: I am looking for simple solutions (in pure JS) as I am currently learning JS. Sorry for not clarifying it in the question. Lots of good answers here though!
function changeImg(img, i){
img.setAttribute("src", "img/slider/img_" + i + ".jpg");
}
function imgSlider(){
var img = document.createElement("img");
var targetDiv = document.getElementById("slider");
img.setAttribute("width", "100%");
img.setAttribute("height", "70%");
targetDiv.appendChild(img);
for(i=1; i<4; i++){
setInterval(changeImg(img, i), 3000);
}
}
What you need to do is simple, you have to change the setInterval code like this:
$(function () {
var curImg = 1;
setInterval(function () {
$("img").attr("src", "//placehold.it/100?text=" + ++curImg);
}, 2000);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<img src="//placehold.it/100?text=1" />
Here, I have given an interval of 2 seconds for checking. I have used jQuery only for the updating of image. If you want it in plain JavaScript, it is possible through your code.
Pure JS Version
var curImg = 1;
setInterval(function () {
document.getElementsByTagName("img")[0].src = "//placehold.it/100?text=" + ++curImg;
}, 2000);
<img src="//placehold.it/100?text=1" />
You can do it this way.
Initialize a counter, that will keep a track of current image to being displayed. Now all we need to is call showImage function that will show the image corresponding to the current value of the counter.
Repeat this every 3sec.
var count = 0;
setInterval( function() {
showImage(count);
count = (count+1)%total_no_of_images
}, 3000)
setInterval takes a function, you need to pass it a reference to a function that it will run at the appropriate interval.
Also, note that as of this writing, the accepted answer assumes there are infinite images and has an "infinite loop" style of interval, which should be avoided if at all possible. Here, I stop the clock after the fifth image.
const changeImg = (img, i) => {
img.setAttribute('src', `img/slider/img_${i}.jpg`);
};
const imgSlider = () => {
const img = document.createElement('img');
const targetDiv = document.getElementById('slider');
img.setAttribute('width', '100%');
img.setAttribute('height', '70%');
targetDiv.appendChild(img);
let i = 0;
const interval = setInterval(
() => {
changeImg(img, i);
i += 1;
if (i > 4) {
clearInterval(interval);
}
},
3000
);
};
I'm trying to make a little browser game where you can shoot bullets.
Right now I am able to make a bullet, but I don't know how to get in moving.
I have done this:
var bullet_id = 1;
var timer_id; // reference of the timer, needed to stop it
var speed = 350; // pixels/second
var period = 10; // milliseconds
var sprite; // the element that will move
var sprite_speed = 0; // move per period
var sprite_position = 315; // pixels
function createbullet() {
var img = document.createElement("img");
img.src = "images/bullet.png";
img.id = "bullet";
img.name = "bullet";
var foo = document.getElementById("fooBar");
foo.appendChild(img);
move(1);
bullet_id++;
}
function animate ()
{
document.getElementById("bullet").style.left=340 + "px";
sprite_position += sprite_speed;
sprite.style.left = sprite_position+'px';
}
function move(direction)
{
if (timer_id) stop();
sprite_speed = speed * period/1000 * direction;
timer_id = setInterval (animate, period);
}
function stop()
{
clearInterval (timer_id);
timer_id = null;
}
function init()
{
sprite = document.getElementById ("bullet"); // the HTML element we will move
animate(); // just to initialize sprite position
}
window.onload = init; // start doing things once the page has loaded */
I tried to add a bullet_id system but I couldn't get it working really.
Here is my html
<a onmousedown="document.jack.src=image2.src;" onmouseup="document.jack.src=image1.src;" onclick="createbullet()"><img id="jack" name="jack" src="/images/jack1.png" /></a>
<div id="fooBar"></div>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript">
document.getElementById('jack').addEventListener('click',function(){...})
Ok so maybe I didn't think that one through, have just designed one to see if I could and it works, hope it helps:
/********************************************************/
stg=0
bgx=0
spd=70
buls=0
act=false
/********************************************************/
function ani(){
var int
act=true
bgx-=52
stg++
$('#jack').css('background-position','-52px 0px')
int=setInterval(function(){
if(stg<4){bgx-=52; stg++}
else{ bgx=0; stg=0 }
$('#jack').css('background-position',bgx+'px 0px')
if(stg==4) new Bullet();
if(!stg){
act=false
clearInterval(int)
}
},spd)
}
/********************************************************/
function Bullet(){
var x,img,int
x=52
img=document.createElement('img')
img.src='bullet.png'
img.setAttribute('class','mh posAbs')
img.setAttribute('style','top:0px;left:'+x+'px')
img.setAttribute('id','bul'+buls)
scre.appendChild(img)
img=document.getElementById('bul'+buls)
buls++
int=setInterval(function(){
if(x<300){
x+=13
img.setAttribute('style','top:0px;left:'+x+'px')
}
else{
img.src='exp.png'
clearInterval(int)
setTimeout(function(){ scre.removeChild(img) },100)
}
},spd)
}
/********************************************************/
$(document).ready(function(){
$('html').keydown(function(){
if(!act){
if(event.keyCode==13) ani();
}
})
$('html').click(function(){
if(!act) ani();
})
})
/********************************************************/
<div id="scre" class="posRel">
<div id="jack"></div>
</div>
<style>
#jack{
width:52px;
height:37px;
background:url('02.png') no-repeat;
background-position:0px 0px;
background-size:auto 100%
}
</style>
Ok so what's happening above is every time you click or press Enter, the firing animation is called, which is animated in stages and when it gets to a certain stage it calls upon the Bullet() constructor to create a new Object or bullet.
While creating the bullet, the constructor generates an <img> and gives it a unique id based upon the buls variable, which is then incremented to keep the id's unique.
This is the most important part:
img=document.getElementById('bul'+buls)
It will NOT work without it as any references to img in the code after it will refer to the last img created and not say:- 'bullet 5 of 10 that are on screen'.
Once created the Bullet object handles the movement of the image it is referenced to, removing the need to move it with any other code...
P.S. The $('html').keydown(...) acts as an auto-fire!
I am trying to make a changing background. So what I am trying to do is using SetInterval to change my background but whenever it changes, it leaves a white background and then turn to the image like I intend. Any advices on how to fix it?
My code:
var image = new Array();
image.push("url('./1.png')");
image.push("url('./2.png')");
image.push("url('./3.png')");
image.push("url('./4.png')");
image.push("url('./5.png')");
var imagenum = 0;
function changeBackground () {
imagenum++;
if (imagenum==5) {
imagenum = 0;
}
document.getElementById("bodydiv").style.backgroundImage = image[imagenum];
}
function init () {
setInterval(function () {changeBackground()},1000);
}
Bonus: If I set the setInterval a little bit lower, I will have the whole blank site. It works perfectly due to the code, but the flash really irritates me. Can anyone help me with it?
I placed the init() function in the preloadImages() one because it forces init() to only ever run when all images are preloaded. There are other ways to do this however.
var images = new Array();
function preloadImages() {
i=1
foreach(preloadImages.arguments as img)
images[i] = new Image()
images[i].src = img
i++
}
init()
}
function changeBackground () {
imagenum++;
if (imagenum==5) {
imagenum = 0;
}
document.getElementById("bodydiv").style.backgroundImage = image[imagenum];
}
function init () {
setInterval(function () {changeBackground()},1000);
}
var image = [
'./1.png',
'./2.png',
'./3.png',
'./4.png',
'./5.png'
]
preloadImages(image);
I could not figure out how to stop image intervals when the mouse is over the image.
var myImage = document.getElementById("world");
var imageArray = ["imgs/worldGray.png","imgs/worldGreen.png","imgs/worldPink.png", "imgs/worldYellow.png", "imgs/world.png"];//html picture add here
var imageIndex=0;
function changeImage(){
myImage.setAttribute("src",imageArray[imageIndex]);
imageIndex++;
if(imageIndex >=imageArray.length){
imageIndex =0;
}
}
var intervalHandle=setInterval(changeImage,5000);
// the problem is in the below fucntions
myImage.onmouseover = function(){
clearInterval(intervalHandle);
}
myImage.onmouseout = function(){
setInterval(intervalHandle);
}
I'm not shure why you are setting the interval again using the "intervalHandler", and don't think there is such a use.
http://www.w3schools.com/jsref/met_win_setinterval.asp
You should write
intervalHandle=setInterval(changeImage,5000);
inside onmouseout handler to make it run correctly.
Try putting your script at the bottom of page. It worked for me