Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JS] "!=" nie działa poprawnie, a "==" już tak.
thrawn1986
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.01.2013

Ostrzeżenie: (0%)
-----


  1. var liczba = 0;
  2.  
  3. var lista = new Array()
  4. lista[0] = "Kotek";
  5. lista[1] = "Misio";
  6. lista[2] = "Piesek";

  1. var nick = document.getElementsByTagName("img");
  2.  
  3.  
  4. for (var x=0; x<nick.length; x++)
  5. {
  6. for (var z=0; z<lista.length; z++)
  7. {
  8. if ((nick[x].getAttribute("alt") == lista[z]) && (nick[x].parentNode.parentNode.parentNode.parentNode.id == "discussions"))
  9. {
  10. p.appendChild(nick[x].parentNode.parentNode.parentNode);
  11. liczba++;
  12. }
  13. }
  14. }
  15.  


Powyższy kod działa prawidłowo.
Znajduje avatar i jeśli atrybut ALT zgadza się z którąś z nazw w tablicy "lista", to przenosi cały post do innego diva.
Dzięki temu nie widzę postów od osób których nie lubię. A inne zostają.
Bardziej jednak zależy mi na tym, by widzieć posty tylko od osób które lubię, a wszystkie inne ukryć.
W tym celu zmieniłem:

  1. if ((nick[x].getAttribute("alt") == lista[z]) && (nick[x].parentNode.parentNode.parentNode.parentNode.id == "discussions"))

na
  1. if ((nick[x].getAttribute("alt") != lista[z]) && (nick[x].parentNode.parentNode.parentNode.parentNode.id == "discussions"))


Zupełnie nie rozumiem czemu zamiana "==" na "!=" sprawiła że teraz każdy post jest przenoszony, a nie tak jak chciałem, tylko te które mają inną wartość ALT, niż ta z tablicy "lista".
Tym bardziej że operator "==" działał prawidłowo.

Ten post edytował thrawn1986 9.11.2013, 09:42:01
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Odrobina logiki sie klania..... Masz liste i po niej iterujesz. Jesli cos pasuje do aktualnego elementu iteraji, to cos robisz.
Czyli zalozmy ze masz 10 elementow na liscie, dla ulatwienia niech to bedą elementy o kolejnych wartosciach 1,2,3,4,.....10.
Porownujesz do kazdego z elementow wartosc 5. No i wkoncu przy ktorejs tam iteracji wartosc 5 bedzie sie zgadzala, a przez inne iteracje bedzie sie nie zgadzala.

Robisz teraz na odwrot i robisz cos gdy sie nie zgadza. No a przeciez dla wartosci 5 nie zgadza sie az 9 elementow z listy, wiec zawsze choc raz warunek sie spelni i zrobisz co miales zrobic co w praktyce przelozy sie, ze zawsze cos sie nie zgadza. Proste i logiczne (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
SebastianW
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 9.11.2013

Ostrzeżenie: (0%)
-----


I używaj raczej:
!==
===
Zalecane.
Go to the top of the page
+Quote Post
thrawn1986
post
Post #4





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.01.2013

Ostrzeżenie: (0%)
-----


Dzięki (IMG:style_emoticons/default/smile.gif)
Faktycznie tak nakazuje logika.

Przerobiłem skrypt i teraz działa, ale częściowo.

W przypadku na którym testowałem są:
4 posty należące do Kotek
1 post należący do Misio
0 należących do Piesek
5 należących do innych użytkowników.

  1. var lista = new Array()
  2. lista[0] = "Piesek";
  3. lista[1] = "Kotek";
  4. lista[2] = "Misio";
  5.  
  6. //-------------------------
  7.  
  8. var d = document.getElementById("discussions");
  9.  
  10.  
  11. var n = document.createElement("div");
  12. d.insertBefore(n, d.firstChild);
  13. n.style.border = "thin solid white";
  14. n.style.margin = "5px";
  15. n.style.padding = "5px";
  16. n.id = "niesmietnik";
  17.  
  18.  
  19. var p = document.createElement("div");
  20. d.insertBefore(p, d.firstChild);
  21. p.style.border = "thin solid red";
  22. p.style.margin = "5px";
  23. p.style.padding = "5px";
  24. p.id = "smietnik";
  25. //p.style.display = "none";


Skrypt najpierw przerzuca wszystkie posty do elementu który ma być ukryty (p), a następnie te które chce zobaczyć do elementu (n).

  1. var nick = document.getElementsByTagName("img");
  2.  
  3. for (var y=0; y<nick.length; y++)
  4. {
  5. if (nick[y].parentNode.parentNode.parentNode.parentNode.id == "discussions")
  6. {
  7. p.appendChild(nick[y].parentNode.parentNode.parentNode);
  8. }
  9. }
  10.  
  11.  
  12. for (var x=0; x<nick.length; x++)
  13. {
  14. for (var z=0; z<lista.length; z++)
  15. {
  16. if ((nick[x].getAttribute("alt") === lista[z]) && (nick[x].parentNode.parentNode.parentNode.parentNode.parentNode.id == "discussions"))
  17. {
  18. n.appendChild(nick[x].parentNode.parentNode.parentNode);
  19.  
  20. }
  21. }
  22. }


Efekt jest taki:
2 posty należące do Kotek trafiły tam gdzie chciałem. Najpierw do "p", a potem do "n". (poprawnie)
kolejne 2 posty należące do Kotek trafił do elementu "p", ale się nie przeniosły do "n". (niepoprawnie)
1 post należący do Misio trafił tam gdzie chciałem. "p", a potem "n". (poprawnie)

Nie rozumiem czemu tak wybiórczo został potraktowany Kotek.

Ten post edytował thrawn1986 9.11.2013, 12:48:50
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




raz robisz parentNode 4 razy a raz 5 razy, choc za kazdym razem lecisz po tym samym elemencie a potem znowu sie dziwisz (IMG:style_emoticons/default/wink.gif)

=== oraz !== nie ma tutaj znaczenia
Go to the top of the page
+Quote Post
thrawn1986
post
Post #6





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.01.2013

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 9.11.2013, 18:26:16 ) *
raz robisz parentNode 4 razy a raz 5 razy, choc za kazdym razem lecisz po tym samym elemencie a potem znowu sie dziwisz (IMG:style_emoticons/default/wink.gif)

