Autor Zpráva
Honza_n
Profil *
Našel jsem tenhle úžasnej kód, když jsem hledal jak zkontrolovat pole, jestli obsahuje element.

Array.prototype.inArray = function (value) {
  var i;
  for (i=0; i < this.length; i++) if (this[i] === value) return true;
  return false;
};

if ( vzory.poj.seznam.all.inArray(zkratka) ){
{}


Překvapilo mě, že se dá v JS přiřadit poli funkce. Jestli to ale správně chápu? Protože je to nějaké divné, pole je přece pole, ne metoda.

K tomu mám ještě otázku:
Dá se podobným způsobem (nebo jinak) zkontrolovat vlastnost objektu? Zda daná vlastnost existuje? To byl původně můj záměr, ale protože to neumím, tak jsem si vytvořil seznam názvu vlastností, který je pole.

Jinak ale zjišťuji, že to jde udělat pomocí jQuery:
inArray( value, array )
avšak to se nevztahuje na ty vlastnosti objektu.
_es
Profil
Honza_n:
Překvapilo mě, že se dá v JS přiřadit poli funkce. Jestli to ale správně chápu? Protože je to nějaké divné, pole je přece pole, ne metoda.
Nájdi si niečo o prototypovej dedičnosti, bude ti to jasnejšie.

Dá se podobným způsobem (nebo jinak) zkontrolovat vlastnost objektu? Zda daná vlastnost existuje?
Na to slúži v JS operátor in:
var o = {x:1};
alert("x" in o); // true
alert("y" in o); // false
Honza_n
Profil *
Oh, skvělé. Dík
ah01
Profil
Honza_n:
V novější verzí JS má pole metodu indexOf, která vrací index hledaného prvku nebo -1 v případě, že prvek v poli není (stejně jako indexOf u řetězce). Dělá to v podstatě to samé co tvoje inArray, ale je to standardní funkce jazyka.

V části Compatibility odkazovaného dokumentu najdeš implementaci této metody i do prohlížečů, které ji nativně nepodporují.
Honza_n
Profil *
Chtěl bych se ještě zeptat. Mám takovýto kód, ale zkrátil jsem ho, aby to bylo přehlednější:

$(document).ready(function() {

// zde definovat objekty dr, zi, atd.

  dr.change(function () {
      nastav_vzory();
      });
  });

  zi.change(function () {
      nastav_vzory();
      });
  });

  ro.change(function () {
      nastav_vzory();
      });
  });

  ci.change(function () {
      nastav_vzory();
      });
  });

  sk.change(function () {
      nastav_vzory();
      });
  });

});


Ty objekty ke kterým dávám .change() jsou prvky formuláře.

Napadlo mě, že by asi bylo dobré to upravit tak, že bych vytvořil prototyp s těmi událostmi nebo jak se tomu říká. Rozdělil bych to na dvě části. V jedné bych definoval prototyp s těmi funkcemi .change a z druhé části bych to volal

$(document).ready(function() {
// #1 definovat objekty
// #1 volat metodu nebo funkce z prototypu jedním příjazem
}];


Čili, aby se to celé zpřehlednilo tak v části ready bude jen definice objektů a pak už jen volání buď pomocí jedné funkce nebo tak, že bych napsal něco jako
mujprototyp.("dr"); mujprototyp.("zi"); mujprototyp.("vz"); atd.

Jen tedy jak napsat ten prototyp.
_es
Profil
Honza_n:
Čili, aby se to celé zpřehlednilo
Na také veci ti nie je treba jQuery:
window.onload = function(){
 element1.onchange = element2.onchange = element3.onchange = nastav_vzory;
};
Aj ten tvoj kód sa dá skrátiť:
$(document).ready(function() {

// zde definovat objekty dr, zi, atd.

  dr.change(nastav_vzory);
  zi.change(nastav_vzory);
  ro.change(nastav_vzory);
  ci.change(nastav_vzory);
  sk.change(nastav_vzory);
});
Honza_n
Profil *
Zas tak zkrátit to asi nejde. Ten kód byl zkrácený, tak tu rozeberu dvě funkce. ro.change() je delší, ty ostatní jsou kratší. Proto jsem myslel, že by se to mohlo dát do toho prototypu, aby to nezaclánělo v té části window.onload

  ro.change(function () {
      $("input[name=anim]","fieldset#buttons").attr("disabled", true);
      $("input[name=inanim]","fieldset#buttons").attr("disabled", true);
      $("select[name=zivotnost]","fieldset#gramar").attr("disabled", true);
      $(ro,"option:selected").each(function () {
      if ( ro.val()=="m" ){
        $("input[name=anim]","fieldset#buttons").attr("disabled", false);
        $("input[name=inanim]","fieldset#buttons").attr("disabled", false);
        $("select[name=zivotnost]","fieldset#gramar").attr("disabled", false);
        }      
      nastav_vzory();
      });
  });

  zi.change(function () {
      $(zi,"option:selected").each(function () {
      nastav_vzory();
      });
  });
