Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX] Okna dialogowe, podstawy.
Forum PHP.pl > Forum > XML, AJAX
Wishermil
Witam!

Rozpocząłem swoją przygodę z Ajaxem i nigdzie nie mogę znaleźć tutoriala odnośnie kreowania samych okienek, wszędzie pchają jakieś zaawansowane moduły (galerie itp.). Mi chodzi tylko o sam szkielet.

Tzn.:

Klikam na link, który wywołuje Ajaxa wykonującego operacje na pliku php i chciałbym, aby po skończeniu operacji pojawiło się zwykłe okienko z informacją: "Poprawnie wykonane." Klikamy w puste pole i okienko się ładnie zamyka.

Z góry dziękuje za pomoc.

toffiak
Po otrzymaniu danych z serwera stwórz/odkryj (jeśli jest już stworzone ale ukryte) okienko, wypełnij je informacją i wyświetl.

Okienko może byc najzwyklejszym div-em z ustawionym position: fixed i odpowiednimm z-indeksem.

Można też skorzystać z wbudowanej metody alert() ale tą trudno ostylować.
Wishermil
Właśnie chodzi mi o to, że nigdzie nie jestem w stanie znaleźć podstawowych informacji na temat samego szkieletu tworzenia okienek. Nie mam pojęcia jak je stworzyć, gdyż wszędzie napotykam jakieś skomplikowane kody. Mógłbyś przedstawić mi procedury, funkcje? Napisać przykładowe okienko dialogowe, które pobiera info z diva?
Kostek.88
Jakiś czas temu robiłem takowe okienka. Teraz z pamięci w wielkim skrócie:

  1. <div id="wrapper"><div>
  2.  
  3. <div id="container">
  4. <div id="popup">
  5. <h1>Title</h1>
  6. <p>Content</p>
  7. </div>
  8. </div>


To wyżej to szkielet HTML: wrapper to ma być ciemne, półprzezroczyste tło za oknem, stąd div jest wyrzucony poza obszar, container to kontener na Twoje okienko: oba mają mieć ustawione position:fixed oraz width i height na 100%. Z kolei #popup ma być na środku ekranu? Jak to zrobić? Jak masz stałą szerokość okna to:

  1. #popup {
  2. position: absolute;
  3. top: 50%;
  4. left: 50%;
  5. margin: -100px 0 0 -200px; // marginesy ujemne równe połowie szerokości i wysokości okna
  6. width: 400px;
  7. height: 200px
  8. }


Jeśli chodzi o dynamicznej wielkości okno, to poszukać centering div horizontal vertical w google, albo zrób jQuery.

pozostałe elementy: <h1> - tytuł, <p> - treść

A teraz AJAX: (umieszczam w kodzie PHP, bo ładniej koloruje, niech Cię nie zmyli to)

  1. $(document).ready(function(){
  2.  
  3. $('a.link').click(function(){
  4. $.ajax({
  5. type: 'POST', // lub GET
  6. success: function(data) {
  7. $('body').append(sciezka); // sciezka do pliku HTML
  8. },
  9. beforeSend: function(){
  10. // tutaj mozesz wstawic loader
  11. },
  12. error: function(){
  13. $('body').append(sciezka);
  14. }
  15. });
  16. });
  17.  
  18. });


Aha, do samego okienka wrzuć jeszcze trochę jQuery
  1. $('div#container').click(function(){
  2. $('div#wrapper').remove();
  3. $('div#container').remove();
  4. })


ew. jak masz dużo takich okienek aktywnych już, to odwołuj się poprzez $(this)

  1. $('div#container').click(function(){
  2. $(this).prev('div#wrapper').remove();
  3. $(this).remove();
  4. });


A wtedy też pozamieniaj ID na class, co by się nie duplikowało. Oczywiście w kodzie może być sporo błędów, sam to zrobiłem jeszcze inaczej, ale generalnie idea jest taka. Co do wrappera, to tak sobie teraz pomyślałem, że możesz go wywalić, a zostawić sam container, tylko jak będziesz chciał ustawić tło półprzezroczyste, to nie używaj opacity, bo okno też Ci się takie zrobi... no chyba że zdefiniujesz kolor np. rgba(0,255,0, 0.5) - zielony przezroczysty 50%.

