Autor Zpráva
TomasJ
Profil
Zdravím, mám kód, který se mi zdá příliš složitý a tak se ptám, jestli se to dá zjednodušit?
Kód:
function Erase(obj)
{
  if(obj.expr.value)
  {
    var len = obj.expr.value.length-1;
    var out = ''; 
    for(var i=0;i<len;i++){out+=obj.expr.value.charAt(i);}
    obj.expr.value = out;
  }
}


Funkci Erase(this.form) volám ve formuláři (<form name="form">). Funkce má zařídit, aby byl smazán poslední znak z <input>u s parametrem name="expr", při jejím zavolání. Do inputu se jinak psát nedá, pouze přes tlačítka (<button>y). Předem sděluji, že <input> zůstane tak jak je, jde mi jen o tu funkci. Je možnost ji nějak zjednodušit? Pokud ano, tak jak? Děkuji.
_es
Profil
TomasJ:
jestli se to dá zjednodušit?
Funkce má zařídit, aby byl smazán poslední znak
substring
Davex
Profil
Jde to zjednodušit třeba použitím metody slice().

function Erase(obj)
{
  if(obj.expr.value)
  {
    obj.expr.value = obj.expr.value.slice(0, -1);
  }
}
Petr Wudi
Profil
Možná místo
var len = obj.expr.value.length-1;
    var out = ''; 
    for(var i=0;i<len;i++){out+=obj.expr.value.charAt(i);}
    obj.expr.value = out;

by bylo jednodušší
obj.expr.value = obj.expr.value.substring(0, obj.expr.value.length-1)

Mimochodem, když je tam ten parametr name, funguje to i jinde než ve Firefoxu?
TomasJ
Profil
Petr Wudi:
Ano funguje i v IE, Chrome atp...

Davex, _es, Petr Wudi:
A která z těch metod ( slice() || substring() ) je méně tíživá pro běh scriptu?
Petr Wudi
Profil
Není náhodou slice na pole?
TomasJ
Profil
Petr Wudi:
Ano je, ale tady to funguje tak jak potřebuji, stejně jako substring();
A proto se tedy ptám, která funkce je méně náročná pro běh scriptu?

EDIT: slice() údajně vrátí i definovaný kus řetězce. Tzn. pracuje jak s polem, tak i s řetězcem. Asi tedy zvolím slice().
Díky všem :)
Davex
Profil
TomasJ:
Raději bych použil metodu slice(), protože si sama najde konec.

Petr Wudi:
Není náhodou slice na pole?
Ano, také. U stringu vidím, že je od JavaScriptu 1.0.
Witiko
Profil
TomasJ:
obj.expr.value.substring(0, obj.expr.value.length - 1)
obj.expr.value.substr(0, obj.expr.value.length - 1)
obj.expr.value.slice(0, -1)

Co do rychlosti, neměly by zde být rozdíly. Jde o shodné funkce (substring a slice), jediný rozdíl je v tom, že String.prototype.slice přijímá záporné argumenty.

Jak však říká Davex - pokud má prohlížeč na String.prototype.length getter funkci namísto hodnoty, kterou mění jen při změnách, mohlo by dojít ke zpomalení, pokud by byla funkce volána v cyklu.
TomasJ
Profil
Davex:
Ano, použil jsem metodu slice() právě kvůli tomu, že nemusím dál definovat délku řetězce a odčítat od ní 1.
Díky.
Chamurappi
Profil
Reaguji na Petra Wudiho:
Řetězce mají svůj slice.

když je tam ten parametr name, funguje to i jinde než ve Firefoxu?
Funguje to pravděpodobně úplně všude, protože zaměřování formulářových elementů pomocí jmen vzniklo mnohem dříve než ostatní druhy dohledávání elementů.


Reaguji na TomaseJ:
Rychlejší bude nejspíš metoda slice, protože ta si zjistí délku řetězce sama interně, kdežto u substringu ji zjišťuješ skriptem (který navíc i prochází DOMem).
TomasJ
Profil
Vyřešil jsem to takto:
function Erase(obj)
{
  var val = obj.expr.value;//abych nenačítal 2x obj.expr.value
  if(val)
  {
    obj.expr.value = val.slice(0, -1);
  }
}
Chamurappi
Profil
Reaguji na TomaseJ:
Ta podmínka je tam nejspíš zbytečně, slice na prázdném řetězci neselže.
TomasJ
Profil
Chamurappi:
Je to tak, děkuji :)
... Opět se mi z X-řádkového kódu stane 2-řádkový :D.
Witiko
Profil
TomasJ:
Zbytečné plýtvání druhého řádku. Osobně jsem pro jednořádkovou verzi. ;)
TomasJ
Profil
Witiko:
Však já to hodil do jednoho řídku, když je to tak krátké, ale jde o to že nedávno jsem si dělal převodník soustav (vlastním sciptem) a pak jsem zjistil od Chamurappiho, že existuje parseInt();, takže to bylo na 2 řádky...
Proto to slovo „Opět“ :)
Witiko
Profil
TomasJ:
pak jsem zjistil od Chamurappiho, že existuje parseInt();
Jedna z výhod přečtení si dokumentace před tím, než člověk začne psát v nějakém jazyce. :-) Ale také se mi stalo, konkrétně jsem si nepovšimnul funkcí prototypu Number a pak ručně implementoval zaokrouhování jako funkci Number.prototype.roundTo aniž bych tušil, že zde existuje (leč nedokonalá) nativní funkce Number.prototype.toFixed.
TomasJ
Profil
Witiko:
Jsem holt líný :)
Witiko
Profil
TomasJ:
Což ti ve výsledku připraví mnohem více práce. Ale je to taky způsob. :-)
OT končí.... teď!

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:

0