Autor | Zpráva | ||
---|---|---|---|
TomasJ Profil |
#1 · Zasláno: 27. 2. 2011, 16:35:32 · Upravil/a: TomasJ
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 |
#2 · Zasláno: 27. 2. 2011, 17:04:03
|
||
Davex Profil |
#3 · Zasláno: 27. 2. 2011, 17:04:59
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 |
#4 · Zasláno: 27. 2. 2011, 17:05:56
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 |
#5 · Zasláno: 27. 2. 2011, 17:06:58 · Upravil/a: TomasJ
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 |
#6 · Zasláno: 27. 2. 2011, 17:16:03
Není náhodou slice na pole?
|
||
TomasJ Profil |
#7 · Zasláno: 27. 2. 2011, 17:17:08 · Upravil/a: TomasJ
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 |
#8 · Zasláno: 27. 2. 2011, 17:26:13
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 |
#9 · Zasláno: 27. 2. 2011, 17:26:22 · Upravil/a: Witiko
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 |
#10 · Zasláno: 27. 2. 2011, 17:29:20 · Upravil/a: TomasJ
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 |
#11 · Zasláno: 27. 2. 2011, 17:30:13
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 substring u ji zjišťuješ skriptem (který navíc i prochází DOMem).
|
||
TomasJ Profil |
#12 · Zasláno: 27. 2. 2011, 17:39:53
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 |
#13 · Zasláno: 27. 2. 2011, 17:45:58
Reaguji na TomaseJ:
Ta podmínka je tam nejspíš zbytečně, slice na prázdném řetězci neselže.
|
||
TomasJ Profil |
#14 · Zasláno: 27. 2. 2011, 17:51:09 · Upravil/a: TomasJ
Chamurappi:
Je to tak, děkuji :) ... Opět se mi z X-řádkového kódu stane 2-řádkový :D. |
||
Witiko Profil |
#15 · Zasláno: 27. 2. 2011, 20:40:34
TomasJ:
Zbytečné plýtvání druhého řádku. Osobně jsem pro jednořádkovou verzi. ;) |
||
TomasJ Profil |
#16 · Zasláno: 27. 2. 2011, 21:16:37
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 |
#17 · Zasláno: 27. 2. 2011, 21:34:22 · Upravil/a: Witiko
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 |
#18 · Zasláno: 27. 2. 2011, 21:41:05
Witiko:
Jsem holt líný :) |
||
Witiko Profil |
#19 · Zasláno: 27. 2. 2011, 21:42:30 · Upravil/a: Witiko
TomasJ:
Což ti ve výsledku připraví mnohem více práce. Ale je to taky způsob. :-) OT končí.... teď! |
||
Časová prodleva: 13 let
|
0