<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bartek Medoń - blog &#187; DOM</title>
	<atom:link href="http://www.blog.bmedon.net/index.php/tag/dom/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.blog.bmedon.net</link>
	<description>Blog Bartka Medonia dotyczący informatyki, ale nie tylko...</description>
	<lastBuildDate>Tue, 20 Jul 2010 18:29:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Jak ograniczyć ilość wpisywanych znaków w pole formularza</title>
		<link>http://www.blog.bmedon.net/index.php/javascript/jak-ograniczyc-ilosc-wpisywanych-znakow-w-pole-formularza/</link>
		<comments>http://www.blog.bmedon.net/index.php/javascript/jak-ograniczyc-ilosc-wpisywanych-znakow-w-pole-formularza/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:32:00 +0000</pubDate>
		<dc:creator>Bartek Medoń</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[DOM]]></category>

		<guid isPermaLink="false">http://www.blog.bmedon.net/?p=36</guid>
		<description><![CDATA[Oto przykład bardzo prostego, ale moim zdaniem bardzo przydatnego skryptu. Skrypt, który nie pozwala na wpisanie do danego pola formularza większej ilości znaków niż określona. Jest to przydatne zarówno dla naszych stron &#8211; aby odwiedzający, który wypełnia sobie tam jakiś formularz (czegokolwiek logowania, wyszukiwania itp.) nie musiał liczyć znaków i zastanawiać się czy czasem nie [...]]]></description>
			<content:encoded><![CDATA[<p>Oto przykład bardzo prostego, ale moim zdaniem bardzo przydatnego skryptu. Skrypt, który nie pozwala na wpisanie do danego pola formularza większej ilości znaków niż określona. Jest to przydatne zarówno dla naszych stron &#8211; aby odwiedzający, który wypełnia sobie tam jakiś formularz (czegokolwiek logowania, wyszukiwania itp.) nie musiał liczyć znaków i zastanawiać się czy czasem nie wpisał ich za dużo, ale również dla Nas samych.<span id="more-36"></span><br />
Dla mnie taka prosta funkcja przydaje się nieraz kiedy piszę jakiś panel administracyjny dla strony czy jakiegoś nawet prostego systemu. Załóżmy, że mamy w bazie danych pole Varchar(20) czyli wiadomo, że więcej niż 20 znaków dla danego rekordu nie wpiszemy w to pole &#8211; ja przyznam się szczerze nieraz nie pamiętam gdzie jest jaki limit znakowy &#8211; dlatego zawsze sobie robię taką blokadę i wtedy wiem ile mogę znaków w dane pole wpisać, nie muszę choćby wchodzić w phpmyadmina żeby to sprawdzić. </p>
<p>Oczywiste jest również to, że dla pól tekstowych wystarczy kod :</p>
<pre name="code" class="html">
<input type="text" name="login" maxlength="25"/>
</pre>
<p>Ale dla pola textarea już takiej możliwości nie mamy. Kod rozwiązania jest bardzo prosty :</p>
<pre name="code" class="javascript">
<script type="text/javascript">
<!--
function ograniczZnaki(pole,max)
{
if ( pole.value.length > max )
{
wpisz = pole.value.substring(0,max);
pole.value = wpisz;
}
}
//-->
</script>
</pre>
<p>i następnie wykorzystanie funkcji w jakimś polu formularza :</p>
<pre name="code" class="javascript">
<textarea onkeyup="ograniczZnaki(this,10);"></textarea>
</pre>
<p>Chciałbym zaznaczyć (dla tych, którzy znają dobrze JS), że zdaję sobie sprawę z tego, że należy korzystać z addEventListener, a nie z onkeyup w elemencie textarea, że nie ma w kodzie znaczników form itp. &#8211; nie wynika to jednak tutaj z mojej niewiedzy, ale z założenia że chciałem pokazać jak najprościej jak omawiany &#8222;mechanizm&#8221; stworzyć.</p>
<p>Zastanówmy się więc jak powinno to być zrobione solidnie. Jeśli chcemy pisać nasze skrypty zgodnie z DOM powinniśmy zapomnieć o dopisywaniu zdarzeń do elementów w znany już sposób czyli przykładowo :</p>
<pre name="code" class="html">
<input type="text" onkeyup="funkcja();"/>
</pre>
<p>Należy korzystać z metod addEventListener (lub do usunięcia zdarzenia removeEventListener). Ale popatrzmy na kod, wtedy lepiej będzie mnie omawiać, a Tobie zrozumieć.<br />
Więc mamy sobie stronę i gdzieś w kodzie :</p>
<pre name="code" class="html">
<form name="formularz_kontaktowy" method="post" action="">
Podaj imię :
<input type="text" name="imie" maxlength="20"/>
Napisz 20 słów o sobie : <textarea name="osobie" rows="10" cols="5"></textarea>
Pozostało :
<input type="text" name="licznik" value=""/>
<input type="submit" value="Wyślij"/>
</form>
</pre>
<p>Do strony dołączony mamy plik z rozszerzeniem *.js o kodzie : </p>
<pre name="code" class="javascript">
function ograniczZnaki()
{
var max = 20;
if (window.event &#038;&#038; window.event.srcElement)
{
var obiekt = window.event.srcElement;
}
else
{
var obiekt = this;
}
if ( obiekt.value.length > max )
{
wpisz = obiekt.value.substring(0,max);
obiekt.value = wpisz;
}
var pozostalo = max-obiekt.value.length;
window.document.formularz_kontaktowy.licznik.value = "Pozostało : "+pozostalo+" znaków";
}
function Zaladowano()
{
var element = window.document.formularz_kontaktowy.osobie;
przypiszZdarzenie(element,"keyup",ograniczZnaki);

}
function przypiszZdarzenie(element,typ_zdarzenia,wykonaj_funkcje)
{
if (element.addEventListener)
{
element.addEventListener(typ_zdarzenia,wykonaj_funkcje,false);
}
else
{
element.attachEvent("on"+typ_zdarzenia,wykonaj_funkcje);
}
}
przypiszZdarzenie(window,"load",Zaladowano);
</pre>
<p>Pole text ma ustawiony atrybut maxlength więc zajmijmy sie polem textarea.Porzucamy więc również przypisanie do BODY zdarzenia onload &#8211; robimy to w kodzie JS przez window.onload . Ale od początku &#8211; zajmijmy się funkcję przypiszZdarzenie &#8211; służy ona nam do przypisania do danego elementu określonego działania (funkcji) w przypadku danego zdarzenia. Zapytacie po co ona, skoro mówiłem, że robi się to przez addEventListener &#8211; odpowiedź jest prosta w szanownej przeglądarce Internet Explorer funkcja ta nie zadziała, należy więc użyć funkcji attachEvent. Jej składnia jak widać jest podobno do addEventListnere, zwróćcie jednak uwagę na przedrostek &#8222;on&#8221; podczas określania typu zdarzenia. Dzięki napisaniu tej funkcji (przypiszZdarzenie) nie musimy za każdym razem sprawdzać czy przeglądarka obsługuje addEventListener czy też nie więc zamiast powtarzać za każdym razem blok :</p>
<pre name="code" class="javascript">
if (element.addEventListener)
{
element.addEventListener(typ_zdarzenia,wykonaj_funkcje,false);
}
else
{
element.attachEvent("on"+typ_zdarzenia,wykonaj_funkcje);
}
</pre>
<p>po prostu wykorzystujemy tą funkcję.<br />
W ten oto sposób przypisujemy do zdarzenia załadowania strony funkcję &#8222;Zaladowano&#8221;. Funkcja ta naszemu polu textarea przypisuje w taki sam sposób funkcję &#8222;ograniczZnaki&#8221;. Zauważ, że tutaj ta funkcja nie posiada żadnych przekazywanych argumentów &#8211; niestety jest to wymóg, w ten sposób nadawana funkcja dla zdarzenia owych argumentów nie może posiadać. Więc można zadać sobie pytanie jak przekazać tej funkcji informacje, że to właśnie dla tego pola ma ona zadziałać ?<br />
Popatrzmy więc na samą funkcję :</p>
<pre name="code" class="javascript">
function ograniczZnaki()
{
var max = 20;
if (window.event &#038;&#038; window.event.srcElement)
{
var obiekt = window.event.srcElement;
}
else
{
var obiekt = this;
}
if ( obiekt.value.length > max )
{
wpisz = obiekt.value.substring(0,max);
obiekt.value = wpisz;
}
var pozostalo = max-obiekt.value.length;
window.document.formularz_kontaktowy.licznik.value = "Pozostało : "+pozostalo+" znaków";
}
</pre>
<p>dla na przykład firefoxa aby określić pole, element dla którego wywołane zostało zdarzenie używamy po prostu znanego nam dobrze this, jednak znowu dla IE to nie zadziała &#8211; więc jak widać tutaj używamy window.event.srcElement.<br />
Pozostałych elementów myślę już nie trzeba tłumaczyć.<br />
Zapytacie pewnie czy to jakiś wymóg, konieczność takiego programowania skoro standardowe metody działają ? Generalnie nie zamierzam nikogo przekonywać do takiego czy innego &#8222;kodzenia&#8221;, ale warto znać różne metody określonych zadań żeby potem nie dziwić się dlaczego coś jest napisane tak, a nie inaczej. Poczytajcie sobie również : <a href="http://developer.mozilla.org/pl/DOM/element.addEventListener" target="_blank" title="Zobacz, poczytaj">link</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.bmedon.net/index.php/javascript/jak-ograniczyc-ilosc-wpisywanych-znakow-w-pole-formularza/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