_es
Profil
Honza_n:
Ak sú teda tie ovládače udalostí rozdielne, tak čo by malo byť v tom prototype? A prototype akého konštruktora?
Podľa tvojho posledného kódu to nevyzerá na zjednodušenie pomocou jQuery.
A namiesto odstránenia nekompatibilít môže nastať nekompatibilita nová, podobne ako tu.
Honza_n
Profil *
Ne ne , já nenyslel prototyp přes JQuery. Myslel jsem prototyp v JS.

Měl jsem pocit, že tu někdo o něčem podobném psal, ale to bylo v diskusi o PHP, ne JS. A to bylo v rámci diskuse o tom jak vytvořit z pole objekt a do vlastnosti přidat funkci. odkaz (Nox - 4.7.2010 14:28:11)
_es
Profil
Honza_n:
Ne ne , já nenyslel prototyp přes JQuery. Myslel jsem prototyp v JS.
Mne to skôr pripadá, že chceš "nejako" použiť "nejaký" prototyp, nevieš ani presne na čo, len sa ti zdá, že by to mohlo byť niečo dobré, pričom si lenivý si niekde pozrieť, čo to vlastne je.
Honza_n
Profil *
Ale já jsem už o protypech četl a dva prototypy jsem si už vytvořil. Ale nemyslím si, že zrovna to co jsem udělal, by se dalo použít pro toto. Asi by bylo lepší použít obyčejnou funkci. Do argumentu funkce dát objekt a ve funkci definovat, že na ten objekt chci provést .change(). Tak něco takového?

function someFunc() {
for (var i=0, len=arguments.length; i<len; ++i)
  {
  arguments[i] 
  }
}


someFunc(object_1);
someFunc(object_2, function);
someFunc(object_3);
someFunc(object_4);
someFunc(object_5);
Honza_n
Profil *
Jsem zapomněl dopsat ten vnitřek funkce

function someFunc() {
arguments[0].change(function () {
      nastav_vzory();
      });
for (var i=1, len=arguments.length; i<len; ++i)
  {
  arguments[i]; // spustit funkci předanou argumentem
  }
}
Honza_n
Profil *
Funguje mi to až na jednu věc. Druhý řádek má volat tu zadanou funkci (2. argument). A to nefunguje.

function someFunc() {
  arguments[1];  // spustit funkci (nastavení objektů)
  arguments[0].change(
    function ()
    {
    nastav_vzory();  
    });  
}

  someFunc(zi, function () {alert("OK");});
  someFunc(ci,function () {alert("OK");});


No a nic se neděje. Vše ostatní funguje. Tzn. když vyberu příslušný select ve formuláři tak se provede funkce nastav_vzory() . Ale neprovede se ten řádek č. 2 - spuštění funkce a vyskočení dialogového okna s hláskou "OK"
_es
Profil
Honza_n:
Druhý řádek má volat tu zadanou funkci (2. argument). A to nefunguje.
Funkcie sa volajú použitím operátora volania funkcie () a ak je v druhom argumente funkcia, tak sa tá funkcia zavolá:
arguments[1]();
Honza_n
Profil *
Jsem to zkoušel než jsem to napsal, a psalo mi to hlášku:
arguments[1] is not a function
Honza_n
Profil *
Tak už to funguje, chtělo to jen přidat podmínku if (arguments[1]) ...
_es
Profil
Honza_n:
arguments[1] is not a function
Druhý argument nie je funkcia. Ak to funkcia bude, tak to bude aj fungovať.
Tento JS odkaz funguje:
javascript:function someFunc() {arguments[1]();} someFunc(0, function () {alert("OK");});
Honza_n
Profil *
Stejně to mi to nefunguje jak má. Chybu jsem měl tam, že argument[1]() se má spouštět zevnitř funkce .change(). To ale nefunguje.

