• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

dziwne zachowanie danych wewnątrz pętli $.each

Fiszki IT
Fiszki IT
0 głosów
98 wizyt
pytanie zadane 31 sierpnia 2016 w JavaScript przez dziki indyk Użytkownik (940 p.)

piszę plugin do jquery. do tej pory wygląda to tak:

$.fn.jCounter = function(jsSettings) {

		var mergedSettings = $.extend(jCGlobalSettings, jsSettings);

		return this.each(function() {

			this.element = $(this);
			this.settings = mergedSettings;

            //pobiera dane z data-atrybutów elementu
			for (var key in this.settings) { 
				if (this.element.data( key.toLowerCase() ) != undefined) {
					this.settings[key] = this.element.data( key.toLowerCase() );
				}
			}

			console.log(this.settings);

            //nieistotne w tym kontekście
			if (typeof(this.settings.animation) !== "function") {
				this.settings.animation = jCAnimations[this.settings.animation];

				if (this.settings.animation !== "function") {
					this.settings.animation = jCAnimations['basic'];
				}
			}

			if (this.settings.digitsOnRight < 0) {
				this.settings.digitsOnRight = 0;
			}

			this.steps = Math.ceil(this.settings.updatesPerSec * this.settings.duration / 1000);
			this.stepCounter = 0;

			
            //wygenerowanie kolejnej wartości licznika na podstawie danych z this
			jCUpdateCounter(this);

			if (typeof(this.settings.onStart) === "function") {
				this.settings.onStart(this.element);
			}

			this.intervalId = setInterval(function(counter) {
				jCUpdateCounter(counter);

				if (counter.stepCounter > counter.steps) {
					clearInterval(counter.intervalId);

					if (typeof(counter.settings.onEnd) === "function") {
						counter.settings.onEnd(counter.element);
					}
				}
			}, this.settings.duration / this.steps, this); //przekazanie this do setInterval jako counter
		});
	};

problemem jest to że przy drugiej iteracji pętli $.each nadpisywane jest this.settings pierwszego elementu. dlatego jeżeli plugin odpalanay jest na jednym elemencie jquery wszystko wygląda ok. w innych wypadakach dane się dziwnie mieszają. czy to problem z $.each? może przekazywanie this do setInterval powoduje takie błędy?

1 odpowiedź

0 głosów
odpowiedź 2 września 2016 przez dziki indyk Użytkownik (940 p.)

Problem rozwiązany. Okazuje się że javascript przy linijce

this.settings = mergedSettings;

nie kopiuje obiektu mergedSettings tylko trzyma referancję do oryginału. trzeba było zastąpić ją następująco:

self.settings = $.extend({}, mergedSettings);

Zamykam pytanie.

Podobne pytania

–1 głos
0 odpowiedzi 229 wizyt
pytanie zadane 28 sierpnia 2017 w JavaScript przez RAFI Początkujący (390 p.)
+1 głos
1 odpowiedź 97 wizyt
pytanie zadane 24 maja 2016 w JavaScript przez Boshi VIP (100,540 p.)
0 głosów
1 odpowiedź 89 wizyt
pytanie zadane 28 grudnia 2015 w JavaScript przez Radekoslaw123 Gaduła (3,080 p.)
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

84,758 zapytań

133,561 odpowiedzi

295,987 komentarzy

56,012 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...