Autor Zpráva
midlan
Profil
Zdravím, mám kód typu:
$("#id input[name="+nazvy[0]+"]").keyup(function() {
    if(podminka_s_$(this).value_ktera_je_pokazde_jina) {
      objekt.metodaPrvni(0);
      ready[0] = false;
    }
    else {
      objekt.metodaDruha(0);
      ready[0] = true;
    }
  });
  $("#id input[name="+nazvy[1]+"]").keyup(function() {
    if(podminka_s_$(this).value_ktera_je_pokazde_jina) {
      objekt.metodaPrvni(1);
      ready[1] = false;
    }
    else {
      objekt.metodaDruha(1);
      ready[1] = true;
    }
  });
  .
  .
  .
    $("#id input[name="+nazvy[n]+"]").keyup(function() {
    if(podminka_s_$(this).value_ktera_je_pokazde_jina) {
      objekt.metodaPrvni(n);
      ready[n] = false;
    }
    else {
      objekt.metodaDruha(n);
      ready[n] = true;
    }
  });
  


Prostě se to furt opakuje, jen se mění to jedno číslo a poodmínka. Napadlo mě podmínky naházet do pole, ale pak zas nevím jak s tím $.keyup a $(this) :/

Napadá někoho jek to chytře zkrátit? Děkuji :)
midlan
Profil
Navíc by se mi hodilo kdyby se příkazy a funkce prováděné při .keyup, provedly i při .change, nevíte někdo jak to udělat abych to nemusel hloupě okopírovat? Do funkce to podle mě nepůjde dát kvůli tomu $(this), co myslíte?
Marek88
Profil
Udělej si na to funkci:
function nazev_funkce(input, cislo, hodnota) {
    if(podminka_s_$(input).hodnota) {
      objekt.metodaPrvni(cislo);
      ready[cislo] = false;
    }
    else {
      objekt.metodaDruha(cislo);
      ready[cislo] = true;
    }
  }
  
  // a takhle to budeš přiřazovat
$("#id input[name="+nazvy[0]+"]").keyup(function() {nazev_funkce(this, 0, value_ktera_je_pokazde_jina) });
$("#id input[name="+nazvy[1]+"]").keyup(function() {nazev_funkce(this, 1, value_ktera_je_pokazde_jina) });
...
$("#id input[name="+nazvy[n]+"]").keyup(function() {nazev_funkce(this, n, value_ktera_je_pokazde_jina) });

  // podobně pro change
$("#id input[name="+nazvy[0]+"]").change(function() {nazev_funkce(this, 0, value_ktera_je_pokazde_jina) });
$("#id input[name="+nazvy[1]+"]").change(function() {nazev_funkce(this, 1, value_ktera_je_pokazde_jina) });
...
$("#id input[name="+nazvy[n]+"]").change(function() {nazev_funkce(this, n, value_ktera_je_pokazde_jina) });
    
Dál bys to ještě mohl zkrátit, když si dáš ty hodnoty, co jsou pokaždé jiné do pole a pak to projedeš cyklem, ve kterém to budeš přiřazovat...
midlan
Profil
Marek88:
jenže každý input má jinou podmínku :/ Napadlo mě uložit podmínky do pole, ale tím by se z nich stal string a zpět na boolean bych je nedostal...
Chamurappi
Profil
Reaguji na midlana:
Můžeš té funkci před jako argument další funkci, která bude jen vyhodnocovat podmínku. Pak by sis mohl udělat pole struktur, kde bys měl jen ty části, co se mění (čísla, řetězce, vyhodnocovací funkce), a projet ho cyklem.
_es
Profil
Marek88:
Nejako nerozumiem tomu vyrábaniu funkcií.
Prečo nie:
jQueryObjekt1.keyup(nazev_funkce);
jQueryObjekt2.keyup(nazev_funkce);
a z funkcie nazev_funkce odstrániť všetky argumenty a odkazovať sa len na this?
Inak, bez jQuery to je ešte jednoduchšie:
element1.onkeyup = element2.onkeyup = nazev_funkce;
midlan
Profil
Tak už jsem to s těma podmínkama v podstatě vyřešil, mám je ve funkci pro ověřování, ale teď k novému problému.

Zasekl jsem se na poslední bodě optimalizace kódu:
for(var j=0;j<objekty.length;j++) {
  $(objekty[j]).keyup(function() {
    overit(j, $(this).val());
  });
  
  $(objekty[j]).blur(function() {
    overit(j, $(this).val());
  });
}

pokud to udělám takhle, eventy (.blur a .keyup) se neprovádí. Když jsem místo j měl čísla a měl to objekty.lengthkrát vypsané ručně tak to šlo.
joe
Profil
_es:
a z funkcie nazev_funkce odstrániť všetky argumenty a odkazovať sa len na this?

A ty argumenty bys zadával jak? Nebo jak bys je poznal v té funkci, že se jedná o ten a ten argument?
_es
Profil
joe:
A ty argumenty bys zadával jak?
Aké argumenty?
Ja som ten úvodný kód pochopil tak, že všetko si vie zistiť z objektu zdroja udalosti.
midlan
Profil
joe, _es:
už se nehádejte, já už to vyřešil podmínlou pro každý objekt zvlášť...
Spíš mi řekněte proč toto nefunguje:

midlan:
> for(var j=0;j<objekty.length;j++) {
> $(objekty[j]).keyup(function() {
> overit(j, $(this).val());
> });
>
> $(objekty[j]).blur(function() {
> overit(j, $(this).val());
> });
> }
_es
Profil
midlan:
Spíš mi řekněte proč toto nefunguje
Nechce sa mi nad tým špekulovať, mám dojem, že ti stačí funkcia jedna, podobne ako tu, alebo iný spôsob, tiež len s jednou funkciou, o príspevok ďalej.
Chamurappi
Profil
Reaguji na midlana:
proč toto nefunguje
Protože ti proměnná j vyroste až do hodnoty objekty.length a při zpracování události už se nebere v úvahu hodnota z doby průchodu cyklem. Potřebuješ lexikální uzávěr.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0