Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript] Kilkukrotne odpalenie funkcji
peja1990
post 9.02.2012, 16:12:39
Post #1





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Witam, napisałem sobie funkcję slider'a.
  1. function vSlide(container) {
  2. ...
  3. }

Jako container zdefiniowałem id div'a.

Na stronie mam 2 slidery, dlatego też chciałbym ją odpalić 2 razy, oczywiście wartość container jest inna.

Mam dwa div'y sliderów:
  1. <div id="sponsors">
  2. <div id="partners">


Dlatego też odpalam funkcję:
  1. (function () {
  2. vSlide("sponsors");
  3. vSlide("partners");
  4. }());


W wyniku otrzymuję wykonanie funkcji raz w div'ie "sponsors", a raz w div'ie "partners".
Chciałbym by funkcja została wykonana dla obydwu div'ów.

Bardzo proszę Was o pomoc...
Go to the top of the page
+Quote Post
CuteOne
post 9.02.2012, 16:22:20
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Chyba nie rozumiem... raz w "sponsors" + raz w "partners" = 2 wykonanie

jaśniej proszę
Go to the top of the page
+Quote Post
peja1990
post 9.02.2012, 16:25:45
Post #3





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(CuteOne @ 9.02.2012, 16:22:20 ) *
Chyba nie rozumiem... raz w "sponsors" + raz w "partners" = 2 wykonanie

jaśniej proszę


Mamy 2 div'y:
  1. <div id="sponsors"></div>
  2. <div id="partners"></div>


Odświeżam stronę i w wyniku otrzymuję:
  1. <div id="sponsors"><!-- WYKONANA FUNKCJA --></div>
  2. <div id="partners"></div>


Odświeżam stronę jeszcze raz i w wyniku otrzymuję:
  1. <div id="sponsors"></div>
  2. <div id="partners"><!-- WYKONANA FUNKCJA --></div>


A oczekuję takiego efektu:
  1. <div id="sponsors"><!-- WYKONANA FUNKCJA --></div>
  2. <div id="partners"><!-- WYKONANA FUNKCJA --></div>
Go to the top of the page
+Quote Post
CuteOne
post 9.02.2012, 16:33:42
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Pokaż ciało funkcji vSlide.

ps. jeżeli to autoslider to tak łatwo się nie da wink.gif
Go to the top of the page
+Quote Post
peja1990
post 9.02.2012, 17:48:47
Post #5





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(CuteOne @ 9.02.2012, 16:33:42 ) *
Pokaż ciało funkcji vSlide.

