Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >

lukasz1985
Napisane: 5.12.2015, 17:29:28





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Stwórz metode publiczną "reset", czyszczącą stan obiektu i wywołuj ją zawsze po wywołaniu zapytania (czyli np w ciele metody "get", albo ręcznie z kodu klienckiego).

@Daimos
Co ma być raz? Chyba nie wywołanie metod obiektu, co?
  Forum: PHP · Podgląd postu: #1178220 · Odpowiedzi: 3 · Wyświetleń: 480

lukasz1985
Napisane: 10.05.2015, 10:23:07





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Myślę, że to byłoby bardziej praktyczne, gdyby nie trzeba było się tyle przemieszczać między stronami. Struktura widoków powinna odzwierciedlać dziennik, natomiast tutaj jest takie ciągłe skakanie pomiędzy tabelami. Jedna syntetyczna tabela powinna wystarczyć dla widoku ocen całej klasy ze wszystkich przedmiotów. Z resztą pewnie już sam do tego doszedłeś.
  Forum: Oceny · Podgląd postu: #1157504 · Odpowiedzi: 11 · Wyświetleń: 2 285

lukasz1985
Napisane: 5.02.2014, 21:26:13





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Zerknij na to (to samo posłałem Ci w paczce na priv, a nie chcę się poprawiać setny raz smile.gif ):

http://jsfiddle.net/aJaDJ/1/
  Forum: JavaScript · Podgląd postu: #1089746 · Odpowiedzi: 3 · Wyświetleń: 371

lukasz1985
Napisane: 5.02.2014, 17:28:25





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Musisz zresetować wartości pól select do 1.

[JAVASCRIPT] pobierz, plaintext
  1. function podmiana(co) {
  2. reset();
  3.  
  4. var ile = document.getElementById("id_kategoria").options.length;
  5. for (var i = 1; i <= ile; i++) {
  6. var ktora = "w" + i;
  7. if (ktora == co) {
  8. document.getElementById(ktora).style.display = "block";
  9. } else if (ktora != co) {
  10. document.getElementById(ktora).style.display = "none";
  11. }
  12. }
  13. }
  14.  
  15.  
  16.  
  17.  
  18. /**
  19.   * Comment
  20.   */
  21. function reset() {
  22. document.getElementById("autobus").value = 1;
  23. document.getElementById("dostawczy").value = 1;
  24. }
  25.  
  26.  
[JAVASCRIPT] pobierz, plaintext
  Forum: JavaScript · Podgląd postu: #1089721 · Odpowiedzi: 3 · Wyświetleń: 371

lukasz1985
Napisane: 18.01.2014, 22:37:05





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Jednak powinno to być trochę inaczej bo mieszają się znaki cudzysłowia i najprawdopodobniej wyskakuje błąd. Trzeba z tego kodu wyszukiwarki wyciąć to, co znajduje się w znacznikach <script> </script>, rezultat powinien wyglądać niej więcej tak:

