Ajax başarı etkinliği çalışmıyor


194

Bir kayıt formum var ve $.ajaxgöndermek için kullanıyorum .

Bu benim AJAX isteğim:

$(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;        
    });
});

Benim içinde submit1.php dosyasının Ben alanların varlığını denetlemek e-posta adresi ve kullanıcı adı veritabanında. Bir sayfa yenilemeden bu değer varsa bir hata mesajı görüntülemek istiyorum .

Bunu AJAX isteğimin başarılı geri aramasına nasıl ekleyebilirim ?


2
Başarılı geri aramanın başlatıldığından emin misiniz?
rahul

İkinci sorununuz için yeni bir soru sormanız gerekiyor.
Mike Lyons

Yanıtlar:


390

Sonuç muhtemelen JSON biçiminde değildir, bu nedenle jQuery bu şekilde ayrıştırmaya çalıştığında başarısız olur. Hatayı error:geri arama işleviyle yakalayabilirsiniz .

Yine de bu işlevde JSON'a ihtiyacınız yok gibi görünüyor, böylece dataType: 'json'satırı da çıkarabilirsiniz .


14
i dataType metne değiştirdi ve çalıştım. böyledataType:'text'
Magesh

+1 bile benim, ama benim olmayan kodda, sunucudan json verileri döndürerek çözüldü
albanx

4
Bu, bir dataType:belirtilmezse, ancak url:sona ererse de oluşabilir .json.
davetapley

1
Ayrıca sunucudan gelen gerçek json olmadan veri türü olarak $.posttemin eden takma jsonsuccess
adda

Bir json ajax isteği yapmak istiyorsanız, mime türünün application / json olarak ayarlandığından emin olun. Bu bana bazı sıkıntılar verdi.
Gellweiler

19

Sorun zaten çözülmüş olmasına rağmen bunu başkalarına yardımcı olacağını umuyorum.

Ben doğrudan böyle bir işlevi (başarılı: OnSuccess (productID)) kullanmaya çalıştı hata yaptım. Ama önce anonim bir işlevi geçmelisiniz:

  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;
  }

Anonim bir işlev sarmalayıcı olarak kullanılmazsa, web hizmeti bir istisna döndürse bile OnSuccess çağrılır.


5
bunun ajax, jquery veya handlers ile ilgisi yoktur. "Kodun tamamının bir komut dosyası etiketine sarılması gerektiğini" hatırlatan bir yorumumuz olabilir. Açıklama yanlış: anonim işlevlere hiçbir şey sarmanıza gerek yok, adlandırılmış bir işlev, onu çağırmak yerine geçtiğiniz sürece yapacak. Ayrıca yanıltıcıdır: İstek gönderilmeden önce OnSuccess çağrılır, bu nedenle herhangi bir şey döndüren web hizmetiyle ilişkilendirmek mantıklı değildir.
fdreger

Bu cevap bana yardımcı oldu, ancak oy vermedim, cevabınızı @fdreger yorumuna göre güncellemelisiniz.
Ozair Kafray

15

DataType satırını kaldırmayı denedim ve benim için çalışmadı. Geri arama olarak "başarı" yerine "tam" kullanarak sorunu çözdüm. Başarı geri arama hala IE'de başarısız olur, ancak komut dosyam çalıştığından ve yine de umursadığım her şeyden önce tamamlandığından.

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

jQuery 1.5'te bunu da yapabilirsiniz.

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

9
Sadece bir not. completeajax çağrısı başarılı olup olmadığına bakılmaksızın her zaman çağrılırken, successyalnızca web sunucusu bir 200 OKHTTP üstbilgisi ile yanıt verirse çağrılır (her şey yolundadır).
katalin_2003

10

PHP dosyanızda JSON ile biçimlendirilmiş verilerinizi oluşturmadan önce herhangi bir metin / veri yazdırmayacağınızdan (yankı ya da yazdırma) emin olun. Bu, -sürük bir 200 OK- elde ettiğinizi açıklayabilir, ancak başarı etkinliğiniz hala javascriptinizde başarısız olur. POST gönderme1.php için kundakçı "Ağ - Yanıt" bölümünü kontrol ederek komut dosyanızın ne aldığını doğrulayabilirsiniz.


Bu gerçekten bana yardımcı oldu. Bunun eski bir cevap olduğunu biliyorum ama tam olarak yaşadığım sorun buydu. Hata ayıklama sırasında yankı veya print_r kullanarak ve bu gerçekten hataya neden olduğunu bulmak ... :) Teşekkürler!
lennyklb

6 yıl sonra ve hala bu cevapta insanlara yardım! Başka türlü nereye bakacağımı bilemezdim.
Tania Rascia

5

Hiç arandığından emin olmak alert()için successgeri aramanıza bir tane koyun .

Değilse, bunun nedeni sunucuyu vurmayı başarsanız bile, isteğin hiç başarılı olmamasıdır. Makul nedenler bir zaman aşımı süresi veya php kodunuzdaki bir şey bir istisna atar olabilir.

