![]() |
|||||
| Процесори :: Дънни платки
:: Видео :: Мултимедия
:: Носители :: Периферия Комуникации :: Софтуер :: Технологии :: Links & Downloads :: Форум |
|||||
| JavaScript - изкуството да се създават динамични страници | |||||
|
|
|||||
| - Какво е скрипт? Скриптът е програмен код, който не се компилира, а се изпълнява от програма, наречена интерпретатор. Когато става въпрос за уеб-сайт, ролята на интерпретатор се поема от браузъра (програмата, с която се разглеждат уеб-страниците). Скриптовете в уеб-страниците се пишат на един от двата езика - JavaScript или VBScript, и са част от HTML документа (Реализацията на JavaScript в Microsoft Internet Explorer се нарича JScript. Макар и да има известни разлики в поддръжката на JavaScript в Netscape и Internet Explorer, тъй като JScript и JavaScript практически са един и същи език, ще ги наричаме с общото име JavaScript). Т.е. те се въвеждат по същия начин, по който обикновен HTML код, а всичко останало е работа на браузъра. VBScript произлиза от Visual Basic и се поддържа само от Internet Explorer. JavaScript произлиза от C++ и се поддържа от повечето съвременни браузъри - Какво ни дават скриптовете? След като на екрана бъде изведена една уеб-страница, съдържанието й остава непроменено. Наистина, може да има GIF-анимация, но това не променя положението - анимацията си върви, но текста остава непроменен. Единствения начин да се покаже нещо друго на екрана е препращането на потребителя към друга страница чрез хипервръзка. Така е било преди появата на скриптовете. Те осигуряват някаква степен на програмируемост в уеб-страницата, позволяваща динамичната промяна на съдържанието й. Можете да промените стойността на всеки атрибут в отговор на определено събитие. Това ви позволява да променяте картинка, когато курсора е над нея, да сменята цвета на фона или текста и още много други неща. С овладяването на JavaScript ще разберете колко нови хоризонти ви разкрива. Някои от най-често срещаните приложения на скриптовете са: - Забрана на използването на десен бутон (с цел да не се ползват функциите
Save Picture As/Save Background As и View Source) - Добавяне на скрипт към HTML кода Както беше споменато по-рано, скриптовете се въвеждат по абсолютно същия начин, по който и останалата част от HTML кода. На практика скриптът е част от HTML кода. За да се укаже на браузъра, че започвате писането на скрипт, се използва тагът <SCRIPT>. Тъй като има различни скриптови езици, всеки със свои характерни особености, необходимо е да посочите използвания език. Това се осъществява чрез атрибута LANGUAGE на тага <SCRIPT>. За JavaScript декларацията е следната: <SCRIPT LANGUAGE="JavaScript"> За VBScript стойността на атрибута LANGUAGE съответно е VBScript. Тъй като не всички браузъри поддържат скриптове (особено когато става въпрос за VBScript), може би ще искате да използвате тага <NOSCRIPT>. Кодът между таговете <NOSCRIPT> и </NOSCRIPT> се изпълнява само, ако браузърът не поддържа съответния скриптов език и ви дава възможност да изведете съобщение, че потребителя трябва да се снабди с друг браузър или да покажете опростена вариант на текущата страница. - Принципи на обектно-ориентираното програмиране JavaScript е обектно-ориентиран език и разбирането на основните концепции на обектно-ориентираното програмиране е ключът към овладяването на DynamicHTML. На първо място трябва да се определи понятието обект. JavaScript разглежда всеки таг като обект, а всеки негов атрибут - като негово свойство. В терминологията на обектно-ориентираното програмиране свойство се дефинира като променлива на даден обект. Това е и основата на динамичната промяна на съдържанието на страницата - промяна на стойностите на атрибутите на определени тагове. Тук е мястото да кажем, че всеки обект има име, чрез което се осъществява достъпът до неговите свойства. Имeто на един таг се определя чрез атрибута ID. Този атрибут може да приеме произволна стойност, като единственото условие е да няма повече от един таг с една и съща стойност за атрибута ID. Препоръчва се да не се използват интервали в стойностите на ID. Достъпът до дадено свойство се осъществява, като се напише името на обекта и на свойството, разделени с точка, т.е. ако имате тага <IMG ID="button" SRC="enter.gif" WIDTH="120" HEIGHT="40"> и искате да промените изображението на enter2.gif, кодът ще бъде: button.src="enter2.gif" За разлика от HTML, JavaScript прави разлика между главни и редовни букви. Няма значение как изписвате свойствата, но имената на обектите трябва да се изписват така, както са дефинирани в атрибута ID. Освен това всички функции на JavaScript трябва да се изписват така, както са дадени тук: в повечето случаи това означава всички букви да са редовни.
Основните събития са: - onmouseover възниква, когато курсора на мишката е над обекта Може би е необходимо да изясним понятието над и върху обекта. Както вече знаете, обектът е таг. Когато обектът е <IMG> очевидно е, че над обекта означава над изображението. Но какво става с другите тагове? Над обекта означава над тази област от документа, над която е приложен съответния таг. Ако обектът е <B> това е удебеления текст, а ако е <P> - съответния параграф, <TD> - съответното поле в таблицата; <TABLE> - цялата таблица и т.н. - Oбработка на събития Обработка на събитие се нарича написването на код, който се изпълнява при възникването на това събитие. За да обясним как става това, ще разгледаме следния пример: картинка, която се променя, когато курсора е над нея и се връща в основното си състояние, когату курсора не е над нея. Разполагаме с един обект и две събития. Когато един скрипт трябва да се изпълни в отговор на някое събитие, то напомощтани идват атрибутите FOR и EVENT на тага <SCRIPT>. FOR определя кой е обектът, приемащ събитието, а EVENT - кое е събитието. Съответно кода за нашия пример е: <HTML> Можете да разполагате скриптовете както в хедъра, така и в тялото на документа. От този пример се вижда, че е необходим по един скрипт за всяко събитие. Какво ще стане, ако имаме меню с десет бутона и искаме картинката на всеки един от тях да се променя, когато мишката е над него. Трябват ни 20 скрипта?! Всъщност атрибутите FOR и EVENT на тага <SCRIPT> на практика не се използват. Тага <SCRIPT> се използва за създаване на много по-сложни скриптове, за които ще научите по-нататък. За такива задачи, като обработка на събития и промяна на изображението в отговр на събитие се използват вградените манипулатори на събития. Вместо да пишете скрипт, вписвате събитието в съответния таг, от който се приема то, поставяте знак за равенство и вписвате съответния код. Ако обработката включва повече от една команда, разделяте ги с точка и запетая (;). Все пак е препоръчително да не се използват повече от две команди - в такива случаи се извикват функции, за които ще научите по-нататък. Сега нека разгледаме същия пример: <HTML> - Ключовата дума this В предишния пример видяхте как се използват вградените манипулатори на събития. Но може би сте забелязали употребата на думата this вместо името на обекта, чието свойство променяме. Това често се използва при вградените манипулатори на събития. this обозначава текущия обект (или текущия таг) и премахва необходимостта не само от използването на името на обекта пред неговото свойство, но и въобще от дефинирането на име на обекта. - Работа с данни В JavaScript няма определени типове данни. Те се разделят просто на числови и текстови, като можете свободно да променяъте типа на променливата, присвовайки на на една и съща променлива ту числа, ту текст. Декларацията на променливи не е необходима, но ако тя подхожда на стила ви (а попринцип е добре да се декларират променливите) това става с добавянето на думата var пред името й. Променливата може да бъде инициализиране едновременно с нейната декларация. Може да се инициализира и без да се декларира - тя се създава при първото й срещане в кода. Ако искате да и присвоите текстова стойност, стойността трябва да е в кавички. Изобщо всички текстове в JavaScript се затварят в кавички. Съществуват следните оператори за работа с променливи: + събиране Работата с масиви в JavaScript е малко по сложна. Масива трябва първо да се създаде чрез изикване на функцията Array() и ключовата дума new. Т.е. за да създадем променлива-масив с име myArray, трябва да използваме кода: myArray = new Array() След това достъпът до елементите в масива става чрез исписване на името
на масива и индекс (пореден номер на елемента) в квадратни скоби до него.
Номерацията на елементите започва от 0. Т.е. за да впишем 5 стойности
в масива myArray, ще използваме: Можем да инициализираме масива с 5 елемента, като ги подадем като аргументи на функцията Array(): myArray = new Array(13, 7, 100, 85, 0) И тъй като променливите нямат типове, нищо не пречи един масив да съдържа данни от различни типове :) JavaScript притежава редица функции за улесняване на работата с масива. Тези функции се прилагат над самия масив, като извикването им става чрез исписването им след името на масива, разделени чрез точка - join() обединява всички стойности в масива в един низ. Като параметър
се подава знак, чрез който да разделя стойностите; ако не бъде подаден
параметър се използват запетаи. Създадения низ се връща като стойност
от функцията - тя не променя масива, а връща стойност, която трябва да
бъде присвоена на променлива -многомерни масиви Всеки елемет от масив може да бъде сам по себе си масив. За илюстрация ще дадем един пример: myArray = new Array() Този код показва как се работи с многомерни масиви - Условен оператор Всеки език има някакъв условен оператор. В JavaScript съществува операторът IF, който има следния синтаксис: if(expression) Ако условието expression е изпълнено, изпълнява се първия блок от кода, в противен случай се изпълнява втория. Важно е да се запомни, че условието е в обикновени отваряща ( и затваряща ) скоби, докато блоковете - в отваряща { и затваряща } фигурни скоби. Частта else не е задължителна. Освен това в условието могат да се използват логическите оператори && (и), || (или) и ! (не). Ако имате оператор if(val1>10 && val2>10) кода в blok1 ще се изпълни само ако и двете променливи - val1 и val2
са по-големи от 10. Ако в този код замените && с ||, кода ще се
изпълни ако която и да е от двете променливи е по-голяма от десет. -Избор между повече от един вариант Операторът if е полезен, ако вашия скрипт трябва да изпълни един код, ако дадено условие е изпълнено и друг, ако не е. Но какво ще стане ако скриптът трябва да изпълни различен код за 1 от 10 или дори 1 от 100 възможни варианта. Използването на последователни оператори if е възможно, но тромаво и неудобно. JavaScript предоставя един много по-гъвкав оператор - switch. Синтаксисът му е: swith(variable){ Операторът приема една променлива (всъщност може да приеме всеки израз, например x+y) variable и сравнява стойността и последователно със стойностите val1, val2, val3 и т.н. Ако открие съвпадение, започва изпълнението на съответния блок код. Ако нито една стойност не съвпада със стойността на променливата, то се изпълнява блокът default. Но за какво служат операторите break? Както ще научите по-нататък, този оператор прекъсва цикъла, в който се намира. В случая, той прекъсва изпълнението на съответния блок код. Ако не бъде използван оператор break в някой блок, при неговото изпълнение автоматично ще се изпълни и следващия блок. Това е полезно, ако искате един блок код да се изпълнява за интервали от стойности. Например разгледайте следния код: switch(level){ Ако стойността на променливата level е между 1 и 3, то на променливата difficult и се присвоява стойност easy; ако е 4 или 5 difficult става medium, ако е между 6 и 9 то стойността съответно е "hard". Накрая, ако стойността на level не е между 1 и 9, нищо не се случва. Тъй като след 1 няма break, ако стойността е 1 то кода преминава през блоковете 1,2 и 3, където стига до оператор break. По същия начин протича процеса и за други стойности, чиито блокове код не съдържат оператора break; - Циклични оператори Когато трябва да изпълните многократно един и същи код, дори и с малки промени, напомощтави идват циклите. JavaScrit ви предоставя два циклични оператора, разгледани по-нататък: = Цикъл While Синтаксис: while(expression) Този цикъл се повтаря докато условието expression е изпълнено. Първо се извършва проверката - ако е изпълнено условието expression, изпълнява се код в следващия блок. Нещо в този код трябва да променя при определени условия expression за да се даде шанс на цикъла да завърши. При цикъл while може и никога да не изпълните блока, ако в началото условието не е изпълнено. = Цикъл for Този цикъл ви дава по-усъвършенстван контрол над цикъла. Той ви предоставя инициализация на контролиращата променлива, условие и контрол над условието в едно: for(start; expression; end;) Преди да започне цикъла се изпълнява инициализацията start. Обикновено start се използва за присвояване на първоначална стойност на променливата. Операторът в start се изпълнява само веднъж преди началото на цикъла. Следващия момент е проверката на условието expression. Ако това условие е изпълнено, изпълнява се следващия блок код. В противен случай, цикъла се прекратява. След изпълнението на този блок се изпълнява оператора в end - обикновено той служи за промяна на контролиращата променлива. След като се изпълни end, отново се проверява условието и т.н. докато цикъла не бъде прекратен поради невярно условие или поради прекъсване на цикъла, разгледано по-нататък. Ето един типичен вид на оператора for: for(i=0; i<10; i++) - Прекъсване на цикъл или прескачане на част от него Заедно с циклите, JavaScript ви предоставя два оператора за по-добър контол над тях. Първия от тях е break. Този оператор незабавно прекратява цикъла, независимо от това дали е изпълнено условието. За разлика от него continue връща в началото на цикъла, като кодът след него просто се прескача. Когато ползвате оператора continue вие просто прескачате в края на цикъла, ако сте в цикъл for се изпълнява частта end. Условието се проверява отново и ако е изпълнено, цикълът продължава. Внимание! Никога не използвайте тези два оператора самостоятелно - използването на break ще обезмисли цикъла, защото той ще се изпълни само веднъж, докато операторът continue обесмисля следващия код, защото той никога няма да бъде изпълнен. Използвайте тези оператори в блока на условни оператори. Също така имайте предвид, че ако имате няколко вградени един в друг цикъла, тези оператори въздействат само на цикъла, в който са - те не водят до прекратяване на цикъла, в който се намира текущия. -Оператори, свързани с обектите object1.property1=value1 Това не пречи вътре в блока with да се извършват обръщения към други обекти: просто ако пропуснете да напишете име на обект, то JavaScript приема че това е обектът, определен в оператора with Както виждате, тук отново имаме множество оператори за присвояване. JavaScript предоставя още един оператор, позволяващ ви да преминете през всички свойства на обекта чрез един единствен цикъл. Това се използва не толкова за промяна на свойства, колкото за тяхното прочитане. Все пак ако имате един масив, съдържащ необходимите стойности, то вие бихте могли и да промените всички свойства на обекта в един цикъл. Операторът има следния вид: for (variable in object){ Този цикъл преминава през всички свойства на обекта object, като достъпът до текущото свойство става чрез object[variable] - Функции Функцията е блок от код, който има име и чрез него може да се извиква от всяко едно място в програмата. Функцията може да бъде извикане и от вграден манипулатор на събитие, което я прави изключително полезна, освен това може да приема аргументи и/или да връща стойност, което я прави невероятно гъвкава. Функцията се декларира в рамките на таг <SCRIPT> и може да бъде извикана от всеки един скрипт на страницата или от манипулатор на събитие. Декларирането на функцията става по следния начин: function Name() { За да върне стойност функцията се използва командата return вътре в блока на функцията. Когато функцията съдържа една или повече команди return тя може да бъде присвоена на променлива. Непосредствено след тази команда, разделена чрез интервал се вписва стойността, която трябва да бъде върната. Тази стойност може да бъде и променлива. За да се направи функция, която приема аргументи, просто се вписват имената на променливите, които тя използва, в рамките на кръглите скоби след името и. Тези променливи отговарят само на броя аргументи - те се ползват само от функцията и им се присвояват стойностите, по ред на подаване при извикване на функцията. Например функцията Add(num1, num2) може да бъде извикана с Add(5, val) и по този начин num1 ще съдържа 5, а num2 - стойността на променливата val. num1 и num2 са достъпни само в рамките на функция. Следващата функция приема като аргумент две числа и връща техния сбор: function Add(num1, num2) { -Дефиниране на собствени обекти Всеки таг е обект. В JavaScript има вградени обекти. Но JavaScript не се ограничава само с това - вие можете да дефинирате собствени обекти и да създавате техни екземпляри. И тука е времето да задълбаем малко повече в обектите. Ако имате два тага *IMG*, то те имат един и същи набор от свойства (атрибути), но различни имена. Напрактика, те са екземпляри на един и същи обект. Т.е. ако имате нужда от няколко различни обекта с един и същи набор от свойства, то вие можете да дефинирате един обект и да създадете няколко негови екземпляра. Екземплярите на един обект винаги се различават по тяхното име и обръщението към обект напрактика е обръщение към конкретен негов екземпляр. Дефинирането на обект става както и дефинирането на функция, но като параметри на функцията се подават стойностите на различните свойства на обекта. Ето един пример за дефиниране на обект: function makeobject(material, color, size)
{ Но след написването на тази функция, ние все още нямаме екземпляр от
обекта. Това е дефиницията на обект, но само по себе си не е обект. За
да създадем екземпляр на обекта трябва да използваме ключовата дума new
и функцията makeobject: -Методите Ако променливата на един обект е негово свойство, то функцията на един обект е негов метод. Таговете нямат методи, но вградените в JavaScript обекти имат. Вие можете също да създадете методи, на вашите собствени обекти. Преди всичко трябва да създадете функцията, която искате да е метод на вашия обект. Тъй като тази функция няма да се използва като функция, а ще бъде метод, вие можете да използвате ключовата дума this за да се обръщате към свойствата на обекта. Нека приемем, че сме създали функцията mprice(), която изчислява цената на обекта на базата на материала и размера. Тогава нашия обект ще бъде: function makeobject(material, color, size)
{ Сега ако отново създадем обекта myObj, можем да използваме неговия метод: myObj.price()
С помощта на JavaScript вие можете лесно да създадете три типа диалогови прозорци - такъв за съобщение, съдържащ само OK, такъв за въпрос, с бутони OK и Cacel, и прозорец, в който потребителя да въведе информация. Първия тип се извиква със функцията alert("message"). Когато тази функция е извикана, появява се прозорец съдържащ съобщението message и бутон OK. За да видите пример за този тип прозорци, натиснете бутона по-долу:
С диалога alert вие можете само да уведомите потребителя за него. Ако ви трябва отговор с Да или не, следващата функция ви предоставя тази възможност: confirm("message") Тази функция изкарва прозорец, съдържащ текста message (обикновено въпрос) и бутони OK и Cancel. Ако потребителят натисне OK функцията връща true; в противен случай връща false. За да видите примерен прозорец confirm, натиснете бутона по-долу:
Диалога confirm е подходящ ако потребителя трябва да отговори с да или не. Но какво ще стане, ако ви е необходима друга информация, например възраст или име?помощтадва третия диалогов прозорец в JavaScript - prompt. Функцията изглежда така: prompt ("prompt message", defaultvalue) Това ще изкара прозорец със съобщение "prompt message" и текстово поле, в което ще се изпише defaultvalue. Потребителят разбира се, може да смени текста в полето. Функцията връща текстът, който съдържа полето. За да видите как изглежда този прозорец, натиснете бутона по-долу:
- Вградени обекти JavaScript има огромно количество вградени обекти, които ви дават по-пълен контрол над документа. = Window Window е обект от най-горното ниво на всеки HTML документ; всички останали обекти се съдържат в Window. - frames[ ] масив съдържащ всички дъщерни фреймове в документа. Фреймовете
са подредени в реда, в който са дефинирани в документа Чрез свойствата status и defaultStatus можете да промените съобщенията, извеждани в status-бара. Но ако се опитате да промените съобщението, извеждано в status-бара когато курсора е над хиперлинк, въпреки използването на status адреса остава видим в status бара. За да предотвратите извеждането на адреса, към който е хипервръзката, след промяната на свойството status трябва да добавите return true. По този начин браузъра смята функцията за извеждане на адреса изпълнена и оставя в status-бара вашето съобщение Методите на обекта Windows са: -focus() прави прозореца активен Метода има още две възможни променливи, определящи къде да се координатите на горния ляв ъгъл на прозореца спрямо горния ляв ъгъл на екрана. Но за Internet Explorer и за Netscape тези променливи са различни. В Internet Explorer това са left и top, докато в Netscape са screenX и screenY. -close() затваря прозорец, създаден чрез метода open()
Frame е дъщерен прозорец на прозореца на браузъра. Поради това, обектът Frame съдържа същите свойства като обекта Window. Изключение правят само свойствата status, defaultStatus и name = Location Този обект съдържа информация за текущия адрес на страницата (URL) - href пълния URL, представен като тексов низ = history Този обект ви позволява да препратите потребител към която и да е страница
от неговия history-лист - списъка на страниците, които е посещавал. Обектът
има само две свойства: По-полезни са неговите методи: = document Съдържа информация за текущия документ - title съдържа заглавието на документа (определено между таговете <TITLE>
и </TITLE>). Ако не е определено заглавие, съдържа "untitled"
Методите на обекта document се използват за промяна на съдържанието на документа чрез скрипт: -clear() почиства документа. Това няма да промени съдържанието на документа,
нито ще унищожи променливите. Вместо това clear() почиства документа за
бъдещите добавяния на HTML код към документа чрез другите методи на document = Form На всеки таг <FORM> отговаря един обект Form: - name отговаря на стойността в свойството NAME на тага <FORM>
= navigator Този обект се използва за определяне на това, какъв браузър използва
потребителя - appName съдържа истинското име на браузъра = string Този обект съдържа множество методи за манипулация на съдържанието на
текстови низове, и само едно свойство - length съдържащ броя на символите
в него. Характерното за обекта String e, че всички низови променливи практически
са обекти String и можете да използвате методите му върху всеки един низ,
без да е необходимо да създавате обект String =Обекта Math Този обект предоставя множество методи за улесняване на математическите
операции. За разлика от обекта String, тези методи не се прилагат директно
на числа, а явно се използва обекта Math. Например: - Зареждане на скриптове от файл Можете да отделите скрипта от .html документа и да го сложите в отделен файл. Това е подходящо за големи скриптове, тъй като става по-лесна работата със самия HTML документ. Подходящо е и ако един и същи скрипт трябва да присъства в множество страници, тъй като спестява пренаписването му. За целта всичко между отварящия и затварящия таг <SCRIPT> се отделя във файл с разширение .js, а на самия таг <SCRIPT> се добавя атрибута SRC със стойност файлът, съдържащ скрипта. Например ако скрипра се намира във файл library.js, кода за вграждането му ще бъде следния: <SCRIPT LANGUAGE="JavaScript"
SRC="library.js"> - Достъп до текста между таговете Вече разбрахте как се променят атрибутите на таговете. С JavaScrip можете да промените и това, което се съдържа между отварящ и затварящ таг. Това се осъществява чрез свойството InnerHTML, което е универсално за всеки един таг. Работа с Cookies Обикновено Cookiе се превежда като "бисквитка" Макар че наистина
това е превода на думата, аз смятам че термините не бива да се превеждат
и ще използвам по-нататък думата cookie Причината да се използват cookies
е, че няма как да запишете каквато и да е информация за бъдещо ползване.
След като една заявка е изпълнена (обикновено заявка за отваряне на документ),
то сървърът забравя за това. Не става въпрос само за използване на информация
при следващи посещения на същия потребител; дори в рамките на едно единствено
посещение, ако потребителя натисне бутона Refresh, то цялата страница
се връща в първоначалното си състояние. Това е особено неприятно, когато
имате бутони с различни състояния натиснат/ненатиснат. Затова са създадени
cookies - начин да се запазва информация на хард-диска на потребителя
за бъдещо ползване. Тази информация може да се използва при бъдещи посещения
на същия потребител и позволява някакъв вид персонализация на страницата.
JavaScript ви предлага възможността да работите с cookies. Wdy, DD-MMM-YYYY HH:MM:SS GMT - Wdy е трибуквено съкращение, отговарящо на един от дните от седмицата:
Mon, Tue, Wed, Thu, Fri, Sat, Sun Запиването на cookie е сравнително лесно. Но как после да го прочетем: document.cookie = “name = value; expires = date_to_expire” Тука трябва да отбележим, че записваме променливи чрез двойки name=value; Чрез тези два метода, и чрез свойството length, лесно можете да извлечете стойностт на дадена промелива, записана в cookie: function GetCookie(name) Тази функция приема като аргумент име на променлива, записана в cookie и връща нейната стойност. Причината да използваме unescape е, че е възможно при записването на cookie-то, някои знаци да са се записали чрез съответните кодове. Функцията unescape връща същия низ като подадения аргумент, но със заменени всички кодове (%xx - например интервала се представя чрез %20) заменени със съответните символи. Работа с масиви в JavaScript Масива е вид променлива, която може да съдържа множество стойности. Той е изключително полезен, когато искате да използвате множество променливи от един и същи тип. Вместо да създавате променливи dog1, dog2, dog3 и т.н., вие можете да създадете масива dog и да използвате променливите dog[1], dog[2] и dog[3]. Това не само спестява множеството различни имена на променливи, но ви дава и огромно гъвкавост. Но нека първо да видим как са реализирани масивите в JavaScript. В JavaScript масивите не са обикновени променливи, а обекти. Това означава че за да използвате масив, първо трябва да се създаде обект Array. Обектите се създават чрез ключовата дума new. Характерно е, че можете да използвате колкото си искате параметри при създаването на масива, и всички те стават елементи на масива. Това означава че можете да не подадете нито един елемент и да създадете масив с неопределен размер. JavaScript предоставя множество функции за манипулация на масиви. Нека започнем с пример за създаването на масив, а после ще разгледаме подробно възможните манипулации: myArray = new Array() Този код създава масива myArray, а след това запълва първите му 10 елемента с числата от 10 до 1. Този код показва две от ключовите свойства на масива - преминаване през всички елементи на масива чрез един цикъл и използване на променлива в качеството на индекс на масива. Обекта Array, и съответно всеки обект, наследил Аrray (т.е. създаден чрез командата new Array()), притежава едно свойство, съдържащо броя на елементите в масива. Това свойство е length и е изключително полезно, когато искате да преминете през всички елементи на масива чрез цикъл, но не знаете колко са елементите. Другото, което ви предоставя JavaScript, са няколко метода, които в определени ситуации могат да са изключително полезни. Може би сте запознати с понятието стек. Той работи на принципа "Last In - First Out" (последен влязъл, пръв излязал). Т.е. това е като да натрупвате елементите един върху друг. Можете да сложите елемент само най-отгоре и да извадите само най-горния елемент. JavaScript позволява да симулирате такова поведение чрез масив. За целта се предоставят две специални функции, които се явяват стандартни за стековете: фунцкията - push() взима неограничен брой аргументи и ги добавя като елементи към
масива Обърнете внимание че използването на методите shift() и unshift() променя номерацията на елементите. Ако използвате метода shift() втория елемент ще стане първи, третия - втори и т.н., т.е. всички индекси ще намалеят с единица Фунцкиите, симулиращи работа със стек са единствените, които променят изходния масив. Другите работят с копие на масива и като резултат често връщат нов масив. Пример за това е функцията concat() която приема като аргумент масив и връща масив, съдържащ всички стойности от двата масива. Нека поясним това с пример: myArray = new Array(1, 2, 3) Сега масива myNewArray съдържа числата от 1 до 9 Метода slice приема два аргумента - стартова и краен индекс и връща нов масив, състоящ се от елементите межуду началния и стартовия индекс. Т.е. ако използваме кода partOfArray = myNewArray.slice(2, 5) масива partOfArray ще съдържа 4 елемента, съответно числата 3, 4, 5 и 6 JavaScript ни предоставя два метода за сортиране. Метода sort() сортира елементите по азбучен ред, а метода reverse() обръща реда на елементите -join() обединява всички стойности в масива в един низ. Като параметър се подава знак, чрез който да разделя стойностите; ако не бъде подаден параметър се използват запетаи. Създадения низ се връща като стойност от функцията - тя не променя масива, а връща стойност, която трябва да бъде присвоена на променлива Може би сте чували понятието многомерен масив. Това е масив, в който даден елемнт от масива сам по себе си е масив. Нека имаме декларацията: myArray = new Array() Четвъртия елемент от масива ще съдържа масив с три елемента. Съответно достъпът до тях ще се осъществява чрез myArray[3][0], myArray[3][1] и myArray[3][2]. Когато смесвате масивите, т.е. на някои позиции в масива имате обикновени стойности, а на други - масиви, е по-трудно да се работи, макар понякога да е полезно. Затова докато не свикнете с масивите използвайте отделни масиви - едни, които имат само стойности и са едномерни, и други - на които всички елементи са масиви. Всъщност, вие можете да обиколите всички стойности на втория масив чрез цикъл. А ако имате многомерен масив, можете да обиколите всичките му стойности, чрез вложени цикли: for (i=0; i<myArray.length; i++){ Забележете, че използваме свойството length на масива за елемнта i на
myArray. Нали не сте забравили че елемента i на масива сам по себе си
съдържа масив? j=myArray[0].length //връща броя на елементите
на масив, който се съдържа в първия елемент на myArray Това е всичко по отношение на масивите в JavaScript. Когато придобиете опит, може би ще разберете че масива е важна част от всеки език за програмиране, придаваща невероятна гъвкавост и добство при работа с данни JavaScript при създаване на форми Вероятно знаете, че web-формите се обработват от CGI скриптове и за тяхната обработка се използват езици като Perl, PHP или ASP. Тогава може би се чудите за какво тука е JavaScript. JavaScript има три основни предначначения при работа с форма. Често той се комбинира със CGI скрипт за получаване на по-добри резултати. Използването на JavaScript в обработката на форми се дължи на неговия обектен модел, по-специално на методите и събитията на елементите от формата, както и на факта, че той се изпълнява от страна на клиента. Представете си форма, в която трябва да въведете името си и e-mail адрес. Ако не попълните име, или e-mail адреса е невалиден (не съдържа символа @), то CGI скрипта вероятно ще изведе съобщение за грешка и ще върне потребителя на същата страница. Но това означава, че при въвеждане на невалидни данни, формата се изпраща на сървъра, сървъра я обработва, установява грешка и връща същата форма на потребителя. Ето тук идва и мястото на JavaScript - вместо да изпращете всеки път данните и да връщате същата форма, с JavaScript осъществявате проверка за коректност на данните и изпращате формата, само ако данните са валидни. Това е значително по-бърз метод. Тъй като се осъществява на машината на клиента и няма нужда да изпраща информация на сървъра, JavaScript е по-бърз за множество задачи и често се използва в комбинация със CGI скрипт. Но по-някога просто имате нужда от нещо по-просто, което не налага използването на CGI. Например искате падащ списък, който да пренасочва потребителя към различни страници. В момента в който потребителя избере елемент от списъка, трябва да се премине на съответната страница. Това чрез CGI е невъзможно - данните трябва да бъдат изпратени на сървъра за обработка чрез натискане на бутона Submit. Друго предимство на JavaScript е метода submit(), който изпраща данните към сървъра, без да е необходимо натискането на бутона Sumbit. Тук ще разгледаме най-често срещаните приложения на JavaScript при създаването на web-форми. Ако имате сайт, в който потребителя трябва да въведе нещо в текстово поле (например web-базиран e-mail), то ще се сблъскате със следния проблем: потребителя трябва да щракне в полето, след това да въвежда текст. Разбира се, след това може да преминава в следващи полета чрез натискане на Tab, но щеше да е много по-удобно, ако курсорът се появяваше веднага в първото поле. Решението е методът focus() на полетата тип text, password или textarea Друго често срещано приложение на JavaScript без да се изполва CGI скрипт е, падащо меню с препратки към сайтове. Вие искате потребителя да избере елемент от списъка и да премине автоматично на съответната страница. Ключът е в събитието onChange() на падащия списък. Разгледайте следния код: <SELECT NAME="page" onChange="window.location=page.options[page.selectedIndex].value"> Тука трябва да отбележим някои от особеностите на обектите от тип SELECT. На първо място те имат масив options[] отговарящ на елементите OPTION. Това е масив от обекти, всеки от които има свойството value, отговарящо на атрибута VALUE. Самия обект SELECT има свойството SelectedIndex, съдържащо индекса на избрания елемент. Този индекс ние използвахме като индекс на масива options[] за да извлечем стойността на атрибута VALUE на избрания елемент Едно по-трудно за създаване, но изключително полезно приложение на JavaScript е проверка за валидността на данните - дали всички необходими полета са попълнени, дали e-mail -a съдържа символа @ и дали полетата, които трябва да съдържат само числа, наистина съдържат само числа. Запомнете - JavaScript кода е видим за клиента. Затова с него проверявайте само структурата на данните, не тяхното съдържание. Би било глупаво да се използва JavaScript за проверка на валидността на парола. Нека разгледаме следния пример: имаме две тектови полета, в които потребителя трябва да въведе име и фамилия, текстово поле, в което да въведе e-mail, падащ списък, от който трябва да избере елемент и още едно текстово поле, в което трябва да въведе десет-цифрен идентификационен номер. Можем да използваме атрибута MAXLENGTH за да се уверим че идентификационния номер не е по-дълъг от 10 символа, но не може да определим минимална дължина. Така че нашия скрипт трябва да прави следните неща: - Да провери дали в полето за име и в полето за фамилия има поне един
символ Ще разгледаме всяка една от тези задачи по-отделно и накрая ще сглобим
целия скрипт. <FORM NAME="info" METHOD="post"
ACTION="proccess.php" onSubmit="return checkData()"> И така, нашата хипотетична форма изпраща данните на CGI скрипт, наречен proccess.php (в случая е написан на PHP), като използва обработка на събитието onSubmit. В това събитие извиква функцията checkData() която трябва да провери коректността на данните, да изведе съобщение за грешка, ако те не са коректни, както и да прекрати изпращането на формата при установена грешка. За това в обработката на събитието onSubmit използваме ключовата дума return - то ще върне стойността, върната от нашата функция, на браузъра. Съответно ако стойността е false то браузърът ще приеме, че бутона Submit не е бил натиснат и няма да изпрати данните. Следователно нашата функция трябва да върне стойност true или false. Нека започнем с изграждането на функцията: function checkData(){ Първо инициализираме променлива message, съдържаща празен низ. В тази
променлива ще се съдържа съобщението за грешка и при всяка проверка ще
се добавя съответната стойност. Така накрая ще изведем в един прозорец
съобщение, съдържащо всички некоректно попълнени полета. if (info.firstname.value.length==0){message
= message + "Моля въведете име\n"} Също толкова лесна е и проверката на падащия списък. Там трябва само да проверим дали индекса на избрания елемент не е 0 (което е елементът по подразбиране "Избери континент"): if(info.continent.selectedIndex==0){message = message + "Моля изберете континент\n"} Забележете че използваме символа за нов ред "\n" в края на всяко съобщение. Това е така, тъй като може да има повече от едно некоректно въведени полета и ние искаме съобщението за грешка за всеки елемент да се извежда на отделен ред в прозореца (ще използваме фунцкията alert(message) за да изведем съобщението. С E-mail-а положението е друго. Там ни трябват две независими проверки - дали има въведена информация и дали е въведен валиден e-mail. Съответно трябва да се изведат две различни съобщения. Това е по-лесната част. Ние трябва да проверим функцията символ по символ дали съдържа "@" и за да сме съвсем прецизни - дали има точка след този символ. Тази аст от функцията изглежда така: if (info.mail.value.length==0){message = message
+ "Моля въведете e-mail\n"} Накрая, проверката на ID трябва да включва три елемента - проверка въведено ли е нещо в полето; ако е въведено - дали са въведени само числа; ако и това условие е изпълнено - дали са въведени 10 символа. За да проверим дали са въведени само числа ще използваме функцията isNaN(), която връща true, ако подадения аргумент не е число (NaN произлиза от "Not a Number" - "не е число". Кода за тази проверка е: if (info.ident.value.length==0){message = message
+ "Моля въведете ID"} Накаря, ако е записана поне една грешка в променливата message, трябва да се изведе съобщението и да се прекрати изпращането на формата: if (message.length>0){ Когато сглобим целия код, той ще изглежда така: <HTML> if (info.ident.value.length==0){message = message
+ "Моля въведете ID"}
следва продължение.... |
|||||
![]() |
|||||
| Материалът е публикуван на: 03.11.2002
г. |
Автор: Максим
Крижановски |
||||
| Начало на материала :: Процесори :: Дънни платки
:: Видео :: Мултимедия
:: Носители Периферия :: Комуникации :: Софтуер :: Технологии :: Links & Downloads :: Форум |
|||||
|
|||||