Acara sukses Ajax tidak berfungsi

193

Saya memiliki formulir pendaftaran dan saya gunakan $.ajaxuntuk mengirimkannya.

Ini adalah permintaan AJAX saya:

$(document).ready(function() {
    $("form#regist").submit(function() {
        var str = $("#regist").serialize();
        $.ajax({
            type: 'POST',
            url: 'submit1.php',
            data: $("#regist").serialize(),
            dataType: 'json',
            success: function() {
                $("#loading").append("<h2>you are here</h2>");
            }        
        });
        return false;        
    });
});

Dalam file subm1.php saya, saya memeriksa keberadaan bidang alamat email dan nama pengguna dalam database. Saya ingin menampilkan pesan kesalahan jika nilai itu ada tanpa penyegaran halaman .

Bagaimana saya bisa menambahkan ini ke callback sukses permintaan AJAX saya?

codingbbq
sumber
2
Apakah Anda yakin panggilan balik sukses dilibatkan?
rahul
Anda perlu mengajukan pertanyaan baru untuk masalah kedua Anda.
Mike Lyons

Jawaban:

386

Hasilnya mungkin tidak dalam format JSON, jadi ketika jQuery mencoba menguraikannya, gagal. Anda dapat menangkap kesalahan dengan error:fungsi panggilan balik.

Anda sepertinya tidak membutuhkan JSON dalam fungsi itu, jadi Anda juga dapat menghapus dataType: 'json'baris tersebut.

Tatu Ulmanen
sumber
14
saya mengubah tipe data menjadi teks dan membuatnya berfungsi. seperti inidataType:'text'
Magesh
+1 bahkan saya, tetapi pada kode yang bukan milik saya, saya dipecahkan dengan mengembalikan data json dari server
albanx
4
Ini juga dapat terjadi jika a dataType:tidak ditentukan, tetapi url:berakhir pada .json.
davetapley
1
Juga di $.postalias memasok jsonsebagai tipe data tanpa json yang sebenarnya berasal dari server tidak memicu successpanggilan balik
botak
Jika Anda ingin membuat permintaan json ajax pastikan tipe mime-nya disetel ke aplikasi / json. Itu memberi saya beberapa masalah.
Gellweiler
19

Meskipun masalah sudah diselesaikan saya menambahkan ini dengan harapan ini akan membantu orang lain.

Saya membuat kesalahan dan mencoba menggunakan fungsi secara langsung seperti ini (sukses: OnSuccess (productID)). Tetapi Anda harus melewati fungsi anonim terlebih dahulu:

  function callWebService(cartObject) {

    $.ajax({
      type: "POST",
      url: "http://localhost/AspNetWebService.asmx/YourMethodName",
      data: cartObject,
      contentType: "application/x-www-form-urlencoded",
      dataType: "html",
      success: function () {
        OnSuccess(cartObject.productID)
      },
      error: function () {
        OnError(cartObject.productID)
      },
      complete: function () {
        // Handle the complete event
        alert("ajax completed " + cartObject.productID);
      }
    });  // end Ajax        
    return false;
  }

Jika Anda tidak menggunakan fungsi anonim sebagai pembungkus OnSuccess disebut bahkan jika layanan web mengembalikan pengecualian.

js newbee
sumber
5
ini tidak ada hubungannya dengan ajax, atau jquery, atau penangan. Kita bisa saja memiliki komentar yang mengingatkan bahwa "seluruh kode harus dibungkus dengan tag skrip". Penjelasannya salah: Anda tidak harus membungkus apa pun dalam fungsi anonim, fungsi yang dinamai akan berlaku, selama Anda meneruskannya alih-alih memanggilnya. Lebih jauh lagi itu menyesatkan: OnSuccess dipanggil sebelum permintaan dikirim, jadi tidak masuk akal untuk menghubungkannya dengan layanan web yang mengembalikan apa pun.
fdreger
Jawaban ini membantu saya, tetapi saya tidak menjawab, Anda harus memperbarui jawaban Anda sesuai dengan komentar @fdreger.
Ozair Kafray
15

Saya mencoba menghapus baris dataType dan itu tidak berhasil untuk saya. Saya mengatasi masalah ini dengan menggunakan "lengkap" alih-alih "sukses" sebagai panggilan balik. Callback sukses masih gagal di IE, tetapi karena skrip saya berjalan dan menyelesaikan pula itu yang saya pedulikan.

$.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: someData,
    complete: function(jqXHR) {
       if(jqXHR.readyState === 4) {
          ... run some code ... 
       }   
    }        
 });

