Змейка на js - вопрос по коду
В js не силен, поэтому решил попрактиковаться. В видео я покажу, что именно происходит, словами это сложно объяснить) Ниже привожу код, обратите внимание, код не полный, лишее для вопроса я убрал, мне нужно понять только то, что не выходит.
Видео https://youtu.be/4M7jzAjz2T4
function moveSnake(cl)
{
var x=$(".snakedeye").data("x"); // голова
var y=$(".snakedeye").data("y"); // голова - тут все данные верные - считываются из элемента верные
if (cl=="right")
{
var newx=x+1;
var newy=y;
}
else if (cl=="down")
{
var newx=x;
var newy=y+1;
}
// etc
$(".row"+y+".col"+x).attr("data-nextx",newx);//здесь пишем данные для туловища, куда им надо идти, когда они дойдут до этой клетки
$(".row"+y+".col"+x).attr("data-nexty",newy);// и здесь
$(".row"+y+".col"+x).html(newx+":"+newy);
var cilcle=0;
var snaked = $(".snaked");
$(".snaked").each(function(index,value)
{
// а внутри этого цикла все данные старые, хотя в коде они уже новые
var th=$(this);
var thisx=th.data("x");
var thisy=th.data("y");
var thisnewx=th.data("nextx"); //здесь
var thisnewy=th.data("nexty"); // и здесь данные получаются старые
})
Заранее спасибо за ответ. Хочу обратить внимание, данный код пишется для саморазвития, не надо предлагать какие-то готовые решения, я понимаю, что их полно :)
Ответы (1 шт):
Не смешивайте вызовы data и attr. Это не работает.
//$(".row"+y+".col"+x).attr("data-nextx",newx);
//$(".row"+y+".col"+x).attr("data-nexty",newy);
$(".row"+y+".col"+x).data("nextx",newx);
$(".row"+y+".col"+x).data("nexty",newy);
https://api.jquery.com/data/#data-html5
Since jQuery 1.4.3, data-* attributes are used to initialize jQuery data. An element's data-* attributes are retrieved the first time the data() method is invoked upon it, and then are no longer accessed or mutated (all values are stored internally by jQuery).
То есть
Начиная с jQuery 1.4.3, атрибуты
data-*используются для инициализации данных jQuery. Атрибутыdata-*элемента извлекаются в первый раз, когда вызывается методdata(), а затем к ним больше не обращаются (все значения хранятся внутри jQuery).