« 1 2 3 »
Autor Zpráva
quatzael
Profil
Je možné nějak tohle dát jednodušeji do jednoho celku? V jednom scriptu tohle mám třeba 20x..

(function(){var i = document.getElementById("form-aaa"), v = i.value;
setInterval(function(){if(i.value !== v){ v = i.value; if(typeof(Storage)!=="undefined") sessionStorage.aaa_item = v;}}, 50)})();

(function(){var i = document.getElementById("form-bbb"), v = i.value;
setInterval(function(){if(i.value !== v){ v = i.value; if(typeof(Storage)!=="undefined") sessionStorage.bbb_item = v;}}, 50)})();

(function(){var i = document.getElementById("form-ccc"), v = i.value;
setInterval(function(){if(i.value !== v){ v = i.value; if(typeof(Storage)!=="undefined") sessionStorage.ccc_item = v;}}, 50)})();

Nejlépe, aby to vycházelo z pole:
var type = ["aaa", "bbb", "ccc"];

Díky za rady.
marizikmund
Profil
function shortenedYours(types) { //pozor, funkční od IE9
  types.map(function(typeName) {
    (function(){
      var i = document.getElementById("form-"+typeName), v = i.value;
      setInterval(function(){
        if(i.value !== v){ 
          v = i.value; 
          if(typeof(Storage)!=="undefined") sessionStorage[typeName+'_item'] = v;
        }
      }, 50)
     })();
  });
}

//použití
var type = ["aaa", "bbb", "ccc"];
shortenedYours(type);

Lepší by bylo, kdybys dal nějakou ukázku kódu třeba na JSFiddle, ať se dá líp ověřit, že to funguje.
Radek9
Profil
quatzael:
Jen mě tak napadá, proč to řešíš intervalem? Hádám, že je to formulářový prvek. Nebyl by vhodnější onchange event (případně v kombinaci s dalšími)?
Chamurappi
Profil
Reaguji na quatzaela:
Jaký smysl má testovat if(typeof(Storage)!=="undefined") pokaždé? Ono je možné, že se výsledek v průběhu života stránky změní?

Je možné nějak tohle dát jednodušeji do jednoho celku?
Ano, můžeš celkem snadno sestavit cyklus. Proměnnou z pole type dáš jako argument do té anonymní samovolající se funkce, místo (function(){ … })() budeš mít (function(x){ … })(type[j]), uvnitř budeš pracovat s x a j bude proměnná cyklu nabívající postupně hodnot 0type.length - 1.


Reaguji na marizikmunda:
kdybys dal nějakou ukázku kódu třeba na JSFiddle, ať se dá líp ověřit, že to funguje
Mně JSFiddle vůbec nefunguje, takže tohle bych mu nedoporučil :-)

Proč máš v map funkci ve funkci?

//pozor, funkční od IE9
Pak tam nejspíš nemusí dávat kontrolu na typeof Storage vůbec, když mu to nebude fungovat ani ve starších prohlížečích, které sessionStorage znají.
quatzael
Profil
marizikmund, Chamurappi:

Tak mohlo by to teda být třeba takhle?

function shortenedYours(types) {
  types.map(function(typeName) {
      var i = document.getElementById("form-"+typeName), v = i.value;
      setInterval(function(){
        if(i.value !== v){ 
          v = i.value; 
          sessionStorage[typeName+'_item'] = v;
      }, 50)
     });
  });
}
//použití
var type = ["aaa", "bbb", "ccc"];
shortenedYours(type);

A co znamená nefunkční v IE8 a níž? Hodí to fatalní chybu a zastaví skript? Nebo to jen nebude fungovat?


Radek9:
Jedná se o formulářový prvek. Jde o to, že onchange event nejspíš nezachytí všechny eventy.. Třeba když nějaký formulářový prvek je změněn javascriptem.


Chamurappi:
Jaký smysl má testovat if(typeof(Storage)!=="undefined") pokaždé? Ono je možné, že se výsledek v průběhu života stránky změní?
To nevím, to pověz Ty mě..:o) Mám dojem, že mi to tady někdo z Vás na diskuzi poradil ať to testuju takhle.
Chamurappi
Profil
Reaguji na quatzaela:
A co znamená nefunkční v IE8 a níž? Hodí to fatalní chybu a zastaví skript?
Ano.
Také ti zatím všechny zde uvedené skripty vyhodí chybu ve Firefoxu, pokud jsou zakázané cookies, v okamžiku přístupu k sessionStorage.

