po odoslani keyup na inpute formulara nastavit kurzor naspat na input v ktorom som pisal

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
duskohu
Člen | 778
+
0
-

Ahojte viete mi poradit?
Odosielam formular pri pisani do inputu formulara: pomocov ext:
len neviem ako po invalidaci znovu nastavit kurzor znovu do toho inputu ktory poziadavku vyvolal, aby som mohol pisat dalej.
neviete poradit?
dakujem.

$.nette.ext('text-keyup', {
  load: function () {
    $("input:text.ajax").on('keyup', function (e) {
      var $this = $(this);
        if ($this.attr('value').length >= 3 || $this.attr('value').length <1) {
          $form = $this.closest('form').submit();
          return false;
        }
    });
  }
});
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Chápu tu implementace správně, že se mi při psaní pod prstama ten formulář překresluje? To musí být nepříjemné k používání ne? Myslíš že by to focus spravil?

duskohu
Člen | 778
+
0
-

je to policko filtra
ked pisem do inputu odosiela sa formular, a nasledne sa invaliduje tabulka v ktorej sa zobrazuju filtrovane udaje,

ale problem je v tom ze po invalidacii uz nemam kurzor v tom inpute v ktorom som pisal, a neviem ako ten focus tam dat, ked mam viacej inputov …

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nechápu, proč ten input ztratí focus. To způsobí odeslání formuláře?

jtousek
Člen | 951
+
0
-

Je ten problém ve všech browserech nebo ne?

Asi by šlo si před odesláním zjistit kde je focus a po odeslání jej zase nastavit, ale je to berla, která by neměla být potřeba a určitě to není hezké.

duskohu
Člen | 778
+
0
-

ten formular je sucastou tabulky takze sa invaliduje aj on,
a robi to vo vsetkych prehliadacoch, skusal som nieco taketo, ale takto to asi nepojde:

$.nette.ext('text-keyup', {
  load: function () {
    $("input:text.ajax").on('keyup', function (e) {
      var $this = $(this);
        if ($this.attr('value').length >= 3 || $this.attr('value').length <1) {
          $form = $this.closest('form').submit();
          $this.focus();
          return false;
        }
    });
  }
});
stefi023
Člen | 71
+
0
-

Rekl bych ze focusujes, jeste pred tim nez se ti vrati odpoved z ajaxu a cely formular se prekresli, tzn focus se ztrati…

A neslo by neco jako toto? (psano z hlavy, asi si bude potreba trosku pohrat s nulovanim/podminkovani promenne this.input)

$.nette.ext('text-keyup', {
  load: function () {
    var _this = this;
    $("input:text.ajax").on('keyup', function (e) {
      var $this = $(this);
        if ($this.attr('value').length >= 3 || $this.attr('value').length <1) {
          $form = $this.closest('form').submit();
          _this.input = $this;
          return false;
        }
    });
  },
  success: function () {
    this.input.focus();
  }, {
    input: null
  }

});

Editoval stefi023 (14. 8. 2012 11:24)

duskohu
Člen | 778
+
0
-

nerozumiem preco, ale nejde to, ale kied som urobil test:

$.nette.ext('text-keyup', {
  load: function () {
    var _this = this;
    $("input:text.ajax").on('keyup', function (e) {
      var $this = $(this);
        if ($this.attr('value').length >= 3 || $this.attr('value').length <1) {
          $form = $this.closest('form').submit();
          _this.input = $this;
          return false;
        }
    });
  },
  success: function () {
    alert(this.input.attr('value')); // vrati hodnotu
    this.input.css("color","red"); // neprida style
    this.input.focus();  // nevykona focus
  }
});
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

To je proto, že ten input je už dávno mrtvý… vyříznutý z DOMu. On stále existuje, ale kdesi v neviditelném éteru, v paměti prohlížeče, ale mimo stránku. Co by mohlo fungovat je najít ten samý input v již invalidavaných nových datech a replacnout ho tímhle starým.

Ideálně bych to řešil vyjmutím formuláře z tabulky nebo nějakou jemnější prací se snippety… samozřejmě za předpokladu, že to situace umožňuje.

Editoval vojtech.dobes (14. 8. 2012 15:17)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Evangelist mission. Btw od jQuery 1.8 jsou :text, :input a další podobné selektory deprecated, future proof je nahradit je standardním ekvivalentním CSS selektorem input[type=text], input atd.

duskohu
Člen | 778
+
0
-

uvazoval som ze by som si pred odoslanim zistil parent path, az k body a po ododlani by som na zaklade tejto cesty znovu nasiel input ktory potrebujem, a na neho pouzil focus()

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Četl sis můj předposlední příspěvek? Zkoušel jsi to? To by mělo zachovat obsah i focus…

duskohu
Člen | 778
+
0
-

no skusal som to, bud som to robil ze alebo to nejde,
aste som skusal takuto variantu, ale kurzor mi da na zaciatok inputu pred text

$.nette.ext('text-keyup', {
  load: function () {
    var _this = this;
    $("input:text.ajax").on('keyup', function (e) {
      var $this = $(this);
        if ($this.attr('value').length >= 3 || $this.attr('value').length <1) {
          $form = $this.closest('form').submit();
          _this.input = $this;
          return false;
        }
    });
  },
  success: function () {
    $('#'+this.input.attr('id')).focus();
    //$('#'+this.input.attr('id')).val($('#'+this.input.attr('id')).val());
  }
});

asi by bolo fakt najlepsie dat tabulku mimo snippetu ktory sa invaliduje,
ale problem je v tom ze mam presenter v ktorom nacitavam model
a v nom ma 2 komponenty filter a tabulku
a nacitam podla coho mam filtrovat z filtra komponenty v render presenteru,
a tu filtrujem model a do komponenty tabulka posielam uz vyfiltrovane udaje

ale aby som mohol po odoslani formulara invalidovat snippet tabulky tak musim volad rodica presenter a potom jeho potomka komponentu tabulku kde invalidujem snippet, tak aby som toto nemusel tak
snippet pre filter a tabulku mam v presenteri a v nich mam komponenty filter a tabilku a v render predenteru invalidujem naraz obe, neviem ako to urobit inak nejaky priklad alebo manual som nikde nenasiel…

mam to asi takto:

// Presenter
public function actionDefault()
{
  $this->tasksListTable=$this->context->createTasks();
}

public function renderDefault()
{
   // Filtrovanie
   // vezmem si parametre pre filtrovanie z komponenty
   // v komponente su tieto parametre v persistentnej premenej
  $filterParms = $this['taskTableFilter']->getFilterParms();
  if(!empty($filterParms['priority']))
  {
    $this->tasksListTable->where('priority_id',$filterParms['priority']);
  }

  if ($this->presenter->isAjax())
  {
    $this->invalidateControl('taskTableFilter');
    $this->invalidateControl('taskTable');
  }
}

/** KOMPONENTA - Filter **/
public function createComponentTaskTableFilter()
{
  $taskTableFilter = new TaskTableFilter();
  $taskTableFilter->setPriorityModel($this->context->createPriority());
  return $taskTableFilter;
}

/** KOMPONENTA - Task Table **/
public function createComponentExecutorIncompleteTasks()
{
  $taskTable =  new TaskTable($this->tasksListTable);
  return $taskTable;
}


// latte presenteru
{snippet taskTableFilter}
  {control taskTableFilter}
{/snippet}

{snippet taskTable}
  {control executorIncompleteTasks}
{/snippet}
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Co jsem navrhoval by vypadalo takto:

success: function () {
	var $newInput = $('#' + this.input.attr('id'));
	$newInput.replaceWith(this.input);
	// this.input.focus() ...
}
duskohu
Člen | 778
+
0
-

no problem je v tpm ze ono to replacne input ale, po splneni podmienky

if ($this.attr('value').length >= 3 || $this.attr('value').length <1) {

po tom co vpisem 3 znaky odosle poziadavku input sa replacne ale uz dalsiu poziadavku neposle.