JavaScript - splnění podmínek řetězených operátorem &&

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Ahoj...
pomohl by mi někdo objasnit proč:

Kód: [Vybrat]
if ( $('#id1').is(':checked') && $("#id2").hover ) {
                          alert ("ahoj");}
se vykoná i když není provedena druhá podmínka

Kód: [Vybrat]
$('#id1').is(':checked') && $("#id2").hover (function(){
  alert("Ahoj")
});
se vykoná pouze když jsou splněny obě dvě podmínky

zajimal by mne zpusob, jak si nejlepe vynutit, že k "akci" má dojít, jen za splnění všech podmínek
« Poslední změna: 14. 11. 2016, 17:40:57 od Petr Krčmář »
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


podlesh

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #1 kdy: 14. 11. 2016, 11:05:23 »
Nejsem nijak velký expert na jquery, ale IMHO
Kód: [Vybrat]
$("#id2").hoverje funkce, takže efektivně "true" = druhá podmínka je splněna.

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #2 kdy: 14. 11. 2016, 11:24:29 »
zjistil jsem, že pokud je v podmínce if volána funkce tak se ověřují všechny podmínky:
Kód: [Vybrat]
if ( $('#id1').is(':checked') && $("#Iid2").hover  (function() { 
                           alert("ahoj");
                                                                                  })
);

pokud není akce wrapnuta do funkce, provede se akce i za splnění pouze první podmínky:
Kód: [Vybrat]
if ( $('#id1').is(':checked') && $("#id2").hover ) {
                                                                         alert ("ahoj");
                                                                         }
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

gll

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #3 kdy: 14. 11. 2016, 11:38:27 »
Nechtěl jsi testovat tohle?

Kód: [Vybrat]
if ( $('#id1').is(':checked') && $("#id2:hover") ) {
                          alert ("ahoj");}

Jak zde už někdo psal, $("...").hover je funkce a ta se vždy vyhodnocuje jako true.

brendan

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #4 kdy: 14. 11. 2016, 11:40:02 »
Musis tam dat
Kód: [Vybrat]
$("#id2").is(":hover") 

chces preci testovat jestli je stav hover, ne jestli libovlna funkce existuje .


gll

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #5 kdy: 14. 11. 2016, 11:41:18 »
Nechtěl jsi testovat tohle?

Kód: [Vybrat]
if ( $('#id1').is(':checked') && $("#id2:hover") ) {
                          alert ("ahoj");}

Jak zde už někdo psal, $("...").hover je funkce a ta se vždy vyhodnocuje jako true.
oprava:

Kód: [Vybrat]
if ( $('#id1').is(':checked') && $("#id2:hover").length ) {
                          alert ("ahoj");}


gll

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #6 kdy: 14. 11. 2016, 11:42:20 »
Musis tam dat
Kód: [Vybrat]
$("#id2").is(":hover") 

chces preci testovat jestli je stav hover, ne jestli libovlna funkce existuje .

Máš pravdu, napsal jsem to špatně. Dík za opravu.

Michal Kovacic

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #7 kdy: 14. 11. 2016, 11:46:13 »
Hmmm... Možná starý a nudný způsob by pomohl najít problém dříve - svého času to byl dobrý zvyk programátorů:

Pseudo kód:

bool bCondition1 = something
bool bCondition2 = something
if (bCondition1 && bCondition2) then do something

Debug kód pomůže najít chybu velice rychle, release kód to stejně zoptimalizuje do "téměř" ideální podoby...

gll

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #8 kdy: 14. 11. 2016, 11:50:09 »
Hmmm... Možná starý a nudný způsob by pomohl najít problém dříve - svého času to byl dobrý zvyk programátorů:

Pseudo kód:

bool bCondition1 = something
bool bCondition2 = something
if (bCondition1 && bCondition2) then do something

Debug kód pomůže najít chybu velice rychle, release kód to stejně zoptimalizuje do "téměř" ideální podoby...

Je to úplně jedno. V debuggeru si mohu zobrazit hodnotu výrazu stejně jako proměnné.

brendan

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #9 kdy: 14. 11. 2016, 11:58:51 »
V podstate na takove pripady je dobra konzole a otestovat jednotlive operandy podminky. Jeho spatny vyraz v podstate delal tohle:
Kód: [Vybrat]
(function(){}) ? console.log('ano') : console.log('ne');Protoze JS neni strong type jazyk, tak jako fallback se i existence objektu vyhodnoti jako true. I kdyz hodnota sama o sobe true neni.

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #10 kdy: 14. 11. 2016, 12:30:19 »
hosi ono je uplne jedno zda je v podmince .hover ; is(":hover")
ty podminky se overuji spravne jen kdyz je akce uvnitr funkce..
zkuste si to tady:
https://jsfiddle.net/1Lfo3ybh/1/
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #11 kdy: 14. 11. 2016, 13:43:10 »
A nemyslíte to náhodou takhle?
Kód: [Vybrat]
$("#id2").hover (function() {
    if ($("#id1").is(":checked"))
      alert("Ahoj");
  }, function() {});
Tzn. zaregistruju funkci, která udělá to, že když je vjedu na #id2, zkontroluje podmínku, jestli je #id1 čeknutý a když je, tak to hodí alert.
Jestli to chcete jednorázově ověřovat, tak řešení od brendana dává největší smysl.

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:JavaScript -splnění podmínek řetězených operátorem &&
« Odpověď #12 kdy: 14. 11. 2016, 14:15:35 »
A nemyslíte to náhodou takhle?
Kód: [Vybrat]
$("#id2").hover (function() {
    if ($("#id1").is(":checked"))
      alert("Ahoj");
  }, function() {});
Tzn. zaregistruju funkci, která udělá to, že když je vjedu na #id2, zkontroluje podmínku, jestli je #id1 čeknutý a když je, tak to hodí alert.
Jestli to chcete jednorázově ověřovat, tak řešení od brendana dává největší smysl.

přesně takto jsem to již přepsal...jasné, funkční..aspon pro mne tedy
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.