To co ma być w HTMLu, style, wiadomo, można umieścić w nagłówku:

  1.  
  2. <div id="wyszukiwarkaGoogle">
  3. <div id='cse' style="width:37.3%; position:absolute; top:180px; left:72px;">Loading</div>
  4.  
  5. <script src='//www.google.com/jsapi' type='text/javascript'></script>
  6.  
  7. </div>
  8.  
  9. <style type='text/css'>
  10.  
  11. .gsc-control-cse {
  12.  
  13. font-family: Arial, sans-serif;
  14.  
  15. border-color: #FFFFFF;
  16.  
  17. background-color:#F0E7D6;
  18.  
  19. padding:0px 0px 0px 0px;
  20.  
  21. background:none;
  22.  
  23. border:none;
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31. }
  32.  
  33. .gsc-control-cse .gsc-table-result {
  34.  
  35. font-family: Arial, sans-serif;
  36.  
  37. }
  38.  
  39. input.gsc-input, .gsc-input-box, .gsc-input-box-hover, .gsc-input-box-focus {
  40.  
  41. border-color: #D9D9D9;
  42.  
  43. }
  44.  
  45. input.gsc-search-button, input.gsc-search-button:hover, input.gsc-search-button:focus {
  46.  
  47. border-color: #666666;
  48.  
  49. background-color: #F0E7D6/*#CECECE*/;
  50.  
  51. background-image: none;
  52.  
  53. /*background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#5b4636), to(#7d6957));
  54.  
  55. background-image: -webkit-linear-gradient(top, #5b4636, #7d6957);
  56.  
  57. background-image: -moz-linear-gradient(top, #5b4636, #7d6957);
  58.  
  59. background-image: -ms-linear-gradient(top, #5b4636, #7d6957);
  60.  
  61. background-image: -o-linear-gradient(top, #5b4636, #7d6957);
  62.  
  63. filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5b4636', endColorstr='#7d6957');*/
  64.  
  65. /* filter: none;*/
  66.  
  67.  
  68.  
  69.  
  70.  
  71. }
  72.  
  73. .gsc-tabHeader.gsc-tabhInactive {
  74.  
  75. border-color: #FF9900;
  76.  
  77. background-color: #ffffff;
  78.  
  79. }
  80.  
  81. .gsc-tabHeader.gsc-tabhActive {
  82.  
  83. border-color: #E9E9E9;
  84.  
  85. background-color: #E9E9E9;
  86.  
  87. border-bottom-color: #FF9900
  88.  
  89. }
  90.  
  91. .gsc-tabsArea {
  92.  
  93. border-color: #FF9900;
  94.  
  95. }
  96.  
  97. .gsc-webResult.gsc-result, .gsc-results .gsc-imageResult {
  98.  
  99. border-color: #FFFFFF;
  100.  
  101. background-color: #FFFFFF;
  102.  
  103. }
  104.  
  105. .gsc-webResult.gsc-result:hover, .gsc-imageResult:hover {
  106.  
  107. border-color: #FFFFFF;
  108.  
  109. background-color: #FFFFFF;
  110.  
  111. }
  112.  
  113. .gs-webResult.gs-result a.gs-title:link, .gs-webResult.gs-result a.gs-title:link b, .gs-imageResult a.gs-title:link, .gs-imageResult a.gs-title:link b {
  114.  
  115. color: #0000CC;
  116.  
  117. }
  118.  
  119. .gs-webResult.gs-result a.gs-title:visited, .gs-webResult.gs-result a.gs-title:visited b, .gs-imageResult a.gs-title:visited, .gs-imageResult a.gs-title:visited b {
  120.  
  121. color: #0000CC;
  122.  
  123. }
  124.  
  125. .gs-webResult.gs-result a.gs-title:hover, .gs-webResult.gs-result a.gs-title:hover b, .gs-imageResult a.gs-title:hover, .gs-imageResult a.gs-title:hover b {
  126.  
  127. color: #0000CC;
  128.  
  129. }
  130.  
  131. .gs-webResult.gs-result a.gs-title:active, .gs-webResult.gs-result a.gs-title:active b, .gs-imageResult a.gs-title:active, .gs-imageResult a.gs-title:active b {
  132.  
  133. color: #0000CC;
  134.  
  135. }
  136.  
  137. .gsc-cursor-page {
  138.  
  139. color: #0000CC;
  140.  
  141. }
  142.  
  143. a.gsc-trailing-more-results:link {
  144.  
  145. color: #0000CC;
  146.  
  147. }
  148.  
  149. .gs-webResult .gs-snippet, .gs-imageResult .gs-snippet, .gs-fileFormatType {
  150.  
  151. color: #000000;
  152.  
  153. }
  154.  
  155. .gs-webResult div.gs-visibleUrl, .gs-imageResult div.gs-visibleUrl {
  156.  
  157. color: #008000;
  158.  
  159. }
  160.  
  161. .gs-webResult div.gs-visibleUrl-short {
  162.  
  163. color: #008000;
  164.  
  165. }
  166.  
  167. .gs-webResult div.gs-visibleUrl-short {
  168.  
  169. display: none;
  170.  
  171. }
  172.  
  173. .gs-webResult div.gs-visibleUrl-long {
  174.  
  175. display: block;
  176.  
  177. }
  178.  
  179. .gs-promotion div.gs-visibleUrl-short {
  180.  
  181. display: none;
  182.  
  183. }
  184.  
  185. .gs-promotion div.gs-visibleUrl-long {
  186.  
  187. display: block;
  188.  
  189. }
  190.  
  191. .gsc-cursor-box {
  192.  
  193. border-color: #FFFFFF;
  194.  
  195. }
  196.  
  197. .gsc-results .gsc-cursor-box .gsc-cursor-page {
  198.  
  199. border-color: #E9E9E9;
  200.  
  201. background-color: #FFFFFF;
  202.  
  203. color: #0000CC;
  204.  
  205. }
  206.  
  207. .gsc-results .gsc-cursor-box .gsc-cursor-current-page {
  208.  
  209. border-color: #FF9900;
  210.  
  211. background-color: #FFFFFF;
  212.  
  213. color: #0000CC;
  214.  
  215. }
  216.  
  217. .gsc-webResult.gsc-result.gsc-promotion {
  218.  
  219. border-color: #336699;
  220.  
  221. background-color: #FFFFFF;
  222.  
  223. }
  224.  
  225. .gsc-completion-title {
  226.  
  227. color: #0000CC;
  228.  
  229. }
  230.  
  231. .gsc-completion-snippet {
  232.  
  233. color: #000000;
  234.  
  235. }
  236.  
  237. .gs-promotion a.gs-title:link,.gs-promotion a.gs-title:link *,.gs-promotion .gs-snippet a:link {
  238.  
  239. color: #0000CC;
  240.  
  241. }
  242.  
  243. .gs-promotion a.gs-title:visited,.gs-promotion a.gs-title:visited *,.gs-promotion .gs-snippet a:visited {
  244.  
  245. color: #0000CC;
  246.  
  247. }
  248.  
  249. .gs-promotion a.gs-title:hover,.gs-promotion a.gs-title:hover *,.gs-promotion .gs-snippet a:hover {
  250.  
  251. color: #0000CC;
  252.  
  253. }
  254.  
  255. .gs-promotion a.gs-title:active,.gs-promotion a.gs-title:active *,.gs-promotion .gs-snippet a:active {
  256.  
  257. color: #0000CC;
  258.  
  259. }
  260.  
  261. .gs-promotion .gs-snippet, .gs-promotion .gs-title .gs-promotion-title-right, .gs-promotion .gs-title .gs-promotion-title-right * {
  262.  
  263. color: #000000;
  264.  
  265. }
  266.  
  267. .gs-promotion .gs-visibleUrl,.gs-promotion .gs-visibleUrl-short {
  268.  
  269. color: #008000;
  270.  
  271. }
  272.  
  273.  
  274.  
  275.  
  276.  



natomiast to ma być osobno, najlepiej w nagłówku:


  1.  
  2. <script type="text/javascript">
  3.  
  4.  
  5. var searchBarLoadListener = function() {
  6. google.load('search', '1', {language: 'pl', style: google.loader.themes.V2_DEFAULT});
  7.  
  8. google.setOnLoadCallback(function() {
  9.  
  10. var customSearchOptions = {};
  11.  
  12. var orderByOptions = {};
  13.  
  14. orderByOptions['keys'] = [{label: 'Relevance', key: ''} , {label: 'Date', key: 'date'}];
  15.  
  16. customSearchOptions['enableOrderBy'] = true;
  17.  
  18. customSearchOptions['orderByOptions'] = orderByOptions;
  19.  
  20. customSearchOptions['overlayResults'] = true;
  21.  
  22. var customSearchControl = new google.search.CustomSearchControl('011599289272865291231:-i9dlxieymi', customSearchOptions);
  23.  
  24. customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
  25.  
  26. var options = new google.search.DrawOptions();
  27.  
  28. options.setAutoComplete(true);
  29.  
  30. customSearchControl.draw('cse', options);
  31.  
  32. }, true);
  33.  
  34. }
  35.  
  36.  
  37.  
  38. var isIE = window.attachEvent;
  39.  
  40. if (isIE) {
  41.  
  42. (window.attachEvent("onload", searchBarLoadListener));
  43.  
  44. }
  45.  
  46. else {
  47.  
  48. (window.addEventListener("load", searchBarLoadListener));
  49.  
  50. }
  51.  
  52.  
  53.  
  54.  