Napsal bych to nějak takhle:
var type = [];
try
{
  if(window.sessionStorage) type = ["aaa", "bbb", "ccc"];
} catch(exc) {}

for(var i = 0; i < type.length; i++)
  (function(x)
  {
    var input = document.getElementById("form-" + x), v = input.value;
    setInterval(function()
    {
      if(input.value == v) return;
      v = input.value;
      sessionStorage.setItem(x + "_item", v);
    }, 50);
  })(type[j]);


Reaguji na marizikmunda:
Ještě mě napadá – proč map? Proč ne forEach?
marizikmund
Profil
Chamurappi:
Mně JSFiddle vůbec nefunguje
Jsem JSFiddle spokojený, ale tak pro příště aspoň vím, že nefachá všude :)

Proč máš v map funkci ve funkci?
Je tam zbytečně, chtěl jsem jen obalit přesně stejnou funkci, co byla vypsaná, s minimem změn.

Ještě mě napadá – proč map? Proč ne forEach?
Souhlasím, nepotřebujeme nic vracet, forEach by tu úplně stačilo.
quatzael
Profil
Chamurappi:
Ahoj, opravdu jsi si prosím jistej, že to Tvoje řešení je funkční. Snažím se to implementovat a nějak to nefunguje..
Tak bych se rád ujistil, že ta chyba je opravdu u mě. Nějak taky nerozumím co tam dělá na konci ten (type[j]).

Zdá se, že ten cyklus neprojíždí celý pole, ale jen jednu položku (a ne první co je v poli)


Chamurappi:
Tak teď to nějak asi začalo fungovat.. Zajímavý.


Chamurappi:
Kecám, nefunguje to. Funguje jenom jeden input, který se v tom cyklu točí pořád dokola.. Ostatní nefungujou.


Chamurappi:
Taky nechápu jak se tam automaticky má za to x přiřadit ten prvek z pole, když je to jen argument ve funkci.
Přidal jsem tam: x = type[i]; a takhle to už funguje.
Joker
Profil
quatzael:
Snažím se to implementovat a nějak to nefunguje..
Je tam takový klasický překlep, řekl bych:
for(var i = 0; i < type.length; i++)

})(type[j]);
- místo j by tam mělo být i.

edit: Tak quatzael si toho všiml dřív, než jsem to stihl odeslat.
quatzael
Profil
Joker:
Aha, díky. Mě to bylo divný..
Chamurappi
Profil
Reaguji na quatzaela:
nechápu jak se tam automaticky má za to x přiřadit ten prvek z pole, když je to jen argument ve funkci
Ta funkce se ihned sama volá s tím argumentem.
Funkce je tam proto, aby si udržela hodnotu proměnné, protože to cyklové i už v době volání intervalové funkce bude jiné.


Reaguji na Jokera:
Jak ten překlep vznikl: Nejprve jsem chtěl zachovat quatzaelův nápad, že v i bude <input>, proto jsem na cyklus použil j. Ale pak jsem si řekl, že se mi to fakt nelíbí a přejmenoval jsem i na input a j na i… až na to jedno místo.
quatzael
Profil
Ještě řeším něco podobnýho. Lze prosím nějak zkrátit tohle?

function funkce_aaa() { /* contents */ }
function funkce_bbb() { /* contents */ }
function funkce_ccc() { /* contents */ }

Tak aby tam bylo nějaký cyklus, který by ty názvy bral z pole:
var type = ["aaa", "bbb", "ccc"];
for(var i = 0; i < type.length; i++){
function funkce_"type[i]"() { /* contents */ }
}
anonymníí
Profil *
quatzael:
Použij jednu funkci s parametrem.

function funkce(param) {...} 

var type = ['aaa', 'bbb', 'ccc'];
for (var i = 0; i < type.length; i++) {
    funkce (type[i]); // zavolej funkci s danym paramtrem
}
juriad
Profil
quatzael:
Případně si můžeš ty funkce uložit do pole:
var functions = [funkce_aaa, funkce_bbb, funkce_ccc];
for (var i = 0; i < functions.length; i++) {
  functions[i]();
}
nebo objektu (máš-li důvod přistupovat k nim podle názvu):
var types = ['aaa', 'bbb', 'ccc'];
var functions = {aaa: funkce_aaa, bbb: funkce_bbb, ccc: funkce_ccc};
for (var i = 0; i < types.length; i++) {
  functions[types[i]]();
}
quatzael
Profil
anonymníí:
Jestli to nejde jinak, tak to asi budu muset vyřešit takhle. Akorát v mým případě to bude zřejmě trochu nekoncepční..

