Autor Zpráva
suvel
Profil
Prosím o pomoc: Kontroluji pomocí java scriptu, aby do <textarea> nešly zadávat nepovolené znaky - to je OK. Ale jak udělat, aby nešel zadat Enter / přechod na novou řádku? Má Enter vždy stejný kód? a jaký?
Moc díky
imploder
Profil
10
Chamurappi
Profil
13
suvel
Profil
Asi jsem dneska nějakej úplně blbej. Když chci tedy zjistit v textu pozici Enteru, který má kód 10 nebo 13, jak to zapíšu do a.value.indexOf(), kde a = document.getElementById()? Když dám a.value.indexOf(10), tak nic, fromCharCode(10) tam taky nějak nefunguje...
suvel
Profil
Tak už to chodí:

a = document.getElementById("t");
e = String.fromCharCode(10);
pozice = a.value.indexOf(e);

Jen ještě prosím znalé odborníky o názor, jestli mi to "chytne" Enter ve všech prohlížečích (IE, Mozilla..) A v jakém případě je kód 10 a kdy je 13? Mně to hází vždycky jen 10.
Díky!
panther
Profil
suvel
jestli mi to "chytne" Enter ve všech prohlížečích (IE, Mozilla..)
to by sis mohl sám ozkoušet, ne?
suvel
Profil
panther:
to by sis mohl sám ozkoušet, ne?

OK, ale variant je hodně, třeba i záleží na národních klávesnicích...? Nemá s tím někdo zkušenost, abych nad tím nestrávil celé hodiny? A proč psal Chamurappi 13?
vynalezce
Profil
ja bych to resil phpkem
$test=nl2br($vstup)
$test=strtr($test,"<br>","");
if($test!=$vstup){echo "v retezci se vyskytuje enter"}
snad je to ok
text bez enteru je v promenne $test
Nox
Profil
suvel
Enter snad bude všude na klávesnicích stejný

Na jakém operačním systému děláš?
Ono totiž když se mluví o odřádkování, tak jsou tu 2 znaky CR - Carriage Return a LF - Line Feed... Tučňák (a UNIX a další UNIX-like) používá jen LF (10), Windows používá při odřádkování dvojici CR+LF (13,10)...a jen CR používají nějaké obskurní systémy

Víc zde: http://en.wikipedia.org/wiki/Newline

vynalezce
No, může chtít mít řešené oboje, aby třeba uživatel nemusel načítat znovu celou stránku jen kvůli tomu, že přehlédl, že nemají být entry
suvel
Profil
No, z toho snad vyplývá, že "10" je přítomno snad vždy...

Pro ty, kteří se trápí a nebo třeba budou trápit jako já, uvádím funkční skript, odzkoušený v IE6,7 a Mozilla Firefox3 s klavesnicí cz a eng. Nedovolí zadat ' " \ a Enter. Jako doplněk ještě kontroluje maximální délku textu (zde 250 znaků). Není to třeba nejelegantnější řešení, ale v praxi vyhovuje:

function text()
{
a = document.getElementById("t");

// Kontrola nepovolenych znaku:
pozice = a.value.indexOf("\'"); p1 = pozice;
s_text(this)
pozice = a.value.indexOf("\""); p1 = pozice;
s_text(this)
pozice = a.value.indexOf("\\"); p1 = pozice;
s_text(this)
e = String.fromCharCode(10);
pozice = a.value.indexOf(e);; p1 = pozice;
if (navigator.appName != "Netscape")
p1 --;
s_text(this)

// Kontrola delky textu:
if(a.value.length>250)
{
alert ("Byl dosažen konec textu.");
a.value = a.value.substr(0,(a.value.length-1));
}
}

function s_text()
{
if(pozice > -1)
{
alert ("Nepovolený znak!");
a.value = a.value.substr(0,(p1))+a.value.substr((pozice+1),(a.value.length));
}
}

Díky všem!
suvel
Profil
Nox
Na jakém operačním systému děláš?