function trigger() {
arguments[0].change( function () {
console.log(arguments[1]); 
  if (arguments[1]) {arguments[1]();  // spustit funkci (nastavení objektů)
    console.log("HERE I AM"); 
    alert("as");
    }
  nastav_vzory(); 
  });  
}

window.onload = function() {
  dr=$("select[name=druh]","fieldset#gramar");
  ro=$("select[name=rod]","fieldset#gramar");
  zi=$("select[name=zivotnost]","fieldset#gramar");
  ci=$("select[name=cislo]","fieldset#gramar");
  sk=$("select[name=skupina]","fieldset#gramar");
  vz=$("select[name=vzory]");

  trigger(dr);

  trigger(ro, function () {
alert(ro.val());
    });

  trigger(zi);
  trigger(ci);
  trigger(sk);
};


Pro srovnání původní kód (funkční) je zde:
Odkaz

A jak můžeš vidět původně tam bylo
$(document).ready(function()

Čímž JS nejspíš pochopí, že .change() je funkce Jquery. Ale teď to vypadá, že to nechápe a change() se spustí jen jednou, při spuštění dokumentu.

V celém kódu jde o to, že když kliknu na tlačítko s mužským rodem, mají se aktivovat tlačítka s životností, kdežto pokud kliknu na tlačítko s rodem ženským nebo středním, tak se tlačítka s životností vypnou.
_es
Profil
Honza_n:
V 3. a 4. riadku sa arguments[1] vzťahuje na argument tej anonymnej funkcie, nie na argument funkcie trigger.
Asi by si si to mal celé trochu lepšie naštudovať a premyslieť, lebo stále len chaoticky k sebe lepíš kusy kódu.
A neradil som ti nepoužívať $(document).ready z jQuery, len som ti radil, aby si si premyslel, či jQuery potrebuješ.
Honza_n
Profil *
Vidíš, tak to s tím polem arguments, že se změní uvnitř další funkce mě nenapadlo!

Tak nic jiného neumím. Neumím se nad tím líp zamyslet, prostě to zkouším cestou pokusu a omylu. Ale i to je cesta. Každá cesta přeci někam vede, ne?

Tak už mi to funguje. Akorád zvláštní je, že tu funkci nakonec volám jako f; nikoliv f(); ...
arguments[1] je funkce, takže prodpokládám, že přidávat operátor volání funkce k funkci je snad zbytečné (a pak to hlásí chybu že f() není funkce ).


function trigger() {
if (arguments[1]) {var f = arguments[1];
console.log(f);    }
arguments[0].change( function (f) {
console.log(f);  
  if (f) {
    f;  // spustit funkci (nastavení objektů)
    console.log("HERE I AM"); 
    alert("as");
    }
  nastav_vzory(); 
  });  
}



A konzola píše:

function()
Object { type="change", more...}
HERE I AM
Object { type="change", more...}
HERE I AM
Object { type="change", more...}
HERE I AM
_es
Profil
Honza_n:
Čo a prečo píše konzola mi je jasné, no nebudem to vysvetľovať, lebo by z toho asi vznikla učebnica a to sa mi nechce.
Prezradím ti len to, že na 7. riadku žiadnu funkciu nevoláš. Ten riadok vôbec nič nerobí.
A aplikovanie operátora () naozaj spôsobí chybu, no preto, že f v tom riadku nie je funkcia.
ah01
Profil
Honza_n:
Tak nic jiného neumím. Neumím se nad tím líp zamyslet, prostě to zkouším cestou pokusu a omylu. Ale i to je cesta. Každá cesta přeci někam vede, ne?
Řekl bych, že z pokroku tvého kódu je vidět, kam ta cesta vede. Ale nechci být sprostý. Asi ti nezbude nic jiného, než si nastudovat alespoň základy JS. Pochybuji, že tu bude mít někdo chuť, vysvětlovat ti každou volovinu co do kódu napíšeš.
Honza_n
Profil *
Už jsem to vrátil do původního stavu. Když věci nejdou jak chci tak na ně jednoduše kašlu.

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