Autor | Zpráva | ||
---|---|---|---|
Honza_n Profil * |
#1 · Zasláno: 5. 7. 2010, 11:12:35
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 |
#2 · Zasláno: 5. 7. 2010, 12:17:05
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 * |
#3 · Zasláno: 5. 7. 2010, 12:44:25
Oh, skvělé. Dík
|
||
ah01 Profil |
#4 · Zasláno: 5. 7. 2010, 15:34:00
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í. |
||
Časová prodleva: 4 dny
|
|||
Honza_n Profil * |
#5 · Zasláno: 9. 7. 2010, 09:25:53
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 |
#6 · Zasláno: 9. 7. 2010, 09:48:45
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; }; $(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 * |
#7 · Zasláno: 9. 7. 2010, 09:59:20
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 |
#8 · Zasláno: 9. 7. 2010, 10:15:03
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 * |
#9 · Zasláno: 9. 7. 2010, 10:48:47
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 |
#10 · Zasláno: 9. 7. 2010, 10:59:34
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 * |
#11 · Zasláno: 9. 7. 2010, 11:27:08
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 * |
#12 · Zasláno: 9. 7. 2010, 11:35:27
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 * |
#13 · Zasláno: 9. 7. 2010, 12:24:10
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 |
#14 · Zasláno: 9. 7. 2010, 12:41:37
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 * |
#15 · Zasláno: 9. 7. 2010, 13:01:10
Jsem to zkoušel než jsem to napsal, a psalo mi to hlášku:
arguments[1] is not a function |
||
Honza_n Profil * |
#16 · Zasláno: 9. 7. 2010, 13:49:17
Tak už to funguje, chtělo to jen přidat podmínku if (arguments[1]) ...
|
||
_es Profil |
#17 · Zasláno: 9. 7. 2010, 13:50:48
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 * |
#18 · Zasláno: 9. 7. 2010, 16:07:56
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 |
#19 · Zasláno: 9. 7. 2010, 16:31:41
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 * |
#20 · Zasláno: 9. 7. 2010, 16:48:47
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 |
#21 · Zasláno: 9. 7. 2010, 16:58:19 · Upravil/a: _es
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 |
#22 · Zasláno: 9. 7. 2010, 18:01:48
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 * |
#23 · Zasláno: 9. 7. 2010, 21:13:43
Už jsem to vrátil do původního stavu. Když věci nejdou jak chci tak na ně jednoduše kašlu.
|
||
Časová prodleva: 14 let
|
0