Co do kliknięcia poza okno i jego likwidacji, gdzieś na stronce jquery4u.com widziałem rozwiązanie, że wystarczy dać $('html').click ..... i wywołać akcję dla zamknięcia okna. Testowałem i działa. Aha... jest jeszcze jeden problem, oczywiście do obejścia.... jak klikniesz w samo okno, to też znika biggrin.gif Musisz dać coś takiego

  1. $('div.popup').click(function(event){
  2. event.stopPropagation();
  3. });


Zapobiegasz wówczas rozprzestrzenienia się akcji z kontenera na okienko: po dodaniu tego kodu i kliknięciu na kontener, okno zamknie się, po kliknięciu w sam popup - nie. Oczywiście w ogóle nie musisz ładować konterena, tylko dać np. <a href="">x</a> i ustawić go w prawym górnym rogu okna i ostylować odpowiednio.

PS. Do tego potrzebna Ci biblioteka jQuery
PS2. Możesz dograć jQueryUI do tego i zrobić tak:

  1. $(div.popup).draggable({handle: 'h1'});


Wtedy uruchomisz opcję przeciągania i upuszczania okna chwytając za pasek tytułu, tj. H1, ew. $(div.popup).draggable(); - daje Ci możliwość przeciągania okna, gdziekolwiek go chwycisz.

Sorki za bałagan w wypowiedzi, ale naprawdę na szybko napisałem.
Wishermil
Mimo wszystko dalej nie jestem w stanie stworzyć na podstawie tego okienka, które wyskoczy po kliknięciu w link. Wydaje mi się, że kod AJAX jest błędnie napisany. Zresztą nawet nie widzę w nim żadnego odniesienia do "diva", czy zawiązywania polecenia wyświetlenia okna. Myślę, że niepotrzebnie to tak mocno rozbudowałeś. Zależy mi na poznaniu samej struktury, bez żadnych konkretnych opcji z omówieniem poszczególnych linii kodu.
Kostek.88
Nie sadze bym to za bardzo rozbudowal, to jest raczej minimum jakie mozna zrobic, na pewno nie ma zmiany rozmiaru okienka i innych funkcji, ktore moglyby sie przydac. Co do wyswietlenia okienka to pewnie, ze zrobilem blad... powinno byc...


  1. $(document).ready(function(){
  2. $('a.link').click(function(){
  3. $.ajax({
  4. type: 'POST', // lub GET
  5. success: function(data) {
  6. $('body').load(sciezka); // mozesz tu dac drugiego AJAXa, bo load to skrocona forma
  7. },
  8. beforeSend: function(){
  9. // tutaj mozesz wstawic loader
  10. },
  11. error: function(){
  12. $('body').load(sciezka); // mozesz tu dac drugiego AJAXa, bo load to skrocona forma
  13. }
  14. });
  15. });
  16.  
  17. });?


Tutaj masz przykladowy kod samego okienka

http://jsfiddle.net/kostek/rL6Um/2/ - kod do samego okienka z draggable (edit: nie zapomnij, ze ten kod ma byc umieszony w osobnym pliku, ktory potem ladujesz przez AJAX)

I masz strukture i pole manewru do dalszej rozbudowy, zreszta pamietaj ze zamiast load mozesz wstawic nastepna funkcje ajax i na success ustawic 'body' jako Twoje odwolanie do diva. Dlaczego body? Bo najprosciej jest dolaczyc gotowy kod do body zamiast generowac niepotrzebne divy.

EDIT: ew. uzyc jQuery UI modal box... masz dosc duzo opcji konfiguracji, ale malo pole manewru jesli chodzi o zmiany.
Wishermil
Świetnie, teraz wszystko już mi się rozjaśniło. Dzięki wielkie za zaangażowanie i pomoc. wink.gif
Kostek.88
Spoko, w razie czego nie bój sie pytać wink.gif
viking
Ja ci jeszcze jeden link podrzucę http://www.paulrhayes.com/experiments/modal/
O ile nie przeszkadza brak obsługi poniżej IE9 można to teraz zrobić bez JS.
Kostek.88
Dobry artykuł smile.gif Dzięki wielkie, to i ja skorzystam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.