Ten skrypt powinien zająć 2-3 zajęcia. Trzeba go oddać na trzecim labie.

Podobne dokumenty
Wszechnica Poranna: Tendencje w rozwoju informatyki i jej zastosowań Do czego można wykorzystać język JavaScript. Krzysztof Ciebiera

JQuery. $('#pierwszy').css('color','red').hide('slow').show(3000); $(document).ready(function() { //... tutaj nasze skrypty jquery //...

Masz pomysł na lepszy wygląd?

Wykład 03 JavaScript. Michał Drabik

Podstawy JavaScript ćwiczenia

Aplikacje WWW - laboratorium

Aplikacje WWW - laboratorium

Laboratorium 1: Szablon strony w HTML5

CSS - layout strony internetowej

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Funkcje i instrukcje języka JavaScript

Zajęcia 4 - Wprowadzenie do Javascript

Zdarzenia Zdarzenia onload i onunload

Cw.12 JAVAScript w dokumentach HTML

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Widżety KIWIPortal. tworzenie umieszczanie na stronach internetowych opcje zaawansowane. Autor: Damian Rebuś Data: Wersja: 1.

JAVAScript w dokumentach HTML - przypomnienie

HTML (HyperText Markup Language) hipertekstowy język znaczników

Young Programmer: HTML+PHP. Dr inż. Małgorzata Janik, Zajęcia #2

SUM Edukacja Techniczno Informatyczna Języki i Systemy Programowania. Wykład 3. dr Artur Bartoszewski - WYKŁAD: Języki i Systemy Programowania,

DOM (Document Object Model)

LIVE Gra w życie. LIVE w JavaScript krok po kroku. ANIMACJA Rozpoczynamy od podstawowego schematu stosowanego w animacji

JAVAScript w dokumentach HTML (2)

Rys.2.1. Drzewo modelu DOM [1]

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

Zaawansowane aplikacje internetowe

Aplikacje WWW - laboratorium

Dokumentacja Skryptu Mapy ver.1.1

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

XML extensible Markup Language. część 5

Odsyłacze. Style nagłówkowe

Specyfikacja techniczna dot. mailingów HTML

[WYSYŁANIE MAILI Z PROGRAMU EXCEL]

SterBox. Przygotowanie Strony Użytkownika

Zajęcia nr 15 JavaScript wprowadzenie do JavaScript

I. Formatowanie tekstu i wygląd strony

Dzięki arkuszom zewnętrznym uzyskujemy centralne sterowanie wyglądem serwisu. Zewnętrzny arkusz stylów to plik tekstowy z rozszerzeniem css.

1. Dockbar, CMS + wyszukiwarka aplikacji Dodawanie portletów Widok zawartości stron... 3

Danuta ROZPŁOCH-NOWAKOWSKA Strona Moduł 4. Przykład 1. Przykład 2. HTML 4.01 Transitional).

Tworzenie Stron Internetowych. odcinek 10

I. Wstawianie rysunków

plansoft.org Zmiany w Plansoft.org

Pętle. Dodał Administrator niedziela, 14 marzec :27

Podstawy technologii WWW

Programowanie WEB PODSTAWY HTML

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI

Informatyka II. Laboratorium Aplikacja okienkowa

Specyfikacja techniczna kreacji HTML5

lekcja 8a Gry komputerowe MasterMind

Ćwiczenie: JavaScript Cookies (3x45 minut)

PHP: bloki kodu, tablice, obiekty i formularze

Laboratorium 6 Tworzenie bloga w Zend Framework

Dokument zawiera podstawowe informacje o użytkowaniu komputera oraz korzystaniu z Internetu.

HTML (HyperText Markup Language)

Przekształcenie danych przestrzennych w interaktywne mapy dostępne na stronach www (WARSZTATY, poziom zaawansowany)

Ćwiczenie 1 Galeria zdjęć

Defilada - przykład wykorzystujący animowane modele Copperlicht. Andrzej P.Urbański Politechnika Poznańska

Format HTML. Wybrane działy Informatyki Stosowanej. Definicja i przeznaczenie Struktura dokumentu Znaczniki Formularze i komponenty

BIBLIOTEKA LOKALNE CENTRUM WIEDZY PRAKTYCZNEJ PRZEWODNIK PO NARZĘDZIACH WARSZTAT NR 1: ARKUSZE KALKULACYJNE - MINI SKRYPT

Oczywiście występują także znaczniki, bez ich odpowiednika kończącego, np. <BR>

Programowanie w języku Python. Grażyna Koba

Informatyka MPDI 3 semestr

Aplikacje WWW - laboratorium

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Zdarzenia w JavaScript (Zajęcia r.)

PORADNIK KODOWANIA: CSS

AUDYT DOSTĘPNOŚCI STRONY INTERNETOWEJ

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Krótki przegląd własności języka CSS

JAVAScript w dokumentach HTML (1)

Box model: Content. Content - obszar zawartości określany jest za pomocą deklaracji wysokości i szerokości.

Test przykładowy 2 PAI WSB Wrocław /06/2018

9. TABELE KURS HTML.

Szablon główny (plik guestbook.php) będzie miał postać:

Przykład integracji kalkulatora mbank RATY na platformie IAI

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Innowacja pedagogiczna Pasja programowania ZESPÓŁ SZKÓŁ W CHOROSZCZY

CSS. Kaskadowe Arkusze Stylów

XML extensible Markup Language. część 5

Tworzenie szablonów użytkownika

EGZAMIN POTWIERDZAJĄCY KWALIFIKACJE W ZAWODZIE Rok 2016 CZĘŚĆ PRAKTYCZNA

Ćwiczenia laboratoryjne nr 8 Podstawy języka XML.

Dokumentacja WebMaster ver 1.0

Jak zamówić zdjęcia przez FotoSender?

DOKUMENTY I GRAFIKI. Zarządzanie zawartością Tworzenie folderu Dodawanie dokumentu / grafiki Wersje plików... 7

W ogólności znaczniki mogą również posiadać atrybuty które pozwalają wpływać i manipulować własnościami znaczników lub przenosić dodatkowe informacje:

Języki programowania wysokiego poziomu. HTML cz.2.

Generatory pomocy multimedialnych

Tworzenie Stron Internetowych. odcinek 9

Tabele. Przykład 15a.htm. <HTML><HEAD><TITLE> Cennik</TITLE></HEAD><BODY><H3>Cennik</H3> <TABLE BORDER="1"> <TR>

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Maple i wykresy. 1.1 Najpierw należy się zalogować. Jak to zrobić zostało opisane w moim poprzednim tutorialu.

2.1. Duszek w labiryncie

Aplikacje WWW - laboratorium

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Dokument hipertekstowy

Programowanie obiektowe. Wykład 4

HTML. HTML(ang. HyperTextMarkupLanguage, pol. hipertekstowy język znaczników) język wykorzystywany do tworzenia stron internetowych

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Języki programowania wysokiego poziomu. CSS Wskazówki

Pomorski Czarodziej 2016 Zadania. Kategoria C

Transkrypt:

Ten skrypt powinien zająć 2-3 zajęcia. Trzeba go oddać na trzecim labie. Zakładam, że wszyscy wiedzą na czym polega sudoku. Jeśli ktoś jednak nie wie, to http:// en.wikipedia.org/wiki/sudoku (wariant podstawowy). Zadania 1. Napisać coś co ułatwi wypełnianie sudoku (np. na czerwono niech się zaznaczają liczby, które są w konflikcie, a na zielono podświetla się aktualny wiersz i kolumna) 2. Zrobić przycisk "Hint", który podpowiada nam rozwiązanie dla wybranego pola (można wymyślić coś fajniejszego) 3. Zrobić licznik czasu do rozwiązania. 4. Zrobić przycisk "Pauza": ekran robi się szary, licznik nie odlicza czasu. 5. Zrobić undo i redo 6. Zrobić zapisywanie (w cookie lub za pomocą web storage) stanu aktualnie rozwiązanego sudoku. Zapisywać można albo sam stan, albo całą historię. Jak wygodniej. 7. Przygotować 10 sudoków do rozwiązania i jakąś metodę na wybór jednego z nich. 8. Wykorzystując którąś z gotowych bibliotek (np. http://twitter.github.com/bootstrap/ albo http://www.99lime.com/elements/) doprowadzić swoją aplikację do rozsądnego wyglądu.

Mini-tutorial JavaScript Spróbujemy wykonać program sprawdzający rozwiązane sudoku. Co zrobimy na zajęciach 1. Piszemy program w JQuery (JavaScriptowa biblioteka, która zajmie się większością rzeczy, którymi nie chcemy się jeszcze zajmować) 2. Program będzie wyświetlał jedno, predefiniowane sudoku. 3. Będzie pozwalał na wprowadzenie rozwiązania. 4. Będzie sprawdzał czy rozwiązanie jest poprawne. Instalujemy jquery Nie będziemy pisać w czystym JavaScripcie, tylko skorzystamy z pomocy biblioteki jquery. Ściągamy ją ze strony http://jquery.com/ Uwaga: wiem, że zamiast wykorzystywania jquery z lokalnego pliku można skorzystać z CDNa. Wyjątkowo, dla potrzeb tego konkretnego zadania, proszę tak nie robić.

Aby sprawdzić czy wszystko jest w porządku zaczniemy tworzyć nasze sudoku. Niech ma ono na razie następującą postać (plik sudoku.html): <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf- 8"/> <title>sudoku</title> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready(function() alert("wczytane"); ) </script> </head> <body> <div id='plansza'>miejsce na planszę</div> </body> </html> Wystaw stronę na serwerze students.mimuw.edu.pl/~login/... (http://lk.mimuw.edu.pl/index.php/ wlasna-strona-www) Sprawdź, czy działa otwierając za pomocą przeglądarki (będę korzystał z Google Chrome). Po otwarciu strony powinien się pojawić komunikat Wczytane. Jeśli nie działa, to bardzo prawdopodobne jest, że w katalogu z plikiem sudoku.html nie ma jquery.js. Jak to sprawdzić? Klikamy na strone prawym przyciskiem myszy, wyświetlamy jej źródło i sprawdzamy co się dzieje jak klikniemy na jquery.js. Powinien się nam wyświetlić skrypt w js. Jeśli się nie wyświetla to albo brakuje pliku, albo coś jest nie tak z uprawnieniami.

W jaki sposób wyświetla się napis Wczytane $(document).ready(function() alert("wczytane"); ) JQuery udostępnia funkcję $(document).ready(function()... gdzie w miejsce trzech kropek możemy wpisać dowolny program w JS, który zostanie uruchomiony po załadowaniu strony. Widać, że programowanie w jquery jest dość "funkcyjne". Tworzymy anonimową funkcję, która zostanie uruchomiona po załadowaniu strony. Zastępowanie zawartości elementów Najprościej byłoby nam przygotować planszę w HTML. Należałoby zrobić tabelkę (proszę, przeczytajcie: http://www.w3.org/tr/html401/struct/tables.html, to nie jest trudne a pokazuje jak wygląda prawdziwa specyfikacja HTML), składającą się z dziewięciu wierszy, każdy z nich składający się z dziewięciu kolumn a w każdej z kolumn jedno pole do wprowadzania wyników. Czyli należałoby napisać coś takiego: <table border=1> <tr><td><input...><td>...</tr>... </table> Jak to zrobić w JS? Zamieńmy skrypt, który mamy na następujący: <script type="text/javascript"> plansza = "<table border=1><tr><td>1<td>2<tr><td>3<td>4</table>" $(document).ready(function() $("#plansza").html(plansza); )

</script> i przeładujmy stronę. W tej chwili już nie pokazuje się okienko z napisem Wczytane. Dzieje się coś dużo ciekawszego Wyświetla się plansza (no taka mała plansza 2x2). Konstrukcja $( #identyfikator ).html(wartość), ustawia wartość elementu o identyfikatorze (atrybut id w HTML) identyfikator. Teraz tylko potrzebujemy zbudować planszę. Programowanie Spróbujmy najpierw wyobrazić sobie, jak nasza plansza mogłaby wyglądać? Dobrze by było gdyby była kwadratowa i gdyby każde jej pole można było jednoznacznie zidentyfikować. Powiedzmy, że pierwszy wiersz zawierałyby pola z identyfikatorami 11, 12, 13,..., 19. Drugi 21, 22,..., 29, i tak dalej, aż do 91, 92,..., 99. Popatrzmy na program: $(document).ready(function() plansza = "<table border=1>" for(i = 1; i <= 9; i++) plansza += "<tr>"; for(j = 1; j <= 9; j++) plansza += "<td>"; plansza += i * 10 + j;

plansza += "</td>"; plansza += "</tr>"; plansza += "</table>" $("#plansza").html(plansza); ) Składnia jak widać przypomina Javę. Średniki na końcu wiersza są opcjonalne. Funkcje Jeśli będziemy nasz program rozwijać w podobny sposób, to za chwilę stanie się nieczytelny. Dlatego też podzielimy go na logiczne fragmenty przy użyciu funkcji. Co ciekawe w JS są obiekty, ale nie ma tradycyjnych klas, ale dojdziemy do tego kiedy indziej. Funkcje w JS zachowują się odmiennie niż w typowych językach programowania. Nie jest sprawdzane czy do funkcji jest przekazywana odpowiednia liczba parametrów. Funkcja może zwracać swój wynik, ale nie musi. Nie jest sprawdzany typ tego wyniku, czyli funkcja może czasem zwracać liczbę, a czasem napis. Wydzielmy teraz z naszego programu funkcję budującą planszę: function Plansza(rozmiar) plansza = "<table border=1>" for(i = 1; i <= rozmiar; i++) plansza += "<tr>"; for(j = 1; j <= rozmiar; j++)

plansza += "<td>"; plansza += i * 10 + j; plansza += "</td>"; plansza += "</tr>"; plansza += "</table>" return plansza; $(document).ready(function() $("#plansza").html(plansza(6)); ) W naszym programie pojawiła się funkcja Plansza. Pobiera ona jeden parametr (rozmiar) i zwraca zbudowaną planszę za pomocą instrukcji return. Zmienne i ich zasięg Moglibyśmy teraz wpaść na pomysł, aby podzielić funkcję budującą planszę na dwie części z których jedna będzie budować wiersze, a druga składać je w całość. Przyjrzyjmy się następującemu programowi: function Wiersz(numer, rozmiar) wiersz = "<tr>"; for(i = 1; i <= rozmiar; i++) //UWAGA: zmieniliśmy j na i!

wiersz += "<td>"; wiersz += numer * 10 + i; wiersz += "</td>"; wiersz += "</tr>"; return wiersz; function Plansza(rozmiar) plansza = "<table border=1>" for(i = 1; i <= rozmiar; i++) plansza += Wiersz(i, rozmiar) plansza += "</table>" return plansza; $(document).ready(function() $("#plansza").html(plansza(6)); ) Ten program wygląda całkiem poprawnie, prawda? Niestety ma jedną wadę. Źle działa. Co się dzieje? Otóż domyślnie zmienne, których używamy wewnątrz funkcji są globalne. To znaczy,

że zmienna i używana w pętli for w funkcji Plansza, to ta sama zmienna i, która jest używana w pętli for w funkcji Wiersz. To niesamowite, ale tak jest. W funkcji Wiersz ta zmienna zostanie podniesiona do wartości 6 i pętla w funkcji Plansza obróci się tylko raz. Podobnie zmienne wiersz i plansza są globalne! Co z tym zrobić. W JS do zdefiniowania zmiennej lokalnej służy słowo kluczowe var. Poprawmy zatem nasz program: <script type="text/javascript"> function Wiersz(numer, rozmiar) var wiersz = "<tr>"; for(var i = 1; i <= rozmiar; i++) wiersz += "<td>"; wiersz += numer * 10 + i; wiersz += "</td>"; wiersz += "</tr>"; return wiersz; function Plansza(rozmiar) var plansza = "<table border=1>" for(var i = 1; i <= rozmiar; i++) plansza += Wiersz(i, rozmiar)

plansza += "</table>" return plansza; $(document).ready(function() $("#plansza").html(plansza(6)); ) </script> Teraz program powinien już działać poprawnie. Zwróć uwagę na konstrukcję $("#plansza").html(plansza(6)); Wywołuje ona funkcję Plansza z parametrem 6, a jej wynik przekazuje do funkcji html, która ustawia go jako zawartość elementu #plansza. Obsługa napisów i liczb Czas zastanowić się w jaki sposób będziemy przechowywać nasze Sudoku. Ze względów technicznych (łatwość przesyłania po sieci) nie najgorszym formatem będzie przechowywanie go w postaci 81 znakowego napisu (czytane od lewej do prawej z góry w dół) z zerami w miejscach, które pozostają do wypełnienia przez użytkownika. Opis Sudoku z rysunku w rozdziale pierwszym wraz z funkcją budującą planszę mógłby wyglądać następująco: var opisplanszy = "020730001" + "009010047" + "000208900" + "000600802" + "207853406" + "804007000" +

"003405000" + "640080700" + "100072090"; function wspolrzedne(i) if (i < 0 i > 80) alert("wspolrzedne: zle dane"); return Math.floor(i/9) + 10 * (i % 9) + 11; function Plansza(opis) var i; plansza = "<table>"; for(i = 0; i < opis.length; i++) if (i % 9 == 0) plansza += "<tr>"; plansza += "<td class='field' id='td"+ wspolrzedne(i) +"'>"; if (opis[i] == '0') plansza += "<input type='text' size='1' maxlength='1' id='i" + wspolrzedne(i) + "'>"; else

plansza += "<input type='text' size='1' maxlength='1' readonly= '' id='i" + wspolrzedne(i) + "' value='"+opis[i]+"'>"; plansza += "</td>"; if (i % 9 == 8) plansza += "</tr>"; return plansza+"</table>"; ; $(document).ready(function() $("#plansza").html(plansza(opisplanszy)); ) Math Math (formalnie jest to obiekt) udostępnia nam m.in. następujące funkcje: Math.abs(a) // wartość bezwzględna a Math.ceil(a) // sufit a Math.floor(a) // podłoga a Math.max(a,b) // maksimum z a i b Math.min(a,b) // minimum z a i b Math.pow(a,b) // a do potęgi b Math.random() // pseudolosowa liczba od 0 to 1 Math.round(a) // zaokrąglenie a Math.sqrt(a) // pierwiastek kwadratowy z a Napisy napis = "ab" + "ca" // konkatenacja napis == 'abca' // porównanie true napis[3] // czwarta litera napisu, czyli a napis.length // długość napisu, czyli 4 napis.indexof('b') // pozycja pierwszego wystąpienia 'b' w napisie, czyli 1 napis.indexof('e') // 'e' nie występuje w napisie, więc zwracane jest -1 napis.lastindexof('a') // ostatnie wystąpienie 'a' w napisie 3 napis.substr(1,2); // od pozycji 1 (czyli drugiej litery) zwróć dwie litery, czyli 'bc'

Nadawanie elementom właściwości HTML Nasza plansza nie wygląda ładnie. Na przykład nie ma na niej pionowych i poziomych kresek. Spróbujemy to zmienić. jquery pozwala na proste nadawanie elementom właściwości HTML. Dodajmy do programu funkcję rysujkrawedzie i zmodyfikujmy $(document).ready tak, aby z tej funkcji korzystał: function rysujkrawedzie() var i; for(i = 0; i < 81; i++) if ((i + 1) % 3 == 0) $('#td'+wspolrzedne(i)).css('border-right', '3px solid'); if (i % 9 == 0) $('#td'+wspolrzedne(i)).css('border-left', '3px solid'); if (Math.floor(i / 9) % 3 == 0) $('#td'+wspolrzedne(i)).css('border-top', '3px solid'); if (i > 71) $('#td'+wspolrzedne(i)).css('border-bottom', '3px solid'); $(document).ready(function() $("#plansza").html(plansza(opisplanszy)); $("table").css('border-spacing', '0'); rysujkrawedzie(); ) Widzimy teraz, że zmodyfikowaliśmy szerokości ramki i nasze Sudoku wygląda ładniej. Ale jak się nam to udało zrobić? Przyjrzyjmy się instrukcji: $('#td'+wspolrzedne(i)).css('border-right', '3px solid'); #td+wspolrzedne(i), to napis identyfikujący jedną z komórek tablicy (wcześniej rozsądnie ponumerowaliśmy wszystkie komórki po kolei ustawiając im właściwość id).css, to funkcja, która ustawia właściwość CSS. W tym przypadku ustawiamy prawą ramkę. Inne ważne właściwości to: background-color: kolor tła (lista kolorów: http://www.w3schools.com/css/ css_colornames.asp) kolory można podawać w formacie #FFFFFF font-weight: czy czcionka ma być pogrubiona (bold) text-decoration: możliwość podkreślenia margin: cztery (top, bottom, left, right) marginesy border: ramki (np. border-top: 2px solid red) padding: odstęp od ramki width, height: szerokość i wysokość elementu

Tablice Zapewne będziemy chcieli umieć sprawdzić czy w wierszach, kolumnach i kwadratach nie powtarza się dwa razy ta sama liczba. W tym celu watro by mieć funkcje, które obliczają indeksy komórek w poszczególnych wierszach i kwadratach. Funkcje te mogłyby zwracać tablice (9- elementowe) zawierające te indeksy. Napiszmy je zatem (dołączmy je do programu, bo się za chwilę przydadzą): function wiersz(i) if (i < 1 i > 9) alert("wiersz: Zły wiersz"); w = new Array(); for(k = 10; k <= 90; k+=10) w.push(k+i); return w; function kolumna(i) if (i < 1 i > 9) alert("kolumna: Zły argument"); w = new Array(); for(k = 1; k <= 9; k++) w.push(i*10 + k); return w; function kwadrat(i) if (i < 1 i > 9) alert("kwadrat: Zły argument"); w = new Array(); x = ((i - 1) % 3) * 3 + 1; y = (Math.floor((i - 1) / 3)) * 3 + 1; for(dx = 0; dx <= 2; dx++) for(dy = 0; dy <= 2; dy++) w.push((x + dx) * 10 + dy + y); return w; Każda z funkcji zwraca tablicę w. Tablicę tworzymy pisząc new Array() tablica pusta, lub new Array(rozmiar) tablica o początkowo ustawionym rozmiarze. Tablice w JS są dynamiczne, czyli nie mają z góry określonego rozmiaru. Na koniec tablicy elementy dodajemy za pomocą instrukcji push(). Operacje na tablicach są następujęce:

new Array(6) stworzenie tablicy o sześciu elementach a[3] czwarty element tablicy a.length rozmiar tablicy a.push('cd') dodanie cd na koniec a.pop() - usunięcie elementu z końca tablicy i jego zwrócenie a.indexof('ab') szukanie elemenu ab w tablicy a.splice(2,5) usunięcie pięciu elementów począwszy od trzeciego elementu z tablicy Dynamiczne nadawanie elementom właściwości Załóżmy, że chcielibyśmy mieć podświetlone wiersz i kolumnę nad którą aktualnie znajduje się myszka. Można to zrealizować ustawiając odpowiednim elementom wartość backgroundcolor na zielony. Ale jak to zrobić? Z pomocą przychodzi nam znowu jquery. Nadaliśmy już wszystkim komórkom klasę.field. Teraz wystarczy, że sprawimy, że po wejściu myszki nad jakiś element klasy field podświetli się nam odpowiednia kolumna i wiersz. Jak to zrealizować? Należy przygotować funkcję podświetl(element), która podświetla wiersz, kolumnę i kwadrat w którym znajduje się element. Zakładając, że mamy już przygotowane funkcje podswietl i wygas, wystarczy dołączyć ich obsługę do $(document).ready. Popatrzmy na nowy fragment programu. function podswietltablice(t) for(i = 0; i < 9; i++) $('#td'+t[i]).css('background-color', 'green'); function podswietl(i) podswietltablice(wiersz(i % 10)); podswietltablice(kolumna(math.floor(i/10)));

podswietltablice(kwadrat(1 + Math.floor((i-10)/30) + 3 * Math.floor(((i % 10)-1)/3))); function wygas() $(".field").css('background-color', 'transparent'); $(document).ready(function() $("#plansza").html(plansza(opisplanszy)); rysujkrawedzie(); $(".field").mouseover(function() podswietl($(this).attr('id').substr(2,2)); ); $(".field").mouseout(function() wygas(); ); ) Jak to działa? Podświetlanie jest zrealizowane poprzez ustawianie odpowiedniej właściwości CSS. Funkcje mouseover i mouseout są wykonywane w momencie najechania i zjechania myszki z elementu.

$(this) zwraca element w kontekście którego wykonywana jest funkcja (w naszym przypadku najechała lub zjechała z niego myszka). Bez funkcji wygaś tablica po pewnym czasie cała stałaby się zielona. Kolor tła 'transparent', oznacza brak koloru, czyli pole jest przeźroczyste. Rozsądniej by było gdyby podświetlane były te pola, które odnoszą się do wybranego elementu (posiadającego focus) a nie tego nad którym jest myszka. Odpowiednie zdarzenia (zamiast mouseover i mouseout) nazywają się focus i blur. Reagowanie na akcje użytkownika Pozostało nam jeszcze sprawdzenie czy Sudoku jest poprawnie rozwiązane. Rozwiązanie poprawne to takie, w którym w każdym z naszych wierszy, kolumn i kwadratów jest dziewięć różnych liczb. Musimy jeszcze ustalić w którym momencie powinniśmy sprawdzać rozwiązanie. Dodamy w tym celu do naszej strony link Sprawdź a jego zdarzenie click (czyli moment w którym na niego klikamy) podepniemy do funkcji która sprawdza poprawność rozwiązania: function poprawnatablica(t) var o = "" var result = true; for(i = 0; i < 9; i++) var v = $('#i' + t[i]).val(); if (!(v >= '1' && v <= '9')) return false; if (o.indexof(v)!= -1) result = false; o += v; return result; function poprawnerozwiazanie() var i; for(i = 1; i <= 9; i++) if (!poprawnatablica(wiersz(i))) return false; if (!poprawnatablica(kolumna(i))) return false; if (!poprawnatablica(kwadrat(i))) return false;

return true; $(document).ready(function() $("#plansza").html(plansza(opisplanszy)); rysujkrawedzie(); $(".field input").focus(function() podswietl($(this).parent().attr('id').substr(2,2)); ); $(".field input").blur(function() wygas(); ); $("#sprawdz").click(function(event) if (poprawnerozwiazanie()) alert("dobrze"); else alert("niedobrze"); ); ) </script> </head> <body> <div id='plansza'>miejsce na planszę</div> <a href="#" id="sprawdz">sprawdz</a> </body> </html> Pełny listing programu <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf- 8"/> <title>sudoku</title> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> var opisplanszy = "020730001" + "009010047" + "000208900" + "000600802" + "207853406" + "804007000" + "003405000" +

"640080700" + "100072090"; function wspolrzedne(i) if (i < 0 i > 80) alert("wspolrzedne: zle dane"); return Math.floor(i/9) + 10 * (i % 9) + 11; function Plansza(opis) var i; plansza = "<table>"; for(i = 0; i < opis.length; i++) if (i % 9 == 0) plansza += "<tr>"; plansza += "<td class='field' id='td"+ wspolrzedne(i) +"'>"; if (opis[i] == '0') plansza += "<input type='text' size='1' maxlength='1' id='i" + wspolrzedne(i) + "'>"; else plansza += "<input type='text' size='1' maxlength='1' readonly= '' id='i" + wspolrzedne(i) + "' value='"+opis[i]+"'>"; plansza += "</td>"; if (i % 9 == 8) plansza += "</tr>"; return plansza+"</table>"; ; function rysujkrawedzie() var i; for(i = 0; i < 81; i++) if ((i + 1) % 3 == 0) $('#td'+wspolrzedne(i)).css('border-right', '3px solid'); if (i % 9 == 0) $('#td'+wspolrzedne(i)).css('border-left', '3px solid'); if (Math.floor(i / 9) % 3 == 0) $('#td'+wspolrzedne(i)).css('border-top', '3px solid'); if (i > 71) $('#td'+wspolrzedne(i)).css('border-bottom', '3px solid');

function wiersz(i) if (i < 1 i > 9) alert("wiersz: Zły wiersz"); w = new Array(); for(k = 10; k <= 90; k+=10) w.push(k+i); return w; function kolumna(i) if (i < 1 i > 9) alert("kolumna: Zły argument"); w = new Array(); for(k = 1; k <= 9; k++) w.push(i*10 + k); return w; function kwadrat(i) if (i < 1 i > 9) alert("kwadrat: Zły argument"); w = new Array(); x = ((i - 1) % 3) * 3 + 1; y = (Math.floor((i - 1) / 3)) * 3 + 1; for(dx = 0; dx <= 2; dx++) for(dy = 0; dy <= 2; dy++) w.push((x + dx) * 10 + dy + y); return w; function podswietltablice(t) for(i = 0; i < 9; i++) $('#td'+t[i]).css('background-color', 'green'); function podswietl(i) podswietltablice(wiersz(i % 10)); podswietltablice(kolumna(math.floor(i/10))); podswietltablice(kwadrat(1 + Math.floor((i-10)/30) + 3 * Math.floor(((i % 10)-1)/3)));

function wygas() $(".field").css('background-color', 'transparent'); function poprawnatablica(t) var o = "" var result = true; for(i = 0; i < 9; i++) var v = $('#i' + t[i]).val(); if (!(v >= '1' && v <= '9')) return false; if (o.indexof(v)!= -1) result = false; o += v; return result; function poprawnerozwiazanie() var i; for(i = 1; i <= 9; i++) if (!poprawnatablica(wiersz(i))) return false; if (!poprawnatablica(kolumna(i))) return false; if (!poprawnatablica(kwadrat(i))) return false; return true; $(document).ready(function() $("#plansza").html(plansza(opisplanszy)); rysujkrawedzie(); $(".field input").focus(function() podswietl($(this).parent().attr('id').substr(2,2)); ); $(".field input").blur(function() wygas(); ); $("#sprawdz").click(function(event) if (poprawnerozwiazanie()) alert("dobrze"); else alert("niedobrze"); );

) </script> </head> <body> <div id='plansza'>miejsce na planszę</div> <a href="#" id="sprawdz">sprawdz</a> </body> </html>