Autor Zpráva
Pavel Krátký
Profil
Mám následující konstrukci:

var addSingleTimeSlot = thisTimeslot.on('click','button.addSingleTimeslot',function(e,i=0,t='hello'){......

Jak té anonymní funkci předám parametry zvenku?
Radek9
Profil
Pavel Krátký:
Chceš je natvrdo nastavit? K tomu je metoda bind.
Pavel Krátký
Profil
Radek9:
Ne, ne, chci je tam předávat zvenku. Ony tam vlastně "natvrdo nastaveny" jsou (e, i=0, t="hello"), rád bych použil ten kód uvnitř funkce s vlastními parametry. Jsem zvyklý na volání funkcí zevnitř html elementu .. onclick="addSingleTimeSlot(parametr_1, parametr_2 ... parametr_n)" ovšem tohle je založeno na "řízení událostmi" a nedokážu si představit, jak tam ty parametry dodat...
Ale děkuju za reakci!
Jen poznámka bind je "deprecated" a doporučuje se metoda on.
CZechBoY
Profil
Pavel Krátký:
Ty asi myslis jquery metodu bind, nikoliv js ... Function.prototype.bind()

Jinak te anonymni funkci predas parametry tak ze ji zavolas
function() {
    function(e, a, b, c) {...}(1, 2, 3, 4);
}
Pavel Krátký
Profil
CZechBoY:
Ano, omlouvám se, měl jsem jsem dodat, že se jedná o jQuery. Jedná se o jQuery :)

Původně jsem si myslel, že odpověď na mou otázku bude "Ne, anonymní funkce nemůže převzít parametr zvenčí, protože je zkrátka a dobře ... anonymní." a chtěl si to jen potvrdit.

No a teprve před malou chvílí jsem si uvědomil, že v JavaScriptu, až na výjimky, jsou všechny proměnné globální!, narozdíl od PHP, ve kterém pracuji většinu času.

A proto moje funkce parametry / proměnné, které definuji mimo ni, tzv. "uvidí". Halelúja a Budiž světlo! :)

Tím jsem si sám odpověděl... nicméně ... to, že si někde v dokumentu, nějak, definuji (nějaké (globální)) proměnné, které pak bude ta funkce používat, se mi stejně nelíbí. Globální proměnné jsou zlo.


Můj konkrétní problém, který jsem zatím neuvedl, jsem vyřešil tak, že jsem nechal zmiňovanou funkci, aby si sama našla potřebná data, která se nachází v html kódu. O nějakém elegantnějším řešení budu přemýšlet později...

Abych byl konkrétní, kdyby měl někdo náladu na trochu "koncepčního myšlení", zmiňovaná funkce, mimo jiné, zobrazí na stránce formulář (a popřepíná a poschovává nějaké další prvky). "Prázdný" formulář, sloužící k uložení nové položky do DB. Chci využít její schopnosti k tomu, aby zobrazila formulář a "naklikala" selecty a doplnila inputy pro úpravu některé z existujících záznamů. "Normálně" se to řeší tak, že zavoláte funkci a předáte jí parametry a je to. Na základě nějaké akce (onClick, načtení stránky atd..). V tomto případě je to postavené "obráceně": čeká se, až se na něco klikne a na základě toho se provede seznam nějakých akcí... nic, zamotávám se do toho.

Mám dát tlačítku nějaké value={id:15,title:titulek,timeFrom:0130...}? Nebo nějaký jiný atribut místo value?

V každém případě děkuji Radek9 a CZechBoY za rady!
_es
Profil
Pavel Krátký:
No a teprve před malou chvílí jsem si uvědomil, že v JavaScriptu, až na výjimky, jsou všechny proměnné globální!
Ako si prišiel na také tvrdenie? Respektíve, čo si prestavuješ pod „globálnou premennou“?
function f(){var x = 10}
Pokiaľ nejaká iná funkcia nebude definovaná vo vnútri funkcie f, tak veru premennú x „neuvidí“.