Mam nadzieje, że pomoże.
  Forum: Po stronie przeglądarki · Podgląd postu: #1086107 · Odpowiedzi: 7 · Wyświetleń: 590

lukasz1985
Napisane: 21.01.2014, 15:58:47





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Może zacznę od tego:

3. jak pewnie zauważyłeś, najpierw pobieram kod HTML contentu, wprowadzam do niego wartości, a następnie content wprowadzam do ogólnego zarysu strony - można to zrobić prościej? ale w ten sposób, abym mógł szybko zmieniać kod HTML w jednym miejscu

Właśnie widzisz, jest smile.gif

Polega to na tym, że pobierasz najpierw jeden widok z jakimiś tam zmiennymi i zapisujesz go do innej zmiennej:

  1. // Posługując sie Twoją klasą "ViewLoader"
  2. $loader = new ViewLoader();
  3. $parametry = array(.. tu jakieś parametry ...);
  4. $tresc = $loader->load("strona", $parametry);


I przesłaniu jej jako parametr przy ładowaniu innej strony:

  1. // Kontynuacja...
  2.  
  3. $szablon = $loader->load("szablon", array("strona" => $tresc));
  4. echo $szablon;


EDIT: Zauważ, że możesz w ten sposób zagnieżdżać w sobie fragmenty HTMLa jak tylko chcesz. Po prostu pobierasz szablon do jednej zmiennej i tą zmienną przesyłasz jako parametr przy ładowaniu
innego szablonu. Z kolei ten szablon znów możesz wykorzystać przy ładowaniu kolejnego szablonu, i tak w kółko.
Zauważ też, że możesz załadować kilka plików HTMLi i potem przy ładowaniu głownego szablonu wykorzystać je jako poszczególne elementy na stronie:

  1. // Posługując sie Twoją klasą "ViewLoader"
  2.  
  3. $loader = new ViewLoader();
  4. $naglowek = $loader->load("naglowek");
  5. $stopka = $loader->load("stopka");
  6. $parametry = array(
  7. "naglowek" => $naglowek,
  8. "stopka" => $stopka
  9. );
  10.  
  11. $strona = $loader->load("strona", $parametry);



Co do reszty...robisz to trochę naopak. Najpierw ładujesz kontroler i w nim parsujesz zmienne zapytania GET, POST i tam odczytujesz sesje itp.
Chodzi o to, żeby to zrobić odwrotnie - na podstawie zmiennych zapytania - określić który kontroler załadować.

  Forum: Object-oriented programming · Podgląd postu: #1086578 · Odpowiedzi: 17 · Wyświetleń: 3 842

lukasz1985
Napisane: 16.01.2014, 23:51:11





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Natomiast, jeśli chodzi o ładowanie widoków z zewnętrznych plików z HTML'em to sprawa wygląda tak, że mam następującą klasę:

  1. class Widok {
  2.  
  3. public function pobierz($sciezka, $zmienne = array()) {
  4. // Załadowanie zmiennych z tablicy $zmienne
  5. extract($zmienne);
  6.  
  7. include $sciezka;
  8. $tresc = ob_get_contents();
  9.  
  10. return $tresc;
  11. }
  12.  
  13. public function wyswietl($nazwa, $zmienne = array()) {
  14. echo $this->pobierz($nazwa, $zmienne);
  15. }
  16.  
  17.  
  18. }



i teraz gdybym miał taki plik HTML "przyklad.html":

  1. Dzisiaj jest: <br>
  2. <?php echo $data; ?>
  3.  
  4. A oto komunikat: <br>
  5. <?php echo $komunikat; ?>
  6.  
  7. </body>
  8. </html>
  9.  



to mógłbym zrobić w swoim kodzie coś takiego:
  1. $widok = new Widok();
  2. $zmienne = array("data" => "19.02.2014", "komunikat" => "Witaj swiecie");
  3.  
  4. $widok->wyswietl("przyklad.html", $zmienne);
  5.  


.. i uzyskałbym w rezultacie html, w którym odpowiednie zmienne zostały wypełnione danymi z tablicy $zmienne:

  1. Dzisiaj jest: <br>
  2. 19.02.2014
  3.  
  4. A oto komunikat: <br>
  5. Witaj swiecie
  6.  
  7. </body>
  8. </html>
  9.  



Oczywiście to jest dość prosty model takiego systemu. Weź pod uwagę, ze te widoki można zagnieżdzać w sobie używając metody "pobierz" klasy Widok, która zwraca sparsowany HTML, który z kolei można włożyć do innej tablicy i znów użyć jako parametru aby wyswietlić inny widok.


Na temat metody "pobierz":

To co wymaga pewnej uwagi to funkcja "extract" w metodzie "pobierz". Co ona robi? Zamienia klucze tablicy na nazwy zmiennych, przykład:

  1. $arr = array("a" => 5, "b" => 10);
  2. extract ($arr);
  3. echo $a; // wypisze 5.
  4.  


Kolejno widzisz