Henüz yapmadıysanız firefox için kundakçı eklentisini yükleyin ve AJAX geri aramasını inceleyin. Yanıtı ve yanıtın başarılı (200 Tamam) yanıt alıp almadığını görebilirsiniz. Ayrıca alert(), complete geri çağrılması için kesinlikle çağrılması gereken bir tane daha koyabilirsiniz .


Cevabın için teşekkürler. Başarı olayında uyarı denedi ama işe yaramadı. Firefox için kundakçı addon var ve bu yüzden orada hiçbir sorunları başarılı (200 OK) yanıt alır .. Ben herhangi bir hata için benim php dosyasında denilen bir die işlevi var ve ben kundakçı kontrol, doğru tepki gösterir. ne demek istiyorsun "Ayrıca tam olarak geri çağrı, başka bir uyarı () koyabilirsiniz kesinlikle çağrılmalıdır." ?? Hızlı bir cevap için çok teşekkürler
codingbbq

2
uyarıyı görmüyorsanız, successbu bir başarı değildir. Yanıt 200 TAMAM olduğundan, Tatu'nun yanıtı makul görünüyor, ancak daha fazla sorun giderme için, completebir isteğin başarılı olup olmadığına bakılmaksızın her zaman çağrılan başka bir olay kullanabilirsiniz ( successyalnızca istek başarılı olursa olur). complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund

3

Aynı problemim vardı. çünkü veri döndüren veri türü javascriptbekliyoruz json. ancak php'nizde echo veya print kullanıyorsanız bu durum ortaya çıkar. veri döndürmek için echoişlevi kullanırsanız php, sadece dataType : "json"oldukça iyi çalışmayı kaldırın .


2

Geçerli JSON döndürüyordum, "tam" geri aramımda 200 yanıt alıyordum ve bunu krom ağ konsolunda görebiliyordum ... AMA belirtmemiştim

dataType: "json"

bir kez yaptım, "kabul edilen cevap" ın aksine, bu aslında sorunu çözdü.


1

XML sunucuda php web sayfasına geri taşımak için XML kullanıyorum ve aynı davranış vardı.

Benim durumumun nedeni, kapanış etiketinin açılış etiketiyle eşleşmemesiydi.

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

1

Magento kullanıcı parolasını kurtarmak için bir ajax işlevi kullanarak bu sorun vardı. Başarı olayı başlatılmadı, sonra iki hata olduğunu fark ettim:

  1. Sonuç JSON biçiminde döndürülmüyordu
  2. Bir diziyi JSON biçimine dönüştürmeye çalışıyordum, ancak bu dizi utf olmayan karakterler vardı

Bu nedenle, dönen diziyi kodlamak için json_eoncde () kullanmaya çalıştığımda, dizinlerinden biri utf olmayan karakterlere sahip olduğu için işlev işe yaramadı, çoğu Brezilyalı Portekizce kelimelerle vurgulandı.


1

Denetleyiciden dize döndürmeye çalıştım ama neden ajax'ın başarısında hata bloğuna dönen kontrol

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);
    }
});

1

Başarı yanıtı döndürmeyen denetleyiciyi sorgularken, denetleyicimin başarı iletisini döndürmek için değiştirildiği zaman aynı sorunla karşılaştım. Lavalit çerçeve kullanarak not. önce:

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()
        }

bu benim için çalıştı


1

Ben bu şekilde çözdüm aynı sorun vardı: Benim ajax:

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');
                }
            }
        })

Tamam. Sorun json değil, sadece php yanıtı ile ilgili. Önceki: benim php yanıtı:

echo 'item';

Şimdi:

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

Şimdi başarım. PS. Bir sorun varsa üzgünüm ama bu forumdaki ilk yorumum :)


0

benim durumumda bu sunucu tarafında hata oldu ve bu nedenle bir html dönüyordu

wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");

0

'Hata' geri aramasını ('başarı' gibi) şu şekilde ekleyin:

$.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);
   }
});

Yani, benim durumumda konsolda gördüm:

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

0

Hem Başarı VE Hata geri çağrısını bildirmeniz gerekir. Ekleme

error: function(err) {...} 

sorunu çözmeli


-4

Başarı geri arama iki argüman alır:

success: function (data, textStatus) { }

Ayrıca submit1.php, uygun içerik türü üstbilgisini ayarladığından emin olun :application/json


Cevabın için teşekkürler. Bunu jquery ajax belgeselinde okudum ama çalışmam için bir sonraki adımımın ne olacağını anlayamıyorum ... beni doğru yöne yönlendirebilirseniz sevinirim. Ayrıca benim php dosyasında bazı belirli kod olması gerektiği anlamına mı geliyor? çok teşekkürler
codingbbq

7
successiki argüman alan gerçek , soru ile tamamen alakasız görünmektedir. Herhangi bir miktarda parametreyi bir javascript işlevine, bildiriminde kaç tane kabul ettiğine bakılmaksızın geçirebilirsiniz, bu nedenle bu sorunların nedeni kesinlikle bu değildir ve değerlerin hiçbiri dataveya textStatusbaşarı geri çağrısında kullanılmadığından, onları işlevde beyan etmek için iyi bir neden değildir.
David Hedlund

Ve JSON verilerinin doğru içerik türü başlığına sahip olması gerekmez, sadece JSON biçiminde olması gerekir.
Tatu Ulmanen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.