Jak nejlépe přidat k prvku formuláře kus javascriptu
- xTrip
- Člen | 15
zdravím,
jak nejlépe řešit situaci, kdy mám nějaký vlastní, nebo i stávající
formulářový prvek a potřebuji k němu přidat nějaký javascript. Ne
validační, ale pro rozšíření funkčnosti. Toto řešení se mi nezdá
zrovna nejkrásnější:
<?php
class Calendar extends Nette\Forms\FormControl
{
public function getControl()
{
ob_start();
echo $this->control;
echo '<script type="text/javascript">
....
</script>';
return ob_get_clean();
}
}
?>
jde to lépe?
díky
- Jod
- Člen | 701
Ja používam jQuery, všetko si prekne zadefinujem do .js súboru pri loade.
Napr.:
Máš kalendár/e s classou calendar. Vytvoríš si súbor custom.js
<script>
$(document).ready(function(){
$('.calendar').click(function() {
// vlastný kód, napr.
alert($(this).val());
});
}
</script>
Nejak takto, alebo hladáš iné riešenie?
Editoval Jod (7. 12. 2008 16:18)
- xTrip
- Člen | 15
Ano nějak takto. Akorát trochu univerzálnější řešení. V tom skriptu
máš natvrdo $('.calendar')
. Když se to generuje v getControl,
použiju $("#' . $this->getHtmlId() . '")
. Čili jde mi jednak
o to, abych se dostal k id prvku. Druhak jsem toto chtěl udělat už
v constructoru prvku, měl bych všechny javascripty k dispozici už před
renderováním a vypsal bych si je v konečném xhtml kodu na jednom místě,
třeba v layoutu. Ale v konstruktoru se nemohu dostat k id budoucího html
elementu
- Jod
- Člen | 701
Načo to tam pchať po idčkach, keď stačí dať kalendáru classu, a javascript obslúži daný component. Ale iste sa vyskytne prblém, keď treba používať idčka, to som skúšal riešiť tak, že som kódom vygeneroval niečo ako var calendarId = $calendar a potom v js to použil, ale nepozdáva sa mi to tiež moc.
- xTrip
- Člen | 15
hrach napsal(a):
hm, co třeba pomocí Nette\Html – použít jako prázdný container :)
Díky, to je asi nejrozumnější řešení.
public function getControl(
{
$code = 'nějaký js kód';
$js = Html::el('script')->type('text/javascript')->setText($code);
$control = Html::el()->add(parent::getControl())->add($js);
return $control;
}
Editoval xTrip (7. 12. 2008 22:43)
- xTrip
- Člen | 15
Jod napsal(a):
Teoreticky by si miesto premennej mohol radšej pridať Template, bolo by to pohodlnejšie :)
Je to dobré riešenie, len ja radšej pchám javascript do externých súborov, je to viac seo =D
Přesně tak. Javascript budu mít v externím souboru, naimportuji, přefiltruji a vložím do Html:el(‚script‘).
To se mi jeví jako docela pěkné řešení.
Původně jsem chtěl vlastní javascriptové rozšíření nějak přidat k javascriptu, které se generují s validací a myslel jsem, že by se pak vše vypsalo společně pod formulářem.
Zatím su spokojený.
Ještě mne napadlo jedno řešení, ale ještě jsem ho nezkoušel. Jde
o to, že celou tuhle taškařici dělám vlastně jen kvůli tomu, abych
získal id prvku. Pak by však stačilo ten javascriptový kód obalit funkcí,
které se id prvku předá, umístit to do souboru a naimportovat jako externí
javascript. U prvku pak použít prostě onclick.
Pak bych ale ani nepotřeboval vytvářet vlastního potomka FormControl a mohl
bych to celé naroubovat třeba na obyčejný input prvek.
Tak tohle musím vyzkoušet :-) To se jeví jako ještě zajimavější.