juriad:
To ale není definování funkcí, ale přímo jejich spouštění, ne?
juriad
Profil
quatzael:
Aha, přečetl jsem si ještě jednou [#12] a snad už chápu, o co se snažíš. Není mi jasné proč ti nestačí jediná funkce.
Můžeš přece definovat jen jednou a pak ji nakopírovat do dalších proměnných:

function funkce_aaa() { /* contents */ }
var funkce_bbb = funkce_aaa, funkce_ccc = funkce_aaa;

Nebo pokud se snažíš o nějakou validaci:
function validate_nonempty(el) { /* contents */ }
var functions = {
  name : validate_nonempty, 
  religion: null, 
  password : validate_nonempty};

var valid = true;
for el in form.inputs { // pseudokód
  if (functions[el.name]) {
    if (!functions[el.name](el)) {
      valid = false;
      break;
    }
  }
}
if (!valid) {
  alert("Vyplň to pořádně!");
}
quatzael
Profil
No jde spíš o to, že budu mít cca 10 funkcí a některé budou podobné, jenom se budou lišit tím aaa, bbb atd., který se ale bude objevovat i uvnitř té funkce.. (to jsem prve asi neuvedl..)

function funkce_aaa() { $("#item-aaa").show(); }
function funkce_bbb() { $("#item-bbb").show(); }
function funkce_ccc() { $("#item-ccc").show(); }

Je to sice pro formuláře, ale tohle zrovna ne pro validaci. V tomhle případě je to pro "nastavení" formuláře na zákládě načtených hodnot ze sessionStorage (některý inputy zmizí, některý se objeví, část formuláře se trochu přetransformuje.. apod.)
_es
Profil
quatzael:
jenom se budou lišit tím aaa, bbb atd., který se ale bude objevovat i uvnitř té funkce..
No tak na to, čo bude odlišné, definuješ argument všeobecnejšej funkcie a vo vnútri funkcie ho použiješ. Napríklad z posledného kódu:
function show_item(s) {$("#item-" + s).show(); }
quatzael
Profil
_es:
Já velkou část javascriptu generuju z php, takže jsem chtěl trochu zjednodušené řešení, protože z tý generovaný části zrovna volám i ty funkce.

A takhle. Je to tak, že to opravdu nejde udělat, tak jak to chci já nebo se mě tady snažíte zase nasměrovat na "správnou cestu"?
anonymníí
Profil *
quatzael:
Spíše nasměrovat.

Ono mít X funkcí lišících se pouze prefixem/suffixem je pouze chybný návrh aplikace, nic víc. Místo prefixu/suffixu je správně použít pole (u proměnných), nebo parametr (u funkcí). V PHP, JS a asi i jinde.

A to, zda je JS psán ručně, nebo generován PHP, přece nic nemění. Je jedno, jak JS kód vytvoříš, podstatné je, jaký je (po vytvoření).
quatzael
Profil
anonymníí:
Jde o to jak ty funkce potom budu volat. Když tam budu mít deset funkcí a tři z nich budou stejný, přestože budou pro tři rozdílný formuláře, tak prostě tohle je výhodnější, protože to volání funkcí můžu z PHP vygenerovat jednoduše a ne nějak nesystematicky pro každej formulář dávat totálně jiný názvy funkcí a jinak systém argumentů..
anonymníí
Profil *
quatzael:
Nevím, neukázal jsi nic konkrétního a v obecné rovině je řešení (a vstupů) mnoho. Nechce se mi hádat, co bys kde mohl mít.

Každopádně, pokud víš, že máš zavolat funkci funkce_aaa, nebrání ti nic zavolat funkci s parametrem funkce(aaa).
Pokud ty funkce spolu nemají nic společného (což tak nevyplývalo a co ted asi píšeš), tak samozřejmě co formulář, to jiná funkce.

Opravdu nevím, jak ti poradit. Nebuď tak tajemný, ukaž reálně, co máš. Pak se můžeme o nějakém řešení bavit.
quatzael
Profil
anonymníí:
Já se nesnažím být nijak tajemný. Prostě je to hafo složitýho kódu pro sofistikovaný generování formulářů se vším všudy (vkládání uložených hodnot, validace přes js, validace po odeslání v PHP apod.).

Každopádně, pokud víš, že máš zavolat funkci funkce_aaa, nebrání ti nic zavolat funkci s parametrem funkce(aaa)
Nebrání, ale budu muset dát do jedný funkce switch a vkládat tam hromadu kódu, ze kterýho se využije jen něco, navíc protože to budu rozšiřovat budu muset pokaždý šťourat do týhle už fungující funkce..

Jak jsem uváděl tuhle strukturu:

function funkce_aaa() { $("#item-aaa").show(); }
function funkce_bbb() { $("#item-bbb").show(); }
function funkce_ccc() { $("#item-ccc").show(); }

Tak to opravdu bude fungovat jen pro aaa, bbb, ccc. U ddd, eee, fff a dalších bude zase úplně jinej obsah funkce. Nevím proč bych to měl dávat celý do jedný funkce a potom switchovat část kódu podle vloženýho parametru..


anonymníí:
Pokud ty funkce spolu nemají nic společného (což tak nevyplývalo a co ted asi píšeš), tak samozřejmě co formulář, to jiná funkce.
To se tady celou dobu snažím vysvětlit, tři kategorie (aaa, bbb, ccc) poběží stejně, ale ty ostatní už úplně jinak.. Je prostě nesmysl to dávat všechno do stejný funkce..

Mě prostě stačí když mi tady prosím někdo ukážete jak se dá udělt to na co se ptám od začátku [#12] zde.
_es
Profil
quatzael:
Tak to opravdu bude fungovat jen pro aaa, bbb, ccc. U ddd, eee, fff a dalších bude zase úplně jinej obsah funkce.
No tak si sprav jednu funkciu „jen pro aaa, bbb, ccc“ a druhú pre „ddd, eee, fff“. V tom, že si nevieš nejakú konkrétnu aplikáciu poriadne rozčleniť na jednotlivé časti, ti asi vo všeobecnejšej rovine ťažko niekto poradí.
quatzael
Profil
_es:
Já už nevím jak to mám líp vysvětlit. Bude několik kategorií: aaa, bbb, ccc, ddd, eee, fff atd.. Možná jich bude zatím jenom 10, ale časem budou nejspíš přibývat. V tý jedný funkci pro nastavení formuláře budou totožný věci pro aaa, bbb a ccc, ale ne už pro ty ostaní. Jenom se tam budou lišit ty kategori, protože se bude přistupovat k těm daným prvkům podle kategorií. A protože když budu něco měnit nebo upravovat v tom formuláři, tak se to zcela určitě bude týkat všech tří kategorií (aaa, bbb, ccc). Tak, abych to potom nemusel měnit na třech různých místech, tak bych byl rád kdyby to šlo dát všechno do jedný funkce.

A TEĎ TO ZÁSADNÍ: Ty ostatní kategorie už se nebudou takhle shlukovat po třech (některý možná jo, ale to bude třeba po dvou). Každopádně budou tam převážně kategorie, kde se ten formulář bude přednastavovat úplně jinak podle jiných kritérií. Takže v tý funkci budou úplně jiný věci.
Každopádně z PHP se mi bude generovat i javascript a v něm bude spouštění tý js funkce pro přednastavení formuláře a neskutečně by se mi zjednodušil ten script, kdyby šlo spouštět názvem stejnou funkci jenom lišící se tou kategorií, která bude obsažena v tom názvu.


Já tady vždycky napíšu co potřebuju a vy my vždycky nutíte něco co nepotřebuju. Když tady zjednodušeně popisuju problém, tak to dělám proto, aby bylo z to na první pohled jasný co přesně potřebuju. A vůbec to neznamená, že to co řeším v reálu je stejně tak jednoduchý. Popisovat tady co všechno dělá x scriptů o tisích řádcích, jen proto abych vám dokazoval, že potřebuju přesně to na co se ptám a ne nic jinýho, přece nedává smysl..
Kubo2
Profil
quatzael:
Nedáva zmysel, keď sa snažíš vytvoriť x takmer úplne identických funkcií líšiacich sa iba nejakou entitou, nad ktorou operujú, namiesto toho, aby si si vytvoril jednu funkciu zodpovednú za nejakú konkrétnu funkcionalitu, ktorá bude pracovať s entitou, bližšie špecifikovanou argumentom až v čase jej volania.


A mimochodom, ak nemáš problém v PHP si vygenerovať x funkcií líšiacich sa iba názvom a entitou, nad ktorou operujú, aký je problém priamo si vygenerovať aj volania týchto funkcií? K čomu potrebuješ použiť niečo ako window['funkce_' + nazevEntity]()? To by ma rozhodne veľmi zaujímalo.
quatzael
Profil
Kubo2:
Nedáva zmysel, keď sa snažíš vytvoriť x takmer úplne identických funkcií líšiacich sa iba nejakou entitou
Ach jo, já to tady píšu asi úplně zbytečně.. Ty jsi nečetl co jsem tady psal? Píšu tady, že TŘI FUNKCE BUDOU IDENTICKÝ A OSTATNÍ BUDOU KAŽDÁ NAPROSTO JINÁ, NEIDENTICKÁ!!!!

K čomu potrebuješ použiť niečo ako window['funkce_' + nazevEntity]()? To by ma rozhodne veľmi zaujímalo.
Chci jenom, aby měly ten název stejnej a mohl jsem z PHP vygenerovat to spouštění. Tohle co píšeš VŮBEC NEPOTŘEBUJU!!! To je spouštění funkce pomocí proměnné přímo z js, já to ale budu generovat přímo z PHP, takhle:

<?php
echo '<script type="text/javascript">
 form_preset_' . $cat . '(); //spuštění funkce
 </script>';



Já potřebuju nějak vytvořit cyklus PŘÍMO v JAVASCRIPTU, kterým bych NADEFINOVAL tři funkce NAJEDNOU, s tím, že v názvu a v obsahu tý funkce bude figurovat proměnná, která bude nést označení dané kategorie.

Nejde mi o SPOUŠTĚNÍ funkce, ale o NADEFINOVÁNÍ!!!
Kubo2
Profil
quatzael:
Ty jsi nečetl co jsem tady psal?
Tvoje vlákno som si prečítal celé minimálne dvakrát. No buď som ja absolútne natvrdlý a definitívne mi uniká to, čo chceš dosiahnuť, alebo to ty sám nedokážeš nejako zrozumiteľne vysvetliť, ak vôbec vlastne vieš, o čo sa pokúšaš.

Prečo potrebuješ definovať tie funkcie v JS? Jednoducho ich definície vygeneruj v PHP:

foreach(['aaa', 'bbb', 'ccc'] as $cat) {
    printf('function form_preset_%s() {...}', $cat);
}

Ono je to samozrejme možné aj v JS, obdobným spôsobom, ako sa tie funkcie volajú:

for(var cats = ['aaa', 'bbb', 'ccc'], i = 0; i < cats.length; i++) {
    // `this` je nejaký objekt
    this['form_preset_' + cats[i]] = function() {
        // ...
    }
}

Ak to už nemá byť takto, potom je jeden z nás dvoch už vážne mimo zamerania.
quatzael
Profil
Kubo2:
Supr, díky. Už konečně přihořívá..:o)

Jak ale dostanu ten název kategorie i dovnitř tý funkce?
for(var cats = ['aaa', 'bbb', 'ccc'], i = 0; i < cats.length; i++) {
    var x = cats[i];  
    this['form_preset_' + cats[i]] = function(x) { alert(x); }
}
form_preset_aaa(); form_preset_bbb(); form_preset_ccc();

V alertech se místo konkrétních "koček" (kategorií: aaa, bbb, ccc) objevuje jenom undefined..
Kubo2
Profil
quatzael:
Problém je, že tú funkciu definuješ s parametrom x, čím prekrývaš vonkajšiu deklaráciu var x lokálnou premennou (parametrom x), ktorá sa následne po zavolaní danej funkcie bez argumentu nastaví na undefined.

Ak chceš použiť vo funkcii identifikátor definovaný mimo nej, nesmieš ho vo funkcii nijak prekryť (či už deklaráciou var x alebo uvedením v zozname parametrov). Prepísal som to nejak takto:

for(var cats = ['aaa', 'bbb', 'ccc'], i = 0; i < cats.length; i++) {
    (function(x) {
        this['form_preset_' + cats[i]] = function() {
            alert(x);
        }
    })(cats[i])
}

form_preset_aaa(); form_preset_bbb(); form_preset_ccc();

Všimni si, že som odmazal x zo zoznamu parametrov funkcie, ktorú definuješ, a taktiež si všimni použitie obalovej funkcie vo for cykle kvôli zachovaniu scope a tým aj hodnoty premennej, ako už vyššie písal Chamurappi.
« 1 2 3 »

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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