Fórum Root.cz

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

Název: JavaScript - splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN 14. 11. 2016, 10:40:56
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
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: podlesh 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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN 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");
                                                                         }
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: gll 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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: brendan 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 .
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: gll 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");}

Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: gll 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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: Michal Kovacic 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 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é.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: brendan 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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN 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 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.
Název: Re:JavaScript -splnění podmínek řetězených operátorem &&
Přispěvatel: ZAJDAN 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