ta linia powoduje uruchomienia buforowania wyjścia - oznacza to, ze cokolwiek, co "zaincludujesz" nie zostanie od razu wypisane na ekranie. A includowane są po prostu pliki html ze wstawkami kodu php (jak w przykładzie z plikiem "przyklad.html". Pod te zmienne w includowanych plikach wstawiane są wartości (kod php jest parsowany) ale zawartość, jak już powiedziałem, nie jest wyświetlana, ale zapisywana w buforze.

I tutaj pojawia się funkcja

jej zadanie jest dość proste - zwraca wszystko co jest w buforze.

Na końcu wyłączam buforowanie wyjścia i czyszczę bufor


i zwracam zwartość zapisaną do zmiennej "tresc"



Wybacz ale na dzisiaj tyle, jestem już zmęczony. Cieszę sie, że ten temat Ci pomógł smile.gif
  Forum: Object-oriented programming · Podgląd postu: #1085784 · Odpowiedzi: 17 · Wyświetleń: 3 842

lukasz1985
Napisane: 16.01.2014, 23:20:03





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

No więc tak...

Co do nazw metod - znacznie lepiej.
Pozostaje nazwa pliku "view.php", która powinna brzmieć "page.php" albo klasa "Page" powinna otrzymać nazwę "View". Osobiście wolałbym żeby w rezultacie mieć klasę "View" w pliku "view

.php"

Masz problemy z nadawaniem właściwych, ścisłych i jednoznacznych nazw i to trochę jest gubiące.
  1.  
  2. include('info.php'); // funkcje dla modułu
  3.  
  4. include('info_theme.php'); // wizualizacja modułu
  5.  
  6. include('view.php'); // wizualizacja całej strony
  7.  
  8.  
  9. /////// dobzre jest robić nawiasy przy inicjalizacji nowych obiektów
  10. //$info = new Info;
  11. $info = new Info();
  12.  
  13. $info->id = 1; // wartość będzie pobierana z $_GET
  14.  
  15. $info->countInput();
  16. ////// niepotrzebnie przypisujesz ten sam obiekt do nowej zmienne
  17. //$params = $info->prepare(); // mogłoby być po prostu $info->prepare();
  18. $info->prepare();
  19.  
  20. ///// czemu $content, a nie $theme ?
  21. //$content = new InfoTheme; // umieszczanie wyciągniętych informacji z bazy do wizualizacji modułu
  22. $theme = new InfoTheme();
  23.  
  24. ///// znów nazwa sugerująca coś innego - metoda nie powinna się nazywać "get" albo, lepiej "load"?
  25. //$page_content = $theme->show($info);
  26. $page_content = $theme->load($info);
  27.  
  28.  
  29. $page = new Page;
  30.  
  31. $page->meta_title = 'konkretny tytul';
  32.  
  33. $page->theme = 'one';
  34.  
  35. $page->content = $page_content;
  36.  
  37. echo $page->show();




Trochę zbędne wydaje mi się tworzenie osobnych klas dla widoku i "theme'u". Osobny widok powinien być osobną formą
reprezentacji informacji.

  Forum: Object-oriented programming · Podgląd postu: #1085779 · Odpowiedzi: 17 · Wyświetleń: 3 842

lukasz1985
Napisane: 16.01.2014, 22:30:23





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Tam jest literówka. Chodzi o to, ze mając klasę "Info" nie trzymał jej w pliku o nazwie "info_functions.php" tylko w pliku o nazwie "Info.php".

Natomiast, jeśli będziesz trzymał kod PHP w funkcjach i zwracał tak jak w przypadku klasy "page" i metody "PageStart" to będziesz miał problemy później z edycją kodu HTML w programach do edycji HTML'a. Poza tym trochę nie odpowiada to modelowi MVC bo trzymasz logikę i widok w klasie, zamiast podzielić kod wyświetlający od kodu wyświetlanego. Ja swoim frameworku zrobiłem to tak:

  1. // Pobiera widok dla określonego modułu, który później jest wyświetlany echem: echo $this->pobierz($modul, $zmienne);
  2. public function pobierz($nazwa, $zmienne = array()) {
  3. extract($zmienne); // Zamienia klucze tablicy na zmienne, które będą widoczne w zaraz "includowanym" pliku widoku.
  4. include $this->modul . $nazwa . '.php';
  5. $widok = ob_get_contents();
  6.  
  7. return $widok;
  8. }





Reszty za bardzo się doczytać nie mogę - tutaj jeszcze uwaga odnośnie nazewnictwa metod - powinny one być czasownikami w trybie rozkazującym, a nie rzeczownikami.

Co do wydajności powiedzieć trzeba, że na tym etapie to nie ma większego znaczenia. Zagadnienia cacheowania, które w PHP są głównym tematem optymalizacji stają się istotne w późniejszych etapach rozwoju systemu natomiast pisanie wydajnych algorytmów to w PHP temat prawie nieobecny chyba, że ktoś robi coś naprawdę głupiego.

Popraw kod tak, żeby dało się go ogarnąć to spróbuję powiedzieć coś więcej.
  Forum: Object-oriented programming · Podgląd postu: #1085764 · Odpowiedzi: 17 · Wyświetleń: 3 842

lukasz1985
Napisane: 16.01.2014, 21:52:03





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

ad2. Ciężko się to czyta. Z kilku powodów:

- lepiej gdybyś nazywał pliki z klasami tak według nazwy klasy np w "Info.php" klasa "Info"
- nie ma potrzeby ponawiać w nazwach metody nazwy klasy - nie "Page->ShowPage", wystarczy "Show"
- preferuję Javowy styl nazewnictwa (interCaps) - pierwsze słowa w nazwach metod i zmiennych od małej litery czli "show", a nie "Show" natomiast nazwy klas z dużej (CamelCaps) - nie jest to rzecz jasna obowiązkowe.

Nie powinieneś zwracać kodu HTML tak jak to robisz. Lepiej gdybyś ładował szablony z plików HTML i wyświetał używając buforowania wyjścia (output buffering).

  Forum: Object-oriented programming · Podgląd postu: #1085751 · Odpowiedzi: 17 · Wyświetleń: 3 842

lukasz1985
Napisane: 6.01.2014, 21:01:08





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Pisz nazwy zmiennych z małej litery, a rozwiązanie najprostsze wygląda tak:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2.  
  3. var tablica = new Array('Marcin', 'Ania', 'Agnieszka','Ania');
  4.  
  5. var liczba = 0;
  6. for(var i = 0 ; i < tablica.length; i++ ) {
  7. if (tablica[i] == "Ania") {
  8. liczba++
  9. }
  10. }
  11.  
  12. // po wyjściu z pętli liczba = 2
  13. alert(liczba)
[JAVASCRIPT] pobierz, plaintext
  Forum: JavaScript · Podgląd postu: #1083902 · Odpowiedzi: 2 · Wyświetleń: 272

lukasz1985
Napisane: 30.12.2013, 22:36:57





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Odpowiedź na Twoje pytanie jest dość prosta. Otóż tworząc z poziomu JavaScript tag "script" i ustawiając jego źródło informujesz tym samym przeglądarkę, że ma wykonać kolejne zapytanie pod podane źródło, a więc robiąc tak:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. var js = ddocument.createElement("script");
  3. js.src = "iframe.js";
  4. document.body.appendChild(js);
  5. user.setAccount("213");
[JAVASCRIPT] pobierz, plaintext


przeglądarka zacznie wgrywać nowy adres, w tym przypadku plik skryptu znajdującego się pod ścieżką "iframe.js".

Tak się składa, że nie dzieje się to natychmiast, a ładowanie następuje asynchronicznie, w tle, tak jak w przypadku XHR (XmlHttpRequest, czy krócej "AJAX"). Oznacza to, że zmienna "user" zdefiniowana w tamtym pliku nie pojawi się natychmiast, a dopiero po wykonaniu całego procesu: pobrania pliku js i wrzucenia go w dokument.

Aby wykonać kod po załadowaniu tego dokumentu należy się posłużyć funkcją zwrotną ("callback'iem"):


[JAVASCRIPT] pobierz, plaintext
  1.  
  2. var js = ddocument.createElement("script");
  3. js.src = "iframe.js";
  4. document.body.appendChild(js);
  5.  
  6. js.onload = function() {
  7. user.setAccount("213");
  8. }
  9.  
[JAVASCRIPT] pobierz, plaintext
  Forum: JavaScript · Podgląd postu: #1082854 · Odpowiedzi: 5 · Wyświetleń: 439

lukasz1985
Napisane: 30.12.2013, 12:07:02





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

[JAVASCRIPT] pobierz, plaintext
  1. function(d,s){
  2.  
  3. var js,jsr = d.getElementsByTagName(s)[0];
  4.  
  5. js = d.createElement(s);
  6.  
  7. js.src = '//www.mojadomena.pl/js/iframe.js';
  8.  
  9. jsr.parentNode.insertBefore(js,jsr);
  10.  
  11. }(document,'script')); // Zupełnie nie potrzebne
  12.  
