I can move one image by define for each but I need to do it in for loop, I have a code as I show below,
var elem = document.querySelectorAll(".yikama");
var el;
for (i = 0; i = elem.length; i++)
{
var el = elem[i]
el.addEventListener("mousedown", start)
function start() {
addEventListener("mousemove", move)
}
function move(b) {
b = b || event;
el.style.left = b.pageX - 290 + "px";
el.style.top = b.pageY - 190 + "px";
}
el.addEventListener("mouseup", function () {
removeEventListener("mousemove", move);
})
}
But I had an error which is Uncaught TypeError: Cannot read property ‘addEventListener’ of undefined at 1:141 What should I do to fix it?
Advertisement
Answer
You have couple mistakes as first you need condition in for loop’s second statement like i == elem.length
or i === elem.length
. From your code you should be using i < elem.length
. P.S. You are having an assignment (i = elem.length)
here which will not work. It will assign elem.length
to variable i
and based on value it will return true
or false
. In your case it will never break the loop and go for infinite loop.
Second mistake is you are not assigning move
event to any element. You need to use el.addEventListener
& el.removeEventListener
inside start
& mouseup
event.
Use let el
instead of var el
, so it won’t cause closure issue. Add b.preventDefault();
inside move
function.
Try complete code like below.
var elem = document.querySelectorAll(".yikama");
for (i = 0; i < elem.length; i++)
{
let el = elem[i]
el.addEventListener("mousedown", start)
function start() {
el.addEventListener("mousemove", move)
}
function move(b) {
b.preventDefault();
b = b || event;
el.style.left = b.pageX - 290 + "px";
el.style.top = b.pageY - 190 + "px";
}
el.addEventListener("mouseup", function () {
el.removeEventListener("mousemove", move);
})
}