Dlatego, że pierwsza pętla wrzuca wszystkie elementy do jeszcze jednego diva,
jak chcesz, mogę to zmienić na:
  1. var nick = document.getElementsByTagName("img");
  2.  
  3. for (var y=0; y<nick.length; y++)
  4. {
  5. if (nick[y].parentNode.parentNode.parentNode.parentNode.id === "discussions")
  6. {
  7. p.appendChild(nick[y].parentNode.parentNode.parentNode);
  8. }
  9. }
  10.  
  11.  
  12.  
  13.  
  14. for (var x=0; x<nick.length; x++)
  15. {
  16. for (var z=0; z<lista.length; z++)
  17. {
  18. if ((nick[x].getAttribute("alt") === lista[z]) && (nick[x].parentNode.parentNode.parentNode.parentNode.id === "smietnik"))
  19. {
  20. n.appendChild(nick[x].parentNode.parentNode.parentNode);
  21.  
  22. }
  23. }
  24. }

Są cztery (IMG:style_emoticons/default/tongue.gif)

Cytat(nospor @ 9.11.2013, 18:26:16 ) *
=== oraz !== nie ma tutaj znaczenia

Wiem. Dlatego przerobiłem skrypt.

Tworze dwa nowe divy.
Najpierw wszystko przerzucam do diva o id "smietnik". Skrypt to robi bez problemu. Przenosi wszystko tak jak chciałem.
A potem porównuje te które się pokrywają z tablicą i przerzucam do diva o id "niesmietnik"

Wszystko działa idealnie, tylko że z 5 elementów, przerzuca mi tylko 3 (na innych podstronach również tylko 3 i ani jednego więcej).
Najdziwniejsze jest to, że są cztery identyczne elementy o ALT kotek, a skrypt przenosi z diva "smietnik" tylko dwa.
Na logikę powinno być wszystko albo wcale.

Ten post edytował thrawn1986 9.11.2013, 23:39:50
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Sprawdz czy wchodzi ci do IFow. Jak wchodzi do wina przenoszenia, jak nie wchodzi to sprawdz czemu nie wchodzi. To jest proste debugowanie
Go to the top of the page
+Quote Post
thrawn1986
post
Post #8





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.01.2013

Ostrzeżenie: (0%)
-----


  1. var test = "";
  2. var test2 = "";
  3. var test3 = "";
  4. var test4 = "";
  5.  
  6. var nick = document.getElementsByTagName("img");
  7.  
  8. for (var x=0; x<nick.length; x++)
  9. {
  10. test+=nick[x].getAttribute("alt") + " ";
  11.  
  12.  
  13. for (var z=0; z<nick.length; z++)
  14. {
  15. test2+=nick[x].getAttribute("alt") + " ";
  16. if ((nick[x].getAttribute("alt") === lista[z]) && (nick[x].parentNode.parentNode.parentNode.parentNode.id === "smietnik"))
  17. {
  18. test3+=nick[x].getAttribute("alt") + "-" + lista[z] + " ";
  19.  
  20. n.appendChild(nick[x].parentNode.parentNode.parentNode);
  21.  
  22. test4+=nick[x].getAttribute("alt") + "-" + lista[z] + " ";
  23.  
  24. }
  25.  
  26. }
  27.  
  28. }
  29.  
  30. alert("test: " + test);
  31. alert("test2: " + test2);
  32. alert("test3: " + test3);
  33. alert("test4: " + test4);


Wyniki testu:

  1. Pierwszy alert pokazuje 19 pozycji. Tyle właśnie jest pozycji IMG na stronie. Czyli wszystko jest ok.
  2. Drugi alert wypisał poprawnie liczbę powtórzeń dla każdego IMG na stronie. Czyli wszystko ok.
  3. Trzeci test zadziałał dobrze, ale tylko trzy, a nie pieć razy pokazując:
    Cytat
    misio-misio, pies-pies, misio-misio
  4. Czwarty alert mnie totalnie zaskoczył.
    Pomijając, że powinien zadziałać pięć, a nie trzy razy, to wyświetlił komunikat:
    Cytat
    misio-misio, misio-pies, misio-misio

    coś z pętla jest nie tak i nie rozumiem co.


Inną sprawa jest, że gdy zamienie:
  1. (nick[x].getAttribute("alt") === lista[z])


na przykładowe:

  1. (nick[x].getAttribute("alt") === "misio")


Wszystko działa dobrze.
!?

Ten post edytował thrawn1986 12.11.2013, 18:02:11
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 16:34