[JAVASCRIPT] pobierz, plaintext



[JAVASCRIPT] pobierz, plaintext
  1. function(){
  2.  
  3. var js,jsr = document.getElementsByTagName(s)[0];
  4.  
  5. js = document.createElement("script");
  6.  
  7. js.src = '//www.mojadomena.pl/js/iframe.js';
  8.  
  9. jsr.parentNode.insertBefore(js,jsr);
  10.  
  11. }();
  12.  
[JAVASCRIPT] pobierz, plaintext



Poza tym proponowałbym - zamiast używania anonimowych funkcji do korzystania z "przestrzeni nazw":

[JAVASCRIPT] pobierz, plaintext
  1. var mojmodul = {};
  2. mojmodul.zrobCos = function(){
  3.  
  4. var js,jsr = document.getElementsByTagName(s)[0];
  5.  
  6. js = document.createElement("script");
  7.  
  8. js.src = '//www.mojadomena.pl/js/iframe.js';
  9.  
  10. jsr.parentNode.insertBefore(js,jsr);
  11.  
  12. };
  13.  
  14. mojmodul.zrobCos();
  15.  
[JAVASCRIPT] pobierz, plaintext



Anonimowe funkcje są fajne - dla małych fragmentów kodu - przynajmniej takie moje zdanie po tym jak potrafią one namieszać w kodzie, który w ostateczności staje się jednym wielkim śmietnikiem. Moduły w dużym stopniu elminują konieczność ich używania jeśli chodzi o moduły. W kodzie czysto obiektowym potrzebne jest już zupełnie inne podejście do tematu.
  Forum: JavaScript · Podgląd postu: #1082731 · Odpowiedzi: 5 · Wyświetleń: 439

lukasz1985
Napisane: 18.12.2013, 09:51:05





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Myślę, że można też tak:

[JAVASCRIPT] pobierz, plaintext
  1. var liczba = 2141.23141
  2. var dokladnosc = 0.01
  3. var rezultat1 = lliczba - lliczba % dokladnosc + dokladnosc; // zaokrąglanie w dół
  4. var rezultat2 = liczba - liczba % dokladnosc + dokladnosc; // zaokrąglanie w dol
[JAVASCRIPT] pobierz, plaintext


  Forum: Po stronie przeglądarki · Podgląd postu: #1081034 · Odpowiedzi: 2 · Wyświetleń: 357

lukasz1985
Napisane: 11.12.2013, 13:27:11





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Mała sugestia: nie wywołuj HTML'a przez "echo" w PHP bo to wygląda strasznie i jest kompletnie nieprawidłowe dla programów podświetlających składnię.

Nie rób tak:

  1. <?php echo "<tr><td>Tutaj coś" . $zmienna . "</td></tr>"; ?>


tylko tak:

  1. <tr><td>Tutaj coś <?php echo $zmienna; ?> </td></tr>