di jQuery 1.5 Anda juga bisa melakukannya seperti ini.

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});
Allen
sumber
9
Hanya sebuah catatan untuk ini. completeakan selalu dipanggil terlepas apakah panggilan ajax berhasil atau tidak sementara successhanya dipanggil jika server web merespons dengan 200 OKtajuk HTTP (semuanya OK).
katalin_2003
10

Pastikan Anda tidak mencetak (gema atau mencetak) teks / data apa pun sebelum menghasilkan data formasi JSON Anda dalam file PHP Anda. Itu bisa menjelaskan bahwa Anda mendapatkan -sucessfull 200 OK- tetapi acara sukses Anda masih gagal di javascript Anda. Anda dapat memverifikasi apa yang diterima skrip Anda dengan memeriksa bagian "Jaringan - Jawab" di pembakar untuk POST submit1.php.

Delfin
sumber
Ini sangat membantu saya. Saya tahu ini adalah jawaban lama tapi itu adalah masalah yang saya alami. Menggunakan echo atau print_r selama debugging dan mengetahui bahwa itu sebenarnya yang menyebabkan bug ... :) Terima kasih!
lennyklb
6 tahun kemudian dan masih membantu orang dengan jawaban ini! Saya tidak akan tahu ke mana harus mencari yang sebaliknya.
Tania Rascia
5

Masukkan callback alert()Anda successuntuk memastikan itu dipanggil sama sekali.

Jika tidak, itu hanya karena permintaan tidak berhasil sama sekali, meskipun Anda berhasil menekan server. Penyebab yang masuk akal bisa jadi batas waktu habis, atau sesuatu dalam kode php Anda membuat pengecualian.

Instal addebeb firebug untuk firefox, jika Anda belum melakukannya, dan periksa callback AJAX. Anda akan dapat melihat responsnya, dan apakah responsnya berhasil atau tidak (200 OK). Anda juga dapat memasukkan yang lain ke alert()dalam complete panggilan balik, yang tentunya harus dipanggil.

David Hedlund
sumber
Terima kasih untuk balasan Anda. Mencoba waspada dalam acara sukses tetapi tidak berhasil. Saya memiliki addon firebug untuk firefox dan tidak menerima respons (200 OK) yang sukses sehingga tidak ada masalah di sana .. Saya memiliki fungsi mati yang dipanggil dalam file php saya untuk setiap kesalahan dan ketika saya memeriksanya di firebug, ia menunjukkan respons yang tepat. apa yang Anda maksud dengan "Anda juga dapat menempatkan peringatan lain () dalam panggilan balik lengkap, yang pasti harus dipanggil." ?? Terima kasih banyak untuk cepat balasan
codingbbq
2
jika Anda tidak melihat lansiran di Anda success, maka itu tidak berhasil. karena jawabannya adalah 200 OK, balasan Tatu tampaknya masuk akal, tetapi untuk pemecahan masalah lebih lanjut, Anda dapat menggunakan acara lain, yang disebut completeyang selalu dipanggil, terlepas dari apakah permintaan berhasil atau tidak ( successhanya terjadi jika permintaan berhasil). complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund
3

Saya memiliki masalah yang sama. itu terjadi karena javascriptmengharapkan jsontipe data dalam mengembalikan data. tetapi jika Anda menggunakan gema atau mencetak dalam php Anda situasi ini terjadi. jika Anda menggunakan echofungsi dalam phpuntuk mengembalikan data, Cukup hapus dataType : "json"berfungsi dengan cukup baik.

Demikianlah dengan Wickramasinghe
sumber
2

Saya mengembalikan JSON yang valid, mendapatkan respons 200 dalam panggilan balik "lengkap" saya, dan bisa melihatnya di konsol jaringan chrome ... TAPI saya belum menentukan

dataType: "json"

begitu saya lakukan, tidak seperti "jawaban yang diterima", itu benar-benar memperbaiki masalah.

sarung
sumber
1

Saya menggunakan XML untuk membawa hasilnya kembali dari php di server ke halaman web dan saya memiliki perilaku yang sama.

Dalam kasus saya alasannya adalah, bahwa tag penutup tidak cocok dengan tag pembuka.

<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <result>
        <status>$status</status>
        <OPENING_TAG>$message</CLOSING_TAG>
    </result>";
?>
thowa
sumber
1

Saya mengalami masalah ini menggunakan fungsi ajax untuk memulihkan kata sandi pengguna dari Magento. Acara sukses tidak dipecat, maka saya menyadari ada dua kesalahan:

  1. Hasilnya tidak dikembalikan dalam format JSON
  2. Saya mencoba untuk mengkonversi array ke format JSON, tetapi array ini memiliki karakter non-utf

