Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Kilkukrotne odpalenie funkcji
Forum PHP.pl > Forum > Przedszkole
peja1990
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...
CuteOne
Chyba nie rozumiem... raz w "sponsors" + raz w "partners" = 2 wykonanie

jaśniej proszę
peja1990
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>
CuteOne
Pokaż ciało funkcji vSlide.

ps. jeżeli to autoslider to tak łatwo się nie da wink.gif
peja1990
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...
zegarek84
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);
peja1990
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
zegarek84
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
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.