Windows a Linux
fuckin
Profil *
vynalezce
Jestli se nepletu tak tvuj kod odstrani br tagy,nikoly novy radek, zmacknuti enteru neprida br tag!
suvel
Profil
Fuckin
Ten Vynalezcuv script jsem nezkoušel, ale na první pohled se zdá, že by to mělo fungovat - nl2br převede Entry na <br> a StrTr je odstraní...
Bohužel z formulaře je to prakticky nepoužitelné, když chci uživatele upozornit, že právě teď napsal něco, co tam být nesmí, tedy interaktivně.
Chamurappi
Profil
Reaguji na suvela:
A proč psal Chamurappi 13?
Protože kód klávesy Enter je 13. Pokud vím, tak vždy a všude.

Kdybych chtěl v <textarea> zamezit výchozímu chování klávesy Enter, udělal bych to třeba takhle:
<textarea onkeypress="return (event.keyCode != 13)"></textarea>
(Což ovšem nezabrání uživateli vložit odřádkování jiným způsobem, třeba zkopírovat jej odjinud.)
imploder
Profil
suvel
No, z toho snad vyplývá, že "10" je přítomno snad vždy...
Na Windowsu a Linuxu ano, na Macu je údajně jenom 13 (i když MacOSX je UNIX). Bude lepší detekovat kterýkoliv z těch znaků, sekvenci 13-10 (Windows) stejně musíš odstranit celou - oba ty znaky.
EDIT: MacOS používal jen CR jenom do verze 9 (neUNIXové)
suvel
Profil
Tak jsem trochu bádal a tady jsou výsledky (stejné, ať běží pod Windows nebo Linuxem):

Klávesa Enter vždy přidá do řetězce CR LF. Např. mám-li řetězec 123456 a po 3 dám Enter, vypadá řetězec takto: 49 50 51 13 10 52 53 54. Stejné v IE i Mozille.

V každém prohlížeči se však příkaz indexOf chová poněkud odlišně. Zatímco v IE detekuje pozici znaku LF v uvedeném řetězci jako 4, v Mozille jako 3. Proto je v tom mém scriptu jiné zkrácení řetězce dle prohlížeče. Ale proč to tak je, to fakt nevím - všude se uvádí, že pozice znaku v řetězci se počítá od 0 a asi to není vždy pravda...

Doplněno: Tak tu pozici to detekuje dobře. Problém je v tom, že indexOf v Mozille "neodchytí" CR (13) - tváří se, jako by tam žádné CR nebylo (ale když se podívám do řetězce, tak tam je). Netuším, co se děje, ale už to asi budu brát jako fakt. Zkrátka, když hledám výskyt LF, tak to funguje, i když se shora uvedenými rozdíly. Lidičky, nechcete všichni používat jen jeden prohlížeč ? :-)
imploder
Profil
suvel
Ono tohle rozdělení podle OS se týká formátu textových souborů, pro formuláře vzhledem k tomu, že je každý prohlížeč může mít implementované po svém (a Mozilla si formulářové prvky dělá sama), to platit nutně nemusí. I když čekal bych, že bude.

Napadá mě, není v JS něco jako univerzální vyjádření konce řádku - nějaký znak '\n', který se na konkrétní platformě převede na tamější podobu konce řádku?
suvel
Profil
Abych to neměl tak jednoduché, nainstaloval jsem si Operu 9.64 a z jistil jsem, že Opera ignoruje příkazy onclick, onkeydown, onkeypress i onkeyup (v <textarea>). Prostě to, co chodí v IE a Mozille, v Opeře nechodí. Sysifos měl proti mně leháro.

Doplněno: V Opeře nejsem schopen z <textarea> zavolat javascriptovou funkci. Musel jsem se tedy uchýlit až k následné opravě pomocí php:

$text = StrTr($text, Chr(10), " ");
$text = StrTr($text, "\\", " ");
$text = StrTr($text, "'", " ");
$text = StrTr($text, '"', " ");

Tady se to nezřetelně zobrazuje - ve 3. řádce je " ' ", ve 4. řádce je ' " ' (bez mezer).
nl2br nelze použít, stejně tak nefunguje ve StrTr poslední řetezec prázdný, musí tam být mezera. V praxi to nevadí, možná je to nakonec dobře.
Taky jsem zkoušel ještě k tomu $text = StrTr($text, Chr(13), " "); ale kromě toho, že jsem měl pak v řetězci dvě mezery, to žádná změna nebyla. Naopak samotná "13" nestačí.
Snad to někomu pomůže.
Uf.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: