Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN kdy 14. 11. 2016, 10:40:56

Název: JavaScript - splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN kdy 14. 11. 2016, 10:40:56
Ahoj...
pomohl by mi někdo objasnit proč:

if ( $('#id1').is(':checked') && $("#id2").hover ) {
                          alert ("ahoj");}

se vykoná i když není provedena druhá podmínka

$('#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
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: podlesh kdy 14. 11. 2016, 11:05:23
Nejsem nijak velký expert na jquery, ale IMHO
$("#id2").hover
je funkce, takže efektivně "true" = druhá podmínka je splněna.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN 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:
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:
if ( $('#id1').is(':checked') && $("#id2").hover ) {
                                                                         alert ("ahoj");
                                                                         }

Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: gll kdy 14. 11. 2016, 11:38:27
Nechtěl jsi testovat tohle?


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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: brendan kdy 14. 11. 2016, 11:40:02
Musis tam dat
$("#id2").is(":hover") 

chces preci testovat jestli je stav hover, ne jestli libovlna funkce existuje .
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: gll kdy 14. 11. 2016, 11:41:18
Citace od: gll kdy 14. 11. 2016, 11:38:27
Nechtěl jsi testovat tohle?


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:


if ( $('#id1').is(':checked') && $("#id2:hover").length ) {
                          alert ("ahoj");}


Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: gll kdy 14. 11. 2016, 11:42:20
Citace od: brendan kdy 14. 11. 2016, 11:40:02
Musis tam dat
$("#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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: Michal Kovacic 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...
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: gll kdy 14. 11. 2016, 11:50:09
Citace od: Michal Kovacic 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...

Je to úplně jedno. V debuggeru si mohu zobrazit hodnotu výrazu stejně jako proměnné.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: brendan 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:
(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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN 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/
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: linuxtardis kdy 14. 11. 2016, 13:43:10
A nemyslíte to náhodou takhle?
$("#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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN kdy 14. 11. 2016, 14:15:35
Citace od: linuxtardis kdy 14. 11. 2016, 13:43:10
A nemyslíte to náhodou takhle?
$("#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