function(e,i=0,t='hello'){......
To v niektorých starších prehliadačoch nebude fungovať.
CZechBoY
Profil
Pavel Krátký:
Furt nechápu kde je rozdíl.

"Normálně" se to řeší tak, že zavoláte funkci a předáte jí parametry a je to. Na základě nějaké akce (onClick, načtení stránky atd..). V tomto případě je to postavené "obráceně": čeká se, až se na něco klikne a na základě toho se provede seznam nějakých akcí.
Tyhle 2 věty mi přijdou úplně stejné... kliknu a něco se provede NEBO kliknu a něco se provede. Jakej je teda rozdíl mezi "normálním" řešením a tvým problémem?

var mojeGlobalniPromenna = 9;

$('#mojeTlacitko').on('click', function () {
  return mujCallback(mojeGlobalniPromenna);
});

Nechceš-li globální proměnné, tak to zavři do funkce.

(function () {
  var mojeGlobalniPromenna = 9;
  
  $('#mojeTlacitko').on('click', function () {
    return mujCallback(mojeGlobalniPromenna);
  });
})(); // a rovnou zavolat
Pavel Krátký
Profil
_es, CZechBoY:
Děkuji oběma za reakci. Jak jsem psal ve 3 ráno, trochu jsem se do toho zamotával; omlouvám se za zmatečnost.

Co jsem nazýval "globálním" a "neglobálním":
<?php
$promenna = "Já jsem proměnná.";
function neco() {
  echo $promenna;
  }
neco(); // Undefined variable: promenna in .....
?>

<script type="text/javascript">
var promenna = "Ich bin ein Variable.";
$("h1").click(function(){
  alert (promenna);  // alert vypíše "Ich bin ein Variable."
  });
</script>

Tím jen opakuji CZechBoYův kód, ale je to jen pro vysvětlení, co jsem myslel (ne)globalitou.

_es, jen poznámka:
function f(){var x = 10}
pokud tu proměnnou x inicializuješ bez klíčového slova var a pak funkci "f" někde zavoláš, bude x taky globální ... to jen na okraj ....


O co mi v podstatě šlo, co byl / je můj problém, pokusím se to popsat co nejjednodušeji, vzhledem k mojí (mo)mentální kondici:

* Mám někde v dokumentu tlačítko přidej časový slot, na jeho kliknutí čeká funkce, která zobrazí "prázdný" formulář (tedy přesněji řečeno zobrazí nějak nastavený formulář).
* Potřebuji udělat jiné tlačítko uprav časový slot, a chci zobrazit formulář, který nebude "prázdný", ale předvyplněný příslušnými hodnotami (tedy přesněji řečeno zobrazí jinak nastavený formulář).

Funkce toho dělá ještě mnohem více, než jen zobrazuje formulář a proto ji chci použít i pro ten druhý případ. Když jsem použil výraz "normální způsob", měl jsem na mysli - pro mě běžný - způsob "zevnitř elementu", tedy onclick=....., kde si "normálně" dosadím parametry, například: onclick=pridejSlot(novy) resp. onclick=pridejSlot(uprav).

Teď tady mám nějakou (anonymní) funkci, kterou jsem nepsal já (ale to je samozřejmě jedno), kterou chci z nějakého důvodu použít a jediné, co neumím je tu funkci zavolat s nějakým(i) dodatečným(i) parametrem(parametry). A nejde jen o tento konkrétní případ, vždy se to nechá nějak "obejít", jde mi o princip a o to naučit se něco nového a dělat věci správně.

Jak to tady teď píšu, tak už (asi) vím, co mi řeknete: "na každou akci udělej sólo funkci", tedy pridejSlot() a upravSlot() a každá z nich, potom, co nastaví ten formulář si zavolá ten "zbytek", který bude v další sólo funkci.

Nic, omlouvám se za to, že to nedokážu popsat jednoduše. To se (mi) stává běžně, když něčemu moc nerozumím :))


_es:
function(e,i=0,t='hello'){......
To v niektorých starších prehliadačoch nebude fungovať.
Jo ještě tohle, děkuju ... sousloví "starší prohlížeče" resp. "jiné prohlížeče" je strašák, který byl vymyšlen, aby strašil "backenďáky co se snaží udělat něco v JS" :))

Jinak ten můj zápis je samozřejmě blbost, stejně tak dobře můžu napsat:
function(){
  var i=0;
  var t="hello";
  ...}
anebo jak mi někdo radil (CzechBoy):
function(i,t){
  ....}(0,"hello");
což je ale pořád stejně "natvrdo" = je to zapsáno v místě deklarace funkce a ne v místě jejího volání. Ptal jsem se, zda je možné anonymní funkci předat parametry "zvenku" a nyní vidím, že to nejde, což jsem stejně ale tušil už předem, protože anonymní funkci prostě nemůžete zavolat, stejně jako nemůžete zatelefonovat zpátky anonymovi v telefonu. Nebo se mýlím? :)
CZechBoY
Profil
Pavel Krátký:
Asi se pořád nechápeme :-)

Potřebuješ něco takového?

<html>
  <form id="form1"><input type="text" value="asfsdfsd"></form>

  <div id="formy"></div>
  <a id="novy">+ nový</a>
  <a id="existujici">+ zkopíruj form1</a>
</html>

var pridejForm = function (formID) {
  var $form;

  if (typeof formID !== 'undefined') {
    $form = $('#' + formID).clone();
    $form.attr('id', '')
  } else {
    $form = $('<form><input type="text" value="" placeholder="vyplňte abcdefsfd"></form>');
  }
  
  $('#formy').append($form);
};

$('#novy').on('click', function () {
  pridejForm()
});
$('#existujici').on('click', function () {
  pridejForm('form1');
});
Pavel Krátký
Profil
CZechBoY:
Asi se pořád nechápeme :-)
Moje chyba. Tys to přesto pochopil :)

Potřebuješ něco takového?
Přesně tak. Z těla té anonymní funkce function () zavolat neanonymní funkci, které už parametry předat umím :)

Děkuju!
_es
Profil
Pavel Krátký:
pokud tu proměnnou x inicializuješ bez klíčového slova var a pak funkci "f" někde zavoláš, bude x taky globální ... to jen na okraj ....
Pokiaľ to bude bez var, tak to nebude definícia premennej, ale jedna z dvoch možností:
1) Priradenie hodnoty 10 do nejakej existujúcej premennej x.
2) Ak premenná x neexistuje (bod 1): Vytvorenie vlastnosti s názvom x a hodnotou 10 na globálnom objekte - v prípade prehliadača na objekte window - nastane vlastne príkaz window.x=10;.
V prípade možnosti 2 nejde o definíciu premennej, aj keď sa tak zväčša správa viď aj Časté potíže, zajímavosti a poučné debaty » Používejte var. Okrem toho to vyvolá chybu v prípade „striktného“ módu v JS.

inak ten můj zápis je samozřejmě blbost, stejně tak dobře můžu napsat:
Nie je to „blbosť“, je to na iný účel, než to, o čom píšeš ďalej. Je to priradenie hodnôt argumentom v prípade, že bude funkcia zavolaná bez nich - nefunguje však napríklad v IE8 (možno ani v niektorých vyšších IE - nemám ako zistiť)

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: