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.