ps. jeżeli to autoslider to tak łatwo się nie da wink.gif



  1. function vSlide(container, max, height) {
  2. $.ajax({
  3. type: "POST",
  4. url : container + ".html",
  5. load: function (XMLHttpRequest) {
  6. $("#" + container + " .slider").html("Trwa pobieranie danych&hellip;");
  7. },
  8. success: function(str) {
  9. var temp = new Array();
  10. temp = str.split("\n");
  11. var dir = "images/" + container + "/";
  12. var loaded = 0;
  13. var progress = (100 / temp.length);
  14. var objects = [];
  15. var preloader = null;
  16. var progressBar = null;
  17.  
  18. function startLoading() {
  19. preloader = document.createElement('div');
  20. preloader.id = 'preloader';
  21. progressBar = document.createElement('div');
  22. progressBar.id = 'progressBar';
  23. preloader.appendChild(progressBar);
  24. $(preloader).appendTo("#" + container + " .slider");
  25. var bw = $("#" + container + " .slider").width();
  26. var bh = $("#" + container + " .slider").height();
  27. var lw = $("#" + container + " .slider #preloader").width();
  28. var lh = $("#" + container + " .slider #preloader").height();
  29. $("#" + container + " .slider #preloader").css({
  30. 'margin-top' : (bh - lh) / 2 + "px",
  31. 'margin-left' : (bw - lw) / 2 + "px"
  32. });
  33. for(var x=0; x<temp.length; x++) {
  34. objects[x] = new Image();
  35. objects[x].onload = progressing;
  36. objects[x].src = dir + temp[x];
  37. }
  38. }
  39.  
  40. function progressing() {
  41. loaded++;
  42. progressBar.style.width = loaded * progress + "%";
  43. if(loaded >= temp.length) {
  44. slider();
  45. $("#" + container + " #preloader").remove();
  46. }
  47. }
  48. window.onload = startLoading;
  49. },
  50. error: function (XMLHttpRequest, textStatus, errorThrown) {
  51. $("#" + container + " .slider").html('Błąd ładowania danych !');
  52. }
  53. });
  54.  
  55. function slider() {
  56. var id = 0;
  57. var start = 1;
  58. var stop = 0;
  59. var active = 1;
  60. $.ajax({
  61. type: "POST",
  62. url : container + ".html",
  63. load: function (XMLHttpRequest) {
  64. $("#" + container + " .slider").html("Trwa pobieranie danych&hellip;");
  65. },
  66. success: function(str) {
  67. var mV = 15;
  68. var mH = 10;
  69. var temp = new Array();
  70. var dir = "images/" + container + "/";
  71. var bs = ($("#" + container + " .slider").width() / max) - (mH * 2);
  72. temp = str.split("\n");
  73. for(var i=0; i<temp.length; i++) {
  74. id += 1;
  75. stop += 1;
  76. var block = document.createElement("span");
  77. block.setAttribute('id', id);
  78. block.setAttribute('style', 'width:' + bs + 'px; height:' + height + 'px; margin:0 ' + mH + 'px');
  79. $(block).appendTo("#" + container + " .slider");
  80. var img = document.createElement("img");
  81. img.setAttribute('src', dir + temp[i]);
  82. img.setAttribute('style', 'max-width:' + bs + 'px; max-height:' + height + 'px');
  83. $(img).appendTo("#" + id);
  84. $("#" + container + " .slider").css({
  85. 'margin-top' : mV + "px",
  86. 'margin-bottom' : mV + "px"
  87. });
  88. var ah = $("#" + container + " .action").height();
  89. $("#" + container + " .action").css({
  90. 'margin-top' : ((height - ah) / 2) + mV + "px",
  91. 'margin-bottom' : ((height - ah) / 2) + mV + "px"
  92. });
  93. var bw = $("#" + container + " .slider span#" + id).width();
  94. var bh = $("#" + container + " .slider span#" + id).height();
  95. var iw = $("#" + container + " .slider span#" + id).children().width();
  96. var ih = $("#" + container + " .slider span#" + id).children().height();
  97. $("#" + container + " .slider span#" + id).children().css({
  98. 'margin-top' : (bh - ih) / 2 + "px",
  99. 'margin-left' : (bw - iw) / 2 + "px"
  100. });
  101. if($("#" + container + " .slider span#" + id).attr("id") <= max) {
  102. $("#" + container + " .slider span#" + id).fadeIn();
  103. } else {
  104. $("#" + container + " .slider span#" + id).hide();
  105. }
  106. }
  107. },
  108. error: function (XMLHttpRequest, textStatus, errorThrown) {
  109. $("#" + container + " .slider").html('Błąd ładowania danych !');
  110. }
  111. });
  112.  
  113. function slide() {
  114. $("#" + container + " .slider span").each(function() {
  115. if($(this).attr("id") >= active && $(this).attr("id") <= max) {
  116. $(this).fadeIn();
  117. } else {
  118. $(this).hide();
  119. }
  120. });
  121. };
  122.  
  123. $("#" + container + " .action.prev").click(function() {
  124. if(document.getElementById(start).style.display == "none") {
  125. active -= 1;
  126. max -= 1;
  127. slide();
  128. }
  129. });
  130.  
  131. $("#" + container + " .action.next").click(function() {
  132. if(document.getElementById(stop).style.display == "none") {
  133. active += 1;
  134. max += 1;
  135. slide();
  136. }
  137. });
  138. }
  139. }


Dodałem dwie zmienne do funkcji tj. max i height, a więc teraz wywołuję funkcję w taki sposób:

  1. (function () {
  2. vSlide("sponsors", 4, 75);
  3. vSlide("partners", 5, 50);
  4. }());


Pomyślałem trochę nad tym i sądzę, że problem może tkwić w zmiennej id, próbowałem jednak ze zmienną globalną:
  1. id = 0;

jednak nie przyniosło to oczekiwanego rezultatu...
Go to the top of the page
+Quote Post
zegarek84
post 9.02.2012, 18:06:16
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


