Mam jakiś kod JavaScript / JQuery używany do tworzenia przejść obrazów. $ (obj) to pudełko zawierające dwa obrazy, które jest wielkością każdego obrazu. Poniższy fragment kodu służy do wyboru nowej lokalizacji poza granicami $ (OBJ), co różni się od poprzedniej stosowanej lokalizacji (ponieważ jeden obraz przesuwny w prawo, a nowy pochodzi z lewego wygląda znacznie lepiej niż jeden przesuwany w prawo, podczas gdy inny pochodzi z prawej strony.)

            var newLoc = Math.floor((Math.random() * 4));
            if ($(obj).data('lastloc') == newLoc) {
                console.log("FIXED "+newLoc);
                if (newLoc == 3) newLoc = 2;
                if (newLoc == 2) newLoc = 3;
                if (newLoc == 0) newLoc = 1;
                if (newLoc == 1) newLoc = 0;
                console.log("WITH "+newLoc);
            }

Problem, który mam, jest to, że zarówno Chrome, jak i Firefox wysyłają to w konsoli JavaScript:

FIXED 3
WITH 3

Jak to jest możliwe?

2
Eric Dubé 13 sierpień 2014, 23:41

4 odpowiedzi

Najlepsza odpowiedź

Aby prawidłowo mapować zmienną NewLoc na inny numer, możesz użyć obiektu, który obejmowałby tę zmianę.

Zmiana

if (newLoc == 3) newLoc = 2;
if (newLoc == 2) newLoc = 3;
if (newLoc == 0) newLoc = 1;
if (newLoc == 1) newLoc = 0;

Do

var newLoc = Math.floor((Math.random() * 4));
var loc = { 3: 2, 2: 3, 0: 1, 1: 0 };
if ($(obj).data('lastloc') == newLoc) {
 console.log("FIXED "+newLoc);
 newLoc = loc[newLoc] || newLoc;
 console.log("WITH "+newLoc);
}
3
Travis J 13 sierpień 2014, 19:47

Potrzebujesz else if. Po prostu się tu spada

if (newLoc == 3) newLoc = 2;
if (newLoc == 2) newLoc = 3;

Spróbuj tego zamiast tego

if (newLoc == 3) newLoc = 2;
else if (newLoc == 2) newLoc = 3;
else if (newLoc == 0) newLoc = 1;
else if (newLoc == 1) newLoc = 0;

Lub użyj właściwego switch

10
Daniel A. White 13 sierpień 2014, 19:43

Używałbyś else, aby obsługiwać tylko jeden z warunków:

if (newLoc == 3) newLoc = 2;
else if (newLoc == 2) newLoc = 3;
else if (newLoc == 0) newLoc = 1;
else if (newLoc == 1) newLoc = 0;

Możesz także użyć przełącznika:

switch (newLoc) {
  case 3: newLoc = 2; break;
  case 2: newLoc = 3; break;
  case 0: newLoc = 1; break;
  case 1: newLoc = 0; break;
}

Lub warunkowych operatorów:

newLoc =
  newLoc == 3 ? 2 :
  newLoc == 2 ? 3 :
  newLoc == 0 ? 1 :
  newLoc == 1 ? 0 :
  newLoc;

Jeśli te cztery wartości są jedynymi wartościami, które mogą mieć zmienną, możesz nawet obliczyć nową wartość. Po prostu przerzucanie bitów zero da Ci nową wartość:

newLoc ^= 1;
4
Guffa 13 sierpień 2014, 19:46

Ponieważ twoja logika jest pomieszana:

 if (newLoc == 3) newLoc = 2;
 if (newLoc == 2) newLoc = 3;

Jeśli jest 3, to idzie do 2, to jest z powrotem do 3.

Musisz je zmienić na else if instrukcje po pierwszym, jeśli

1
Jay 13 sierpień 2014, 19:52