Jadi setiap kali saya mencoba menggunakan json_eoncde () untuk menyandikan array yang kembali, fungsi itu tidak berfungsi karena salah satu indeksnya memiliki karakter non-utf, kebanyakan dari mereka aksentuasi dalam kata-kata Portugis Brasil.

Andresa Martins
sumber
1

Saya mencoba mengembalikan string dari controller tetapi mengapa kontrol kembali ke blok kesalahan tidak berhasil ajax

var sownum="aa";
$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : "JSON",
    url : 'updateSowDetails.html?sownum=' + sownum,
    success : function() {
        alert("Wrong username");
    },
    error : function(request, status, error) {

        var val = request.responseText;
        alert("error"+val);
    }
});
pengguna7285134
sumber
1

Saya menghadapi masalah yang sama ketika meminta pengontrol yang tidak mengembalikan respons keberhasilan, ketika memodifikasi pengontrol saya untuk mengembalikan masalah pesan berhasil diselesaikan. perhatikan menggunakan kerangka Lavalite. sebelum:

public function Activity($id)
    {
        $data=getData();
        return
            $this->response->title('title')
                ->layout('layout')
                ->data(compact('data'))
                ->view('view')
                ->output();
    }
after code looks like:
    try {
            $attributes = $request->all();
            //do something
            return $this->response->message('')
                ->code(204)
                ->status('success')
                ->url('url'. $data->id)
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url('nothing Wrong')
                ->redirect()
        }

ini bekerja untuk saya

masokaya
sumber
1

Saya memiliki masalah yang sama saya menyelesaikannya dengan cara itu: ajax saya:

event.preventDefault();
$.ajax('file.php', {
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({tab}), 
success: function(php_response){
            if (php_response == 'item') 
                {
                    console.log('it works');
                }
            }
        })

Baik. Masalahnya bukan dengan json tetapi hanya respon php. Sebelumnya: respons php saya adalah:

echo 'item';

Sekarang:

$variable = 'item';
 echo json.encode($variable);

Sekarang kesuksesan saya berhasil. PS. Maaf jika ada sesuatu yang salah tetapi ini adalah komentar pertama saya di forum ini :)

sutra halus
sumber
0

dalam kasus saya kesalahannya adalah ini di sisi server dan karena alasan itu mengembalikan html

wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");
Emiliano Barboza
sumber
0

Tambahkan 'kesalahan' callback (seperti 'sukses') dengan cara ini:

$.ajax({
   type: 'POST',
   url: 'submit1.php',
   data: $("#regist").serialize(),
   dataType: 'json',
   success: function() {
      $("#loading").append("<h2>you are here</h2>");
   },
   error: function(jqXhr, textStatus, errorMessage){
      console.log("Error: ", errorMessage);
   }
});

Jadi, dalam kasus saya, saya melihat di konsol:

Error:  SyntaxError: Unexpected end of JSON input
  at parse (<anonymous>), ..., etc.
Vlado
sumber
0

Anda harus mendeklarasikan callback Sukses DAN Kesalahan. Menambahkan

error: function(err) {...} 

harus memperbaiki masalah

JeffNhan
sumber
-4

The Keberhasilan callback membutuhkan dua argumen:

success: function (data, textStatus) { }

Juga pastikan bahwa submit1.phpset header tipe konten yang tepat:application/json

Darin Dimitrov
sumber
Terima kasih untuk balasan Anda. Saya membaca tentang ini di jquery ajax documentaion tetapi saya tidak tahu apa langkah saya selanjutnya untuk membuatnya bekerja ... akan menghargai jika Anda bisa mengarahkan saya ke arah yang benar. Juga apakah ini berarti bahwa saya harus memiliki beberapa kode spesifik dalam file php saya ?? terima kasih banyak
codingbbq
7
fakta yang successmengambil dua argumen tampaknya sama sekali tidak relevan dengan pertanyaan itu. Anda dapat meneruskan sejumlah parameter ke fungsi javascript, terlepas dari berapa banyak yang diterima dalam deklarasi, jadi itu jelas bukan penyebab masalah ini, dan karena tidak ada nilai dataatau textStatussedang digunakan dalam keberhasilan panggilan balik, sepertinya ada tidak ada alasan bagus untuk mendeklarasikannya dalam fungsi sama sekali.
David Hedlund
Dan data JSON tidak harus memiliki header tipe konten yang benar, hanya saja harus dalam format JSON.
Tatu Ulmanen