• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

JQuery Queue in loop erstellen

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Ich habe hier ein Problem mit JS, bzw. Jquery.
Ich erstelle in einer for-Schleife einen JQuery Queue bestehend aus Funktionen. Die Funktion erhält als Parameter Arrayelemente basierend auf den lokalen Zählvariablen.
Allerdings werden diese Parameter offenbar erst evaluiert, wenn die Funktion an sich ausgeführt wird:

[src=javascript]
for (var index = 0, len = spritearray.length; index < len; ++index) {
var theQueue = $({}); // jQuery on an empty object
var arraynumber = index;
func = function(next){ startSprite(arraynumber, next) }
theQueue.queue('test', func);
}
theQueue.dequeue('test'); // start queue
[/src]

In der Zeile
[src=javascript]func = function(next){ startSprite(arraynumber, next) }[/src]
Gewollt ist also ein Queue bestehend aus:
[src=javascript]
function(next){ startSprite(0, next) }
function(next){ startSprite(1, next) }
function(next){ startSprite(2, next) }
[/src]

Was ich aber erhalte ist:
[src=javascript]
function(next){ startSprite(2, next) }
function(next){ startSprite(2, next) }
function(next){ startSprite(2, next) }
[/src]

Wie kann ich das korrekt machen?
Analog dazu, wenn ich die Zeile
[src=javascript] var arraynumber = index;[/src]
weglasse, dann meldet er 'index is undefined', weil die laufvariable da dann wohl schon zerstört ist.
Wie kann ich JS also sagen, dass er dann später startSprite mit den Werten 0,1,2,..N aufrufen soll?
 

KingJamez

Aktiver NGBler

Registriert
18 Juli 2013
Beiträge
501
Der `arraynumber` Fehler sollte dich eigentlich in die richtige Richtung lenken und ich hoffe ich liege hier nicht komplett falsch.

Die Funktion wird übergeben, als Parameter, an jquery´s core, wird also vollkommen aus dem Kontext gerissen, dadurch existiert die variable `index` auch nicht mehr. Durch ein umdefinieren von `index` in `arraynumber` existiert zwar dann `arraynumber`, diese wurde aber mehrfach überschrieben, durch `index`. `arraynumber` ist also immer `spritearray.length`, weil die funktion ja nich in der schleife ausgeführt wird, wenn die Schleife bereits fertig durchlaufen ist.

Kannst du vielleicht etwas mehr erklären was du vor hast, dann könnte man nach Auswegen suchen.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
Muß es eine jQuery Queue sein? Zwingend?
Dann ignoriere den Hinweis der jetzt kommt bitte. :)


Ansonsten vielleicht so etwas hier in Form einer verketteten Liste?

[src=javascript]// Temporary data holder
var spriteList = [];

// Generator

function generateSprite(index, previous, next) {
var sprite = {};
sprite.index = index;
sprite.previous = previous;
sprite.next = next;

sprite.getIndex = function() {
return this.index;
}

sprite.nextSprite = function() {
return this.next;
}

sprite.previousSprite = function() {
return this.previous;
}

return sprite;
}


// Generation
var previousSprite = null;
for (var index = 0; index < 10; index++) {
var generatedSprite = generateSprite(index, null, null);
spriteList.push(generatedSprite);

if (previousSprite) {
previousSprite.next = generatedSprite;
generatedSprite.previous = previousSprite;
}

previousSprite = generatedSprite;
}


// Cleanup
spriteList.splice(1, spriteList.length-1); // Optional, aber nur wenn man über den Index nicht auf andere Sprites mehr zugreifen koennen muss.



// Iteration
var currentSprite = spriteList[0];
while (currentSprite) {
console.log("my index is: " + currentSprite.getIndex());

if (currentSprite.previousSprite()) {
console.log("the previous is: "+currentSprite.previousSprite().index);
}

if (currentSprite.nextSprite()) {
console.log("the next is: "+currentSprite.nextSprite().index);
}

currentSprite = currentSprite.nextSprite();
}[/src]
 
Zuletzt bearbeitet:

Timon3

Team ModMii

Registriert
17 Juli 2013
Beiträge
499
@BurnerR: Das Problem ist, dass der Wert erst bei der Ausführung genutzt wird. Wenn du ihn kopieren willst, kannst du eine selbstaufrufende anonyme Funktion schreiben:

[src=javascript]func = (function(value) { return function(next) { startSprite(value, next); })(arraynumber);[/src]
 
Oben