Tak samo z pętlami, możesz zrobić:

  1. <?php for($i = 0; $i < $costam ; $i++): ?>
  2.  
  3. <tr><td><?php echo $i; ?></td></tr>
  4.  
  5. <?php endfor; ?>
  6.  


I o pomoc Ci będzie łatwiej.




Cytat
  1. <button onClick=$("#potwierdzenie").submit()>

Mogę liczyć na jakieś wskazówki?


Znów masz odwołanie tylko do pierwszego elementu o id "potwierdzenie" ($("#potwierdzenie")). Wskazówki:
Ja to robiłem w ten sposób, że elementowi, który ma przypisane zdarzenie nadawałem id w formie "nazwa_numer", np "formularz_3", "submit_3" a w JSie dzieliłem string id na dwa substringi: "submit" i "3" poprzez metodę split();

Kod wynikowy wyglądał mniej więcej tak:

  1. <?php for ($i = 0; $i < 10; $i++): ?>
  2. <form id="formularz_<?php echo $i ?>" action="wyslane.php" method="POST">
  3. <div class="submit" id="submit_<?php echo $i ?>">
  4. Wyslij ten formularz
  5. </div>
  6. </form>
  7. <?php endfor ?>



[JAVASCRIPT] pobierz, plaintext
  1. <script type="text/javascript">
  2. $(".submit").click(function(element) {
  3. var id = $(this).attr("id"); // Pobranie id elementu
  4. var numer = id.split("_")[1]; // Kluczowy punkt - dzielenie stringu id
  5.  
  6.  
  7. var wyslac = confirm("Wysłać?");
  8. if(wyslac) {
  9. $("#formularz_" + numer).submit(); // Wysłanie właściwego formularza
  10. }
  11. })
  12. </script>
[JAVASCRIPT] pobierz, plaintext
  Forum: JavaScript · Podgląd postu: #1079937 · Odpowiedzi: 6 · Wyświetleń: 471

lukasz1985
Napisane: 8.12.2013, 22:01:57





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Różni się w jednym zasadniczym aspekcie: renderowanie czcionek. Kiedy jeszcze siedziałem na linuxie, a było to jakieś 2-3 m-ce temu były z tym wielkie problemy, z dwóch względów.
Po pierwsze brak tych samych czcionek co w systemach MS. Można je doinstalować ale nie jest to takie proste dla początkującego.
Po drugie - antyaliasing i filtrowanie pikseli daje zupełnie inne efekty niż pod Windowsem. Jak na mój gust czcionki renderowane w linuxie są okropne i nic z tym nie da się zrobić.

Reszta wygląda właściwie, a przynajmniej ja się niczego nie dopatrzyłem.

EDIT: Zapomniałem zaznaczyć, że sposób renderowania wpływa w wielu miejscach na łamanie linii ponieważ wydłuża słowa. Miałem wiele problemów z tym aby tekst nie łamał się na linuxie.
  Forum: Po stronie przeglądarki · Podgląd postu: #1079504 · Odpowiedzi: 6 · Wyświetleń: 953

lukasz1985
Napisane: 26.11.2013, 20:21:03





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Tak, ręcznie, nie ma innej opcji, chyba, że jesteś specjalistą od sieci neuronowych i rozpoznawania obrazów.
  Forum: Po stronie przeglądarki · Podgląd postu: #1077546 · Odpowiedzi: 4 · Wyświetleń: 417

lukasz1985
Napisane: 22.09.2013, 13:39:31





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Wygląda na to jednak, że tego nie można zrobić:

http://stackoverflow.com/questions/6063522...ry-beforeunload

Jedynym rozwiązniem jest użycie tego co już masz z tym, że musiałbyś podać informację (prośbę) o to, żeby użytkownik pozostał na stronie i wypełnił ankietę / dał odpowiedź na powód dla którego opuszcza stronę:

W kodzie wyglądałoby by to tak:


  1. <!DOCTYPE html>
  2. <meta charset="UTF-8">
  3. <title>Insert title here</title>
  4.  
  5.  
  6. <script type="text/javascript"
  7. src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
  8.  
  9. <script type="text/javascript" src="/jquery.fancybox.js"></script>
  10. </head>
  11.  
  12.  
  13. <script type="text/javascript">
  14. var inFormOrLink;
  15. //$('a').live('click', function() { inFormOrLink = true; });
  16. //$('form').bind('submit', function() { inFormOrLink = true; });
  17.  
  18. $(window)
  19. .bind(
  20. "beforeunload",
  21. function(event) {
  22.  
  23. //JAK W TYM PRZYPADKU ODPALIĆ FANCYBOXA PO ZWRÓCENIU FALSE?
  24. var newslettfancy = '<div><p><strong>Siemano działa fancybox</strong></p></div>';
  25. $.fancybox(newslettfancy, {
  26. 'autoDimensions' : false,
  27. 'width' : 500,
  28. 'height' : 'auto',
  29. 'transitionIn' : 'none',
  30. 'transitionOut' : 'none',
  31. 'padding' : 5,
  32. helpers : {
  33. overlay : {
  34. closeClick : false
  35. }
  36. }
  37. });
  38.  
  39. // Tutaj się wyświetli okno dialogowe przeglądarki.
  40. return "Czy chciałby Pan/i podać powód rezygnacji ze strony? Prosimy pozostać na stronie, jeśli tak."; // Tutaj
  41.  
  42. // Jeśli odpowiedź będzie pozytywna wyświetli się fancybox
  43. });
  44. </script>
  45.  
  46.  
  47. </body>
  48. </html>
  49.  

  Forum: Po stronie przeglądarki · Podgląd postu: #1066673 · Odpowiedzi: 6 · Wyświetleń: 2 026

lukasz1985
Napisane: 20.09.2013, 16:22:45





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