window.onload = startLoading;
powyższe wykona Ci się tylko raz i tylko jedno przypisanie a widzę, iż Twoją intencją było, by dla wszystkich po załadowaniu strony...
poza tym daj to live gdzieś gdyż nie chce mi się aż tak dokładnie analizować wszystko na sucho...

edit.
ps
może tak na szybko pomoże coś w stylu:
[JAVASCRIPT] pobierz, plaintext
  1. window.onload = (function(newFunc, oldFunc){return function(){newFunc&&newFunc();oldFunc&&oldFunc()};})(startLoading, window.onload);
[JAVASCRIPT] pobierz, plaintext


tylko przy szybkim załadowaniu strony a zbyt późnym ajax'a też to się nie wykona, skoro korzystasz z jQ to zamiast:
window.onload = startLoading;
mogłeś napisać:
$(startLoading);

Ten post edytował zegarek84 9.02.2012, 18:28:50


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
peja1990
post 9.02.2012, 18:28:07
Post #7





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 4.12.2010

Ostrzeżenie: (10%)
X----


Cytat(zegarek84 @ 9.02.2012, 18:06:16 ) *
window.onload = startLoading;
powyższe wykona Ci się tylko raz i tylko jedno przypisanie a widzę, iż Twoją intencją było, by dla wszystkich po załadowaniu strony...
poza tym daj to live gdzieś gdyż nie chce mi się aż tak dokładnie analizować wszystko na sucho...


Super !
Po zamianie:
  1. window.onload = startLoading;

na
  1. startLoading();

funkcja wykonuje się w obydwu div'ach jednak nadal występuje problem z ID smile.gif

Zmieniłem
  1. var id = 0;
  2. var start = 1;
  3. var stop = 0;
  4. var active = 1;

na
  1. id = 0;
  2. var start = id + 1;
  3. var stop = id + 0;
  4. var active = id + 1;

w wyniku czego otrzymałem dobrze ponumerowane elementy:

  1. <div id="sponsors">
  2. <div class="slider">
  3. <span id="1"></span>
  4. <span id="2"></span>
  5. <span id="3"></span>
  6. </div>
  7. </div>
  8. <div id="partners">
  9. <div class="slider">
  10. <span id="4"></span>
  11. <span id="5"></span>
  12. </div>
  13. </div>


jednak teraz obrazki wyświetlają się tylko w div'ie "sponsors" gdyż jest problem z pozostałymi zmiennymi.
Moim zdaniem teraz trzeba jakoś przechwycić wartość zmiennej "id" po zakończeniu wykonywania funkcji i przerzucić ją do zmiennej "start", ponieważ odpowiada ona za id elementu od którego ma zacząć się wyświetlanie obrazków.



Cytat(zegarek84 @ 9.02.2012, 18:06:16 ) *
edit.
ps
może tak na szybko pomoże coś w stylu:
[JAVASCRIPT] pobierz, plaintext
  1. window.onload = (function(newFunc, oldFunc){return function(){newFunc&&newFunc();oldFunc&&oldFunc()};})(startLoading, window.onload);
[JAVASCRIPT] pobierz, plaintext


tylko przy szybkim załadowaniu strony a zbyt późnym ajax'a też to się nie wykona, skoro korzystasz z jQ to zamiast:
window.onload = startLoading;
mogłeś napisać:
$(startLoading);

to już chyba mamy za sobą bo funkcja się ładnie odpala wielokrotnie smile.gif

Ten post edytował peja1990 9.02.2012, 18:46:55
Go to the top of the page
+Quote Post
zegarek84
post 9.02.2012, 18:54:56
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


prawie...

choć masz zmienną id definiowaną globalnie to od razu strukturalnie/liniowo/synchronicznie nadajesz wartości zmiennym start, stop i active, więc jest tak, jakby id miało inicjującą wartość 0... z kolei dalej id zmieniasz asynchronicznie/zdarzeniowo...

ustawiaj te zmienne względem id... tak na szybko modyfikacje które mogą pomóc (a i tak cały kod mi się nie podoba ;p):
zamień:
id += 1;
stop += 1;
na:
id += 1;
stop = id;

przed pętlą:
for(var i=0; i<temp.length; i++) {

spróbuj dać:
start = active = id + 1;

nic nie gwarantuję ;p - nie uruchamiałem tego kodu


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.07.2025 - 10:13