Wie Bearbeite ich eine Globale variable in ein JQuery -$.jede Funktion?
Ok, so dass der Titel wohl nicht zu erklären, meine Frage. Hoffentlich ist dies sinnvoll. Dies ist auch meine erste Anwendung mit jQuery, so verzeihen Sie mir, wenn ich Tue etwas dummes.
Ich habe die folgende Funktion:
function getRandomImages(limit) {
imagesArray = new Array();
$.getJSON('createImageArray.php', {limit: limit}, function(data) {
$.each(data, function(i) {
imagesArray[i] = data[i]; //imagesArray is declared globally.
});
});
}
Den getJSON ist richtig greifen das JSON-Objekt. Es gibt so etwas wie dieses:
{"image0":"images/19.10.FBB9.jpg","image1":"images/8.16.94070.jpg","image2":"images/8.14.47683.jpg","image3":"images/8.15.99404.jpg","image4":"images/8.13.20680.jpg","image5":"images/21.12.9A.jpg","image6":"images/8.17.75303.jpg"}
War ich Debuggen und bin zuversichtlich, Daten[i] richtig mit dem Bild-Pfad als schnappte aus dem JSON-Objekt. Jedoch, nach getRandomImages() aufgerufen wird, schau ich mir das global imagesArray und feststellen, dass nichts geändert wurde. Ich vermute, es ist eine Kopie des imagesArray statt packte den tatsächlichen.
Kann mir jemand sagen, was ich tun muss, damit meine Globale imagesArray aktualisiert wird, in der $.jeder block? Muss ich pass in imagesArray durch Bezugnahme irgendwie? Sorry, ich bin ein wenig verloren.
Danke für die Hilfe.
BEARBEITEN: Einige hintergrund-Informationen. Ich bin das Auffüllen der ein array mit random image Standorte von der DB. Ich will nicht zum laden der Bilder aus der db in ein array auf einmal, weil es einfach zu viele. Also, ich habe einen Zähler, der verfolgt, wo ich mich in mein Bild-array. Sobald ich fertig bin mit einem Bild, ich bewege den Zeiger auf das nächste Bild. Wenn ich das Ende zu erreichen, ich brauche mehr greifen zufällige Bilder. Das ist, wo die oben genannten js-Funktion aufgerufen wird; es fordert createImageArray.php die packt x zufällige Bilder aus der db und gibt ein array zurück. Dann möchte ich diese lagern image Standorten in mein global imagesArray.
Ich bin mir nicht sicher, wie würde ich umstrukturieren, meinen code zu nehmen .getJSON ist asynchronouos Natur berücksichtigt.
InformationsquelleAutor bryan | 2009-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was hier passiert, ist, dass die
getJSON
wird asynchron aufgerufen. So wird die Funktion sofort zurückkehrt und der code aufgerufen wird irgendwann später in der Zeit. Es war nur so, dass die imagesArray aktualisiert.Hätten Sie die getJSON Verhalten sich synchron, aber ich würde nicht empfehlen es. Stattdessen empfehle ich, Restrukturierung Ihres Codes zu berücksichtigen, die asynchrone Natur von AJAX-Anfragen.
EDIT: Für eine synchrone Anfrage verwenden Sie die
async
option (link). Die Allgemeine$.ajax
Funktion oder gesetzt werden AJAX-Globale Optionen. Der Grund, warum ich empfehle nicht, dies ist, dass es sperrt den browser. Wenn der server nicht rechtzeitig reagiert, wird der Benutzer nicht in der Lage sein, seine/Ihre browser.Es ist gar nicht so schwer neu zu strukturieren Ihres Codes. Nur bewegen Sie Ihre Logik für die Handhabung von Bild-arrays in der callback-Funktion. Zum Beispiel statt:
tun
Es wird asynchron aufgerufen. Fromt er Dokumentation (docs.jquery.com/Ajax/jQuery.getJSON): "Hinweis: bitte beachten Sie, dass die Zeilen, nachdem diese Funktion ausgeführt werden, bevor die callback" -
Hrm, ich bin mir nicht sicher, wie, dann würde ich über den Umbau. Gibt es eine Möglichkeit zu haben, Sie Verhalten sich synchron? Was ist die Argumentation hinter nicht zu empfehlen? Haben Sie Empfehlungen, wie könnte ich umstrukturieren?
Dank kgiannakakis. Die Umstrukturierung macht Sinn, aber das problem ist, dass ich nicht jede Bild-Bearbeitung. Der ganze Sinn der Funktion ist es, die Daten in das array (imagesArray[i] = Daten[i]). Hast du irgendwelche Empfehlungen, wie sollte ich das angehen? Danke.
ah, ich sehe. Sie nicht bedeuten, dass er zuweisen des Arrays asynchron, aber dass er es so.
InformationsquelleAutor kgiannakakis
Okay, dass verstehe ich nicht das problem das erste mal. Es ist ein wenig hackey, aber ohne zu wissen, mehr über Ihren code würde ich sagen, wenn Sie Ihre imagesArray erstellen Sie eine bool imagesLoaded.
Dann, nach rufen Sie getRandomImages() fügen Sie Ihren code in einer Warteschleife mit setTimeout (), bis imagesLoaded = true. Oh, und vielleicht einige Art der be-Grafik auf der Seite für den Benutzer zu betrachten, damit Sie nicht denken, dass Ihre app ist kaputt.
InformationsquelleAutor defrex
versuchen Sie dies:
InformationsquelleAutor defrex
Zunächst: Warum verwenden Sie eine Globale variable? Das ist eine schlechte Idee, tun Sie es nicht. Sie können die gemeinsam genutzten Variablen zwischen Funktionen innerhalb eines bestimmten namespace wie diese:
Zweitens, was tun Sie, nachdem Sie das array geholt? Möchten Sie die Anzeige der Bilder auf der Seite, oder was? Konnte Sie in der img-Elemente an die Seite, anstatt Sie in das array?
InformationsquelleAutor Tim Büthe
vielleicht funktioniert, funktioniert für mich.. 🙂
Hoffe, dass es dir helfen..
🙂
InformationsquelleAutor Alexander