http://stackoverflow.com/questions/1631959...e-event#1632004
  Forum: Po stronie przeglądarki · Podgląd postu: #1066407 · Odpowiedzi: 6 · Wyświetleń: 2 026

lukasz1985
Napisane: 12.09.2013, 16:06:57





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Ja bym nie robił takich rzeczy z definicjami zmiennych jak wymienianie ich po przecinku w sytuacji gdy przypisuje się do nich wartości z funkcji.
Coś takiego wygląda tylko wtedy, kiedy wchodzi w rachubę proste przypisanie wartości albo same deklaracje:
[JAVASCRIPT] pobierz, plaintext
  1. var zmienna, string, tekst, pole, div;
[JAVASCRIPT] pobierz, plaintext

[JAVASCRIPT] pobierz, plaintext
  1. var zmienna = 2 , string = "Witaj świecie", tekst, pole, div;
[JAVASCRIPT] pobierz, plaintext


Chociaż i tego rzadko używam bo w programowaniu obowiązuje zasada - deklaruje zmienne jak najbliżej miejsca w którym zostaną użyte.

Kolejną rzeczą, która mi się rzuca w oczy - w JS zazwyczaj nie używa się nazw obiektów z dużej litery - "SlideMenu" jest źle, powinno być "slideMenu". Duże litery są pozostawione dla klas (a w JS to się nazywa konstruktor).

Zauważ też, że "show.parent().hide()" i "show.parent().show()" wygląda idiotycznie smile.gif Może znalazłyby się lepsze nazwy dla zmiennych "show" i "hide" ?

Dla zaawansowanych: Nie chce mi się przepisywać Twojego kodu ale - funkcje anonimowe, które podajesz w $.click są na tyle rozbudowane, że możnaby im nadać osobne nazwy i odwołać sie do nich w innych polach obiektu "slideMenu", a w init zrobić tylko obiekt.click(pokaz.bind(this));

Generalnie to wszystko to są takie igraszki dla efektu. Można dzięki temu, oczywiście zbudować sobie zaplecze elementów do ponownego użytku. Spróbuj jednak wymyślić sobie jakąś większa aplikację, która zmusiłaby Cię do tworzenia modułów i używania wzorców projektowych, jeśli chcesz poznać "smak prawdziwego programowania" (nie taki fajny swoją drogą tongue.gif).
  Forum: JavaScript · Podgląd postu: #1065037 · Odpowiedzi: 17 · Wyświetleń: 962

lukasz1985
Napisane: 10.09.2013, 19:45:42





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Funkcja requestAnimationFrame służy do robienia animacji tak jak setInterval i setTimeout, a jej plusem ma być to, że ma mieć lepszą wydajność od pozostałych. Piszę "ma" bo to implementacja(czyli jak ta funkcja rzeczywiście się działa) zależy od przeglądarki jednak postaram Ci się to wyjaśnić jak tej funkcji użyć, zakładając pewną (oczywistą) implementację przez przeglądarkę.

Załóżmy, że masz do zrobienia jakąś animację, na przykład masz DIVa, który będzie się rozszerzać. Jest kilka sposobów na to, możesz użyć:
- setTimeout
- setInterval, albo
- requestAnimationFrame

W przypadku dwóch pierwszych sprawa wygląda dość prosto, używając setTimeout robisz coś takiego (będę pisał z kilkoma uproszczenami) :
[JAVASCRIPT] pobierz, plaintext
  1. function poszerz() {
  2. div.style.width += 1; // poszerz diva o 1
  3. setTimeout(poszerz, 60); // wykonaj poszerz po 60 ms
  4. }
  5.  
  6. window.onload = function() {
  7. poszerz();
  8. }
[JAVASCRIPT] pobierz, plaintext


Włączasz okno przeglądarki - okno się ładuje, po załadowaniu wykonuje się poszerz(). Funkcja poszerz() na końcu wyznacza czas po którym znów ma sie wykonać (setTimeout) . Efekt jest taki, że funkcja się zapętla i wykonuje się co 60 ms

Używając setInterval wyznaczasz interwał (przerwy) pomiędzy wykonaniami tej samej funkcji:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. function poszerz() {
  3. div.style.width += 1; // poszerz diva o 1
  4. }
  5.  
  6.  
  7. window.onload = function() {
  8. setInterval(poszerz, 60); // Wykonuj poszerz co 60 ms.
  9. }
  10.  
[JAVASCRIPT] pobierz, plaintext


Program analogiczny do powyższego.

No i pora na requestAnimationFrame. Funkcja requestAnimationFrame (będę używał skrótu RAF) przyjmuje za argument tylko inną funkcję, a nie przyjmuje żadnych odstępów czasowych. Ktoś mógłby się zapytać, w jaki sposób w takim razie zrobić przy jej pomocy animację?
Otóż RAF nie działa tak jak setTimeout i setInterval. RAF powoduje że funkcja, którą jej prześlemy wywoła się w momencie najlepszym dla przeglądarki.
Co oznacza ten najlepszy moment? Ten moment to taki moment w którym synchronizacja animacji z odświeżaniem ekranu jest najlepsza.
Powiedzmy, że w powyższych przykładach dałeś 1 milisekunde. Oznacza to, że Twoja funkcja "poszerz()" musiałaby się wykonywać co 1 milisekunde. Co dałoby animację , której częstotliwość wynosi 1000 klatek/sekunde (fps). Teraz pytanie: po co to komu, skoro okno przeglądarki jest rysowane z częstotliwością np. 60 klatek/sekundę? Marnujesz tylko procesor.

Problem polega na tym, że Ty nie wiesz z jaką częstotliwością okno przeglądarki jest wyświetlane. To może być 60 fps lub równie dobrze 10 fps, jeśli masz otwarte 20 kart i jakąś mocną grę w tle. To wie sama przeglądarka i tylko ona zna najlepszy moment wykonania Twojej funkcji tak aby została ona wykonana przed kolejnym odświeżeniem okna przeglądarki.

W kodzie będzie to wyglądało tak:

[JAVASCRIPT] pobierz, plaintext
  1. function poszerz() {
  2. div.style.width += 1; // poszerz diva o 1
  3. requestAnimationFrame(poszerz);
  4. }
  5.  
  6.  
  7. window.onload = function () {
  8. poszerz();
  9. }
  10.  
[JAVASCRIPT] pobierz, plaintext


Zauważ jednak pewną rzecz.. Twój DIV będzie się poszerzał w takim tempie w jakim okno przeglądarki jest odświeżane. Żeby sobie z tym poradzić najlepiej jest obliczyć czas jaki upłynął od ostatniego odświeżenia:

[JAVASCRIPT] pobierz, plaintext
  1. // Poniższe czasy są w milisekundach
  2. var czasPoprzedni; // Moment poprzedniego wykonania poszerz()
  3. var czasRoznica ; // Czas który upłynął od poprzedniego wykonania poszerz()
  4. var czasBiezacy; // Bieżący moment
  5.  
  6. function poszerz() {
  7. czasBiezacy = new Date.getTime();
  8. czasRoznica = czasBiezacy - czasPoprzedni;
  9. div.style.width += (czasRoznica) * 0.01; // poszerz diva o 1
  10. requestAnimationFrame(poszerz);
  11. }
  12.  
  13.  
  14. window.onload = function () {
  15. czasPoprzedni = new Date.getTime();
  16. poszerz();
  17. }
  18.  
[JAVASCRIPT] pobierz, plaintext


Tak więc teraz im większa różnica pomiędzy poszczególnymi wywołaniami poszerz() tym więcej poszerzy się DIV.
W przypadku 1 klatki na sekundę poszerzy się o (1000 * 0.01 = 10) pikseli/ klatkę, przy 60 klatkach/sekunde to będzie (1000/60 * 0.01 = oblicz sobie smile.gif pikseli / klatkę.

1 klatka na sekundę daje bardzo niepłynną "animację" to też zobaczysz diva , który będzie się poszerzał skokowo, w przypadku 60 zobaczysz płynną animację.

Mam nadzieję, że to nieco wyjaśnia użycie RAF. Jak powiedziałem wiele zależy od tego jak to implementują przeglądarki. W każdym razie - podstawowa zasada - to synchronizacja odświeżania okna z funkcją, która ma animować obiekty.

  Forum: JavaScript · Podgląd postu: #1064701 · Odpowiedzi: 2 · Wyświetleń: 1 160

lukasz1985
Napisane: 7.09.2013, 20:17:41





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Spróbuj tak.

[JAVASCRIPT] pobierz, plaintext
  1. var Ob = function()
  2. {
  3. this.pole_1 = 1;
  4. this.pole_2 = 2;
  5. }
  6.  
  7. //Dodaje metody do prototypu, aby zaoszczędzić pamięc przy większej ilości utworzonych obiektów
  8. Ob.prototype.metoda_1 = function()
  9. {
  10.  
  11. var self = this;
  12. $('#cokolwiek').click(function(){
  13.  
  14. //tutaj bym chciał się odwołac do metoda_2
  15. self.pole_1 = 4;
  16. self.metoda_2();
  17. });
  18. }
  19.  
  20. Ob.prototype.metoda_2 = function()
  21. {
  22. return 'costam';
  23. }
[JAVASCRIPT] pobierz, plaintext



można też użyć operatora bind, to powinno działać:


[JAVASCRIPT] pobierz, plaintext
  1. var Ob = function()
  2. {
  3. this.pole_1 = 1;
  4. this.pole_2 = 2;
  5. }
  6.  
  7. //Dodaje metody do prototypu, aby zaoszczędzić pamięc przy większej ilości utworzonych obiektów
  8. Ob.prototype.metoda_1 = function()
  9. {
  10.  
  11.  
  12. $('#cokolwiek').click(this.metoda_2.bind(this));
  13. }
  14.  
  15. Ob.prototype.metoda_2 = function()
  16. {
  17. return 'costam';
  18. }
[JAVASCRIPT] pobierz, plaintext


Z tym że ten drugi sposób w którejś przeglądarce nie chodzi, ale jest na to sposób:

https://developer.mozilla.org/en-US/docs/We...Function%2Fbind

  Forum: JavaScript · Podgląd postu: #1064234 · Odpowiedzi: 2 · Wyświetleń: 371

lukasz1985
Napisane: 30.08.2013, 11:50:33





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Jeśli to ma wyglądać dobrze, to CSS3 się do tego nie nadaje.
Najlepszym rozwiązaniem byłoby użycie elementu "<canvas>".

Są teź do tego biblioteki:
http://kineticjs.com/
http://www.createjs.com/
http://fabricjs.com/

Potrzebna będzie też jakaś funkcja która tworzy krzywą, po której obiekt może się poruszać, lub ewentualnie możesz stworzyć krzywą ręcznie z wielu punktów.
  Forum: Po stronie przeglądarki · Podgląd postu: #1062994 · Odpowiedzi: 5 · Wyświetleń: 660

lukasz1985
Napisane: 29.08.2013, 20:12:36





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Przeanalizuj komunikat o błędzie.
  Forum: JavaScript · Podgląd postu: #1062895 · Odpowiedzi: 2 · Wyświetleń: 575

lukasz1985
Napisane: 26.08.2013, 15:02:04





Grupa: Zarejestrowani
Postów: 205
Dołączył: 5.03.2012

Ostrzeżenie: (0%)
-----

Da się liniowo jak to jest w pierwszym przykładzie http://jsfiddle.net/AHvJf/ :

div1.onclick = div1.onmouseout = alertCos;
  Forum: JavaScript · Podgląd postu: #1062322 · Odpowiedzi: 8 · Wyświetleń: 415

2 Stron V   1 2 >

New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 09:58