2012-05-02 29 views
9

Mam problem z prostą funkcją zwrotną w jQuery ajax. Google nie pomoże, a przepełnienie stosów też nie będzie, więc myślę, że to nie jest coś konkretnego, ale raczej coś, czego jestem zbyt nieświadomy, by to zobaczyć. Dla mnie kod wygląda dokładnie tak, jak powinien.Dlaczego funkcja wywołania zwrotnego ajax jquery nie działa?

Tak więc, oto kod:

function sendMessage(message) 
{ 
//Establish connection to php script 
$.ajax({ 
    type: 'POST', 
    url: 'action/chat/test.php', 
    success: function(feedback){ 

     alert(feedback); 

    } 
}).error(function(){ 
    //Do some error handling here 
}); 
} 

W test.php on po prostu mówi

<?php 
    echo "called"; 
?> 

Jeśli chodzi o mnie chodzi „o nazwie” należy uprzedzić - ale tak nie jest. Sprawdziłem już, że wywoływana jest funkcja sendMessage() (a komunikat parametru nie ma teraz znaczenia).

Czy ktoś ma jakiś pomysł?

+0

czy masz jakieś błędy skryptu? sprawdź konsolę firebug. – Shyju

+0

Jeśli umieścisz alert na początku 'sendMessage()', czy to pokazuje? – jfriend00

+0

Dwie najpopularniejsze opcje: błędy JavaScript powodujące, że żądanie AJAX nie jest wysyłane, lub problem z żądaniem AJAX, który oznacza, że ​​wykonywana jest funkcja zwrotna 'error', a nie' success'. Korzystanie z przeglądarek debugger byłoby dobrym pierwszym krokiem. –

Odpowiedz

14

Aktualizacja: Jedna rzecz, na którą należy zwrócić uwagę, upewnij się, że używasz jakiegoś debuggera, takiego jak firebug. Następnie możesz przejść do karty sieci i sprawdzić adres URL żądania i odpowiedź ręcznie, aby sprawdzić, czy dostaniesz 200 odpowiedzi lub wewnętrzny błąd serwera, itp.

Spróbuj dodać console.log(data); w swojej funkcji sukcesu, aby sprawdzić, czy coś jest nie tak zwrócony.

Można też użyć .always(data):

function sendMessage(message) 
{ 
    //Establish connection to php script 
    $.ajax({ 
     type: 'POST', 
     url: 'action/chat/test.php' 
    }).done(function(data) { console.log(data); }) 
    .fail(function() { alert("error"); }) 
    .always(function() { alert("complete"); }); 
} 

Od docs:

Deprecation Wskazówka: jqXHR.success(), jqXHR.error() i jqXHR.complete() wywołania zwrotne będzie przestarzałe w jQuery 1.8. Aby przygotować kod do ewentualnego usunięcia, użyj zamiast tego jqXHR.done(), jqXHR.fail() i jqXHR.always().

+2

Znalazłem problem! Wystąpił problem z dostępem do plików z mojego apache. Apache nie mógł czytać tego pliku, chociaż stworzyłem go z Cody tak jak zwykle. Teraz działa funkcja oddzwaniania. Właśnie dołączyłem do przepełnienia stosu i muszę powiedzieć, że jestem przytłoczony szybkimi odpowiedziami! Dziękuję Ci! – weltschmerz

+0

Jedna rzecz, na którą należy zwrócić uwagę, upewnij się, że używasz jakiegoś debuggera, takiego jak firebug. Następnie możesz przejść do zakładki sieci i sprawdzić adres URL żądania i odpowiedź ręcznie, aby sprawdzić, czy otrzyma odpowiedź 200 lub błąd wewnętrzny serwera, itp. – Fostah

+0

dziękuję! czego potrzebowałem. – weltschmerz

1

To prawdopodobnie obsługa błędów. Jeśli chcesz poradzić sobie z błędami, istnieje inny atrybut, który możesz przekazać obiektowi, który przekazujesz do ajax, to "błąd", a także "limit czasu" do obsługi limitów czasu strony. Wyszukaj funkcję $ .ajax, a znajdziesz te atrybuty.

+0

Kiedy próbowałem użyć obsługi błędów przed alertem, to nic nie alarmuje. Teraz to robi. Wygląda na to, że coś jest nie tak z plikiem php, chociaż ścieżka jest poprawna. – weltschmerz

+1

Znalazłem problem! Wystąpił problem z dostępem do plików z mojego apache. Apache nie mógł czytać tego pliku, chociaż stworzyłem go z Cody tak jak zwykle. Teraz działa funkcja oddzwaniania. Właśnie dołączyłem do przepełnienia stosu i muszę powiedzieć, że jestem przytłoczony szybkimi odpowiedziami! Dziękuję Ci! – weltschmerz

4

Tylko dla odniesienia istnieje zachowanie, które może skończyć się w ten sposób (tj. Done() nie wywoływane).

Oto ona:

  1. Załóżmy można oczekiwać obiekt JSON (prosiłeś o nią z "Accept" typu MIME).
  2. Załóżmy, że ciąg Json jest nieprawidłowy.

W takim przypadku done() nigdy nie jest wywoływane, ale zawsze() będzie. I zawsze() otrzymasz "źle" sformatowaną odpowiedź jako czysty tekst.

Powiązane problemy