2012-10-30 16 views
5

Nie jestem specjalistą od JavaScript i widziałem, że szukałem tego przez długi czas w Internecie.JavaScript pobiera zmienną z funkcji

Mam problem z uzyskaniem zmiennej z innej funkcji. Mój kod wygląda tak:

var variabeltje; 
$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()}, 
    function(data) { 
    alert(data); 
    variabeltje=data; 
    } 
); 
alert(window.variabeltje); 

Zmienna variabeltje musi dostać informację z danymi. Kiedy ustawiam alarm poniżej variabeltje=data, działa, ale potrzebuję zmiennej danych po funkcji.

Edit:

Zmieniłem go do tego, co ludzie mówili, teraz mam to:

   var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()}); 
       XHR.done(function(data) { 
        console.log(data); 
        getData(data); 
       }); 

       function getData(data) { 
       if(data == 'true') { 
        alert(data); 
        $(this).unbind('keypress'); 
        $(this).html($(this).find('input').val()); 
       } 
       } 

Ale teraz $ (this) nie przechodzi do funkcji. Jak mogę to rozwiązać?

+0

Powodem jest podana poniżej w odpowiedziach, ale żadne rozwiązanie, aby to, co staramy się robić. To dlatego, że trudno jest to zrobić bez większego wyobrażenia o tym, co próbujesz zrobić. Na przykład dobrym sposobem rozwiązania problemu w tym kodzie jest przeniesienie alertu o dwie linie, ale to może nie zadziałać w twoim rzeczywistym kodzie. – Jasper

+0

Dzięki za odpowiedź. W pliku handle_time.php sprawdzam poprawność i zostanie on edytowany w bazie danych. Jeśli jest edytowany z powodzeniem, zwróci true; A variabeltje musi uzyskać wartość true. Następnie po alarmie chcę sprawdzić, czy to prawda, czy nie i wyświetlić rzeczy, czy nie. – Marnix

+0

No cóż, przypuszczam, że nie powinieneś próbować tego robić poniżej wywołania '$ .post()' (które jest zaraz po wysłaniu żądania *) * Zamiast tego powinieneś to zrobić w funkcji, którą przekazujesz do ' $ .post() ', który zostanie wykonany po zakończeniu żądania. – Jasper

Odpowiedz

3

jak to asynchroniczny dane będą dostępne dopiero po wywołaniu ajax jest zakończona, więc będziesz musiał zmodyfikować kod do pracy z tym i czekać, aż po ajax odbywa się robić swoje rzeczy:

var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()}); 

XHR.done(function(data) { 
    console.log(data); 
}); 

lub w innej funkcji:

function XHR(time){ 
    return $.post('js/ajax/handle_time.php', {time: time}); 
} 

function doStuff(element) { 
    XHR($(element).find('input').val()).done(function(data) { 
     console.log(data); 
    }); 
} 

EDIT:

na podstawie swojej edycji, wygląda na to, że jest to kwestia określania zakresu:

var self = this, 
    XHR = $.post('js/ajax/handle_time.php', {time: $(self).find('input').val()}); 

XHR.done(function(data) { 
    console.log(data); 
    getData(data); 
}); 

function getData(data) { 
    if(data == 'true') { //normally you'd try to pass true as a boolean, not string 
     alert(data); 
     $(self).unbind('keypress').html($(self).find('input').val()); 
    } 
} 
+0

Dziękuję bardzo. Jeszcze jedno pytanie, kiedy umieściłem to w funkcji: $ (this) .html ($ (this) .find ('input').val()); Jak przekazać $ (this) do XHR.done (funkcja (dane) {? – Marnix

+0

Musisz dowiedzieć się zakresu, i co to jest, a następnie w razie potrzeby użyć zmiennej lub przekazać ją do funkcji tak jakbyś naprawdę cokolwiek innego, aby uniknąć problemów z określaniem zakresu – adeneo

+0

Zmieniłem go i zredagowałem pierwszy post – Marnix

1

Problem polega na tym, że metoda post jest wykonywana asynchronicznie. Oznacza to, że post jest wysyłany na serwer, ale przepływ wykonania jest kontynuowany, więc alert próbuje uzyskać dostęp do wartości, która nie została ustawiona, ponieważ post nie został jeszcze zwrócony.

Możesz użyć metody ajax, jeśli potrzebujesz wykonania synchronicznego.

2

Dzieje się tak dlatego, że metoda $ .post działa asynchronicznie.

Proszę spojrzeć na this question na SO.

Edytuj: Możesz zmienić swój kod i umieścić metodę części po napisie w ciele anonimowej funkcji uruchomionej przy sukcesie. W następujący sposób:

$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()}, 
    function(data) { 
    alert(data); 
    variabeltje=data; 
    alert(window.variabeltje); // or whatever function you need to call, call it here... 
    } 